Kazalo:

PIC MCU in serijska komunikacija Python: 5 korakov
PIC MCU in serijska komunikacija Python: 5 korakov

Video: PIC MCU in serijska komunikacija Python: 5 korakov

Video: PIC MCU in serijska komunikacija Python: 5 korakov
Video: Serial Port Monitor Code Example - Python with Tkinter 2024, November
Anonim
PIC MCU in serijska komunikacija Python
PIC MCU in serijska komunikacija Python
PIC MCU in serijska komunikacija Python
PIC MCU in serijska komunikacija Python

Zdravo družba! V tem projektu bom poskušal razložiti svoje poskuse o PIC MCU in serijski komunikaciji Python. Po internetu obstaja veliko vadnic in videov o tem, kako komunicirati s PIC MCU prek navideznega terminala, kar je zelo koristno. Vendar pa je v mojem glavnem projektu ena od zahtev vzpostavitev serijske komunikacije med PIC MCU in Pythonom, za katero nisem našel dobre vadnice. Pa začnimo:)

1. korak: Kaj potrebujemo?

Kaj potrebujemo?
Kaj potrebujemo?
Kaj potrebujemo?
Kaj potrebujemo?

Torej, najprej poglejmo, kaj potrebujemo. Kar zadeva strojno opremo:

  • Zagotovo PIC MCU, ki je v mojem primeru PIC16f877a (Te plošče ne potrebujete. To je zato, da poenostavite nekatere umazane povezave)
  • Pretvornik USB v TTL za komunikacijo s PIC MCU prek vrat USB z uporabo zatičev TX in RX.
  • MCU programer, ki je v mojem primeru programer K150, lahko pa uporabite PicKit 2, 3 ali karkoli drugega.
  • In končno računalnik:)

Kar zadeva programsko opremo:

  • IDE za pisanje kode python, ki je v mojem primeru Pycharm, lahko pa uporabite tudi navaden Python IDE.
  • Okolje za programiranje MCU, ki je v mojem primeru MPLAB X IDE s prevajalnikom CCS C.

2. korak: Povezave strojne opreme

Povezave strojne opreme
Povezave strojne opreme

Na sliki so priložene strojne povezave med PIC MCU in pretvornikom USB TTL, kot je prikazano spodaj:

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

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

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

VCC zatiča pretvornika USB TTL vam ni treba priključiti (če želite, lahko to storite). Te 3 povezave so povsem dovolj.

3. korak: programska oprema Python

Začnimo pisati programsko opremo za stran Python, ki bo v našem primeru oddajnik, ker bo niz poslala v MCU.

import serial #import serial librarydata = '24' #data, ki jih bomo poslali data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #pošljite podatke

Najprej se uvozi serijska knjižnica za uporabo njenih terminskih pogodb. Želimo poslati primer niz podatkov, da v kodi MCU potrdimo, da smo jih sprejeli. Tu bi rad opozoril na eno stvar. Zato smo nizu dodali '\ 0'. To je zato, ker na strani MCU ni mogoče popolnoma prebrati niza. Bere se od znaka do znaka. Zato želimo vedeti konec niza, da nehamo brati. Tako nizu dodamo '\ 0', ki označuje konec niza. Nato se povežemo z vrati, ki so priključena na MCU. Ta vrata lahko določite z iskanjem v »Upravitelj naprav«. Zato bodite previdni, da ste na istih vratih. Konec koncev podatke pošljemo v MCU. Podatkom niza je treba dodati ".encode ()", da jih lahko pošljemo prejemniku.

4. korak: Programska oprema za mikrokrmilnik

Torej, poglejmo našo kodo za MCU. Najprej vam želim pokazati datoteko "config.h", ki ni potrebna, vendar sem to poenostavil. Tukaj samo spremenite frekvenco vašega MCU.

#ifndef CONFIG_H#definiraj CONFIG_H

#vključi

#naprava ADC = 16

#FUSES NOWDT // Brez časovnika za stražarske pse

#FUSES NOBROWNOUT // Brez ponastavitve rjavkanja #FUSES NOLVP // Brez nizkonapetostnega prgminga, B3 (PIC16) ali B5 (PIC18), uporabljen za V/I

#zamuda pri uporabi (kristal = 6000000)

Zdaj pa poglejmo glavno kodo:

#vključi

#vključi

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

#define LED_RED PIN_D0

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

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); brez podpisa int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {pufer = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); omogoči_prekinitve (GLOBAL); medtem ko (1) {enable_interrupts (int_rda); if (strcmp (medpomnilnik, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

Na začetku vključimo knjižnico nizov, ki nam bo v pomoč pri nizkih operacijah, ki so v našem primeru operacija primerjave nizov (strcmp). Naš namen v tej kodi je torej vklop LED diode, priključene na pin D0, če je poslana vrednost enaka naši podani vrednosti, ki je "cmp_" enaka "24".

Najprej omogočimo prekinitev "rda", ki bo povzročila prekinitev pri prenosu podatkov.

Drugič, poglejmo v ISR (rutino prekinitvenih storitev), ki se imenuje "serial_communication_interrupt". V notranjosti najprej onemogočimo zastavico prekinitve, da preberemo prejeto vrednost in še dodatno povzročimo prekinitev. Nato beremo niz po znak, dokler ne dosežemo '\ 0'. Med branjem znotraj niza zapisujemo tudi vsak znak v medpomnilnik, da dobimo prejeti niz.

Na koncu spet pridemo noter. Tukaj primerjamo naš niz vmesnega pomnilnika, ki je sprejet, in niz cmp_, da vidimo, ali niz pravilno dobimo. Če so enaki, vklopim LED, sicer ugasnem.*

*V kodi sem naredil obratno, ker moja plošča obrne vrednosti pin vrat D. V kodi ga spremenite v:

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

Na koncu ga prevedite in naložite v svoj MCU in nato zaženite kodo v Pythonu. Videti bi morali, da se LED prižge.

5. korak: Zaključek

Eno nalogo smo uspešno zaključili. Upam, da vam bo to koristilo. Če imate kakršno koli vprašanje, ne oklevajte in vprašajte:) Do naslednjega projekta.

Priporočena: