Obsah:

Sériová komunikácia PIC MCU a Python: 5 krokov
Sériová komunikácia PIC MCU a Python: 5 krokov

Video: Sériová komunikácia PIC MCU a Python: 5 krokov

Video: Sériová komunikácia PIC MCU a Python: 5 krokov
Video: Serial Port Monitor Code Example - Python with Tkinter 2024, December
Anonim
Sériová komunikácia PIC MCU a Python
Sériová komunikácia PIC MCU a Python
Sériová komunikácia PIC MCU a Python
Sériová komunikácia PIC MCU a Python

Ahojte chlapi! V tomto projekte sa pokúsim vysvetliť svoje experimenty so sériovou komunikáciou PIC MCU a Python. Cez internet existuje mnoho návodov a videí o tom, ako komunikovať s PIC MCU prostredníctvom virtuálneho terminálu, čo je veľmi užitočné. V mojom hlavnom projekte je však jednou z požiadaviek vytvoriť sériovú komunikáciu medzi PIC MCU a Python, pre ktorý som nenašiel dobrý návod. Začnime teda:)

Krok 1: Čo potrebujeme?

Čo potrebujeme?
Čo potrebujeme?
Čo potrebujeme?
Čo potrebujeme?

V prvom rade sa teda pozrime, čo potrebujeme. Pokiaľ ide o hardvér:

  • Iste, PIC MCU, čo je v mojom prípade PIC16f877a (Túto dosku nepotrebujete. Toto je kvôli zjednodušeniu niektorých špinavých spojení)
  • Prevodník USB na TTL na komunikáciu s PIC MCU cez port USB pomocou pinov TX a RX.
  • Programátor MCU, čo je v mojom prípade programátor K150, ale môžete použiť PicKit 2, 3 alebo čokoľvek iné.
  • A konečne počítač:)

Pokiaľ ide o softvér:

  • IDE na zápis kódu pythonu, čo je v mojom prípade Pycharm, ale môžete použiť aj bežné Python IDE.
  • Prostredie na programovanie MCU, čo je v mojom prípade MPLAB X IDE s kompilátorom CCS C.

Krok 2: Hardvérové pripojenia

Hardvérové pripojenia
Hardvérové pripojenia

Na obrázku sú uvedené hardvérové pripojenia, ktoré sú medzi prevodníkom PIC MCU a USB TTL, ako je uvedené nižšie:

RC7 (RX) ------------- TXD

RC6 (TX) ------------- RXD

GND -------------- GND

Nie je potrebné pripojiť pin VCC prevodníka USB TTL (Ak však chcete, môžete to urobiť). Tieto 3 spojenia úplne stačia.

Krok 3: Softvér Python

Začnime písať softvér pre stranu Pythonu, ktorý bude v našom prípade vysielačom, pretože ten odošle reťazec do MCU.

import serial serial #import serial librarydata = '24' #data that we will send data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #odoslať údaje

Najprv sa importuje sériová knižnica, aby sa využila jej budúcnosť. Chceme poslať ukážkové reťazcové údaje, aby sme v kóde MCU potvrdili, že sme ich prijali. Tu chcem poznamenať jednu vec. Preto sme do reťazca pridali '\ 0'. Dôvodom je, že na strane MCU nie je možné reťazec úplne prečítať. Číta sa to znak po znaku. Chceme teda vedieť koniec reťazca, aby sme prestali čítať. Do reťazca teda pridáme „\ 0“, ktorý označuje koniec reťazca. Potom sa pripojíme k portu, ktorý je pripojený k MCU. Tento port môžete určiť vyhľadaním v „Správcovi zariadení“. Dávajte si preto pozor, aby ste boli na rovnakom porte. Koniec koncov, odosielame údaje do MCU. „.encode ()“by malo byť pridané k reťazcovým údajom, aby bolo možné ich odoslať príjemcovi.

Krok 4: Softvér mikrokontroléra

Pozrime sa teda na náš kód pre MCU. Najprv vám chcem ukázať súbor „config.h“, ktorý nie je potrebný, ale urobil som to kvôli jednoduchosti. Tu stačí zmeniť frekvenciu vášho MCU.

#ifndef CONFIG_H#definujte CONFIG_H

#zahrnúť

#zariadenie ADC = 16

#FUSES NOWDT // Časovač strážneho psa

#FUSES NOBROWNOUT // Žiadny reset vypnutia #FUSES NOLVP // Žiadne prgmingy nízkeho napätia, B3 (PIC16) alebo B5 (PIC18) používané pre I/O

#oneskorenie použitia (kryštál = 60 000 000)

Teraz sa pozrime na hlavný kód:

#zahrnúť

#zahrnúť

#use rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, parita = N, stop = 1)

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; char buffer [3];

#int_rda

neplatné serial_communication_interrupt () {disable_interrupts (int_rda); bez znamienka int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBÁLNE); while (1) {enable_interrupts (int_rda); if (strcmp (buffer, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

Na začiatku uvádzame knižnicu reťazcov, ktorá nám bude nápomocná pri operáciách reťazcov, čo je v našom prípade operácia porovnávania reťazcov (strcmp). Našim účelom v tomto kóde je teda zapnúť LED pripojenú na pin D0, ak je prenášaná hodnota rovnaká ako naša daná hodnota, ktorá je „cmp_“rovná sa „24“.

Najprv povolíme prerušenie „rda“, ktoré spôsobí prerušenie pri prenose údajov.

Za druhé, pozrime sa do vnútra ISR (rutina služby prerušenia), ktorá sa nazýva „serial_communication_interrupt“. Vo vnútri najskôr deaktivujeme príznak prerušenia, aby sme mohli prečítať prijatú hodnotu a spôsobiť ďalšie prerušenie. Potom prečítame reťazec po znakoch, kým nedosiahneme '\ 0'. Pri čítaní vo vnútri reťazca tiež zapisujeme každý znak do vyrovnávacej pamäte, aby sme dostali prijatý reťazec.

Na konci opäť prídeme dovnútra. Tu porovnáme náš reťazec vyrovnávacej pamäte, ktorý je prijatým reťazcom, a reťazec cmp_, aby sme zistili, či reťazec dostaneme správne. Ak sú si rovné, zapnem LED, inak vypnem.*

*V kóde som obrátil, pretože moja doska invertuje hodnoty pinov portu D. Vo svojom kóde ho zmeňte na:

if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); else output_low (LED_RED);

Nakoniec ho skompilovajte a nahrajte do svojho MCU a potom spustite kód v Pythone. Mali by ste vidieť zapnuté LED.

Krok 5: Záver

Úspešne sme dokončili jednu úlohu. Dúfam, že to bude pre vás užitočné. Ak máte akékoľvek otázky, neváhajte sa ich opýtať:) Do ďalšieho projektu.

Odporúča: