Innehållsförteckning:

PIC MCU och Python seriell kommunikation: 5 steg
PIC MCU och Python seriell kommunikation: 5 steg

Video: PIC MCU och Python seriell kommunikation: 5 steg

Video: PIC MCU och Python seriell kommunikation: 5 steg
Video: Serial Port Monitor Code Example - Python with Tkinter 2024, Juli
Anonim
PIC MCU och Python seriell kommunikation
PIC MCU och Python seriell kommunikation
PIC MCU och Python seriell kommunikation
PIC MCU och Python seriell kommunikation

Hej grabbar! I detta projekt kommer jag att försöka förklara mina experiment med PIC MCU och Python seriell kommunikation. På internet finns det många självstudier och videor om hur man kommunicerar med PIC MCU över virtuell terminal vilket är mycket användbart. Men i mitt huvudprojekt är ett av kraven att upprätta seriell kommunikation mellan PIC MCU och Python som jag inte kunde hitta bra handledning. Så låt oss börja:)

Steg 1: Vad behöver vi?

Vad behöver vi?
Vad behöver vi?
Vad behöver vi?
Vad behöver vi?

Så låt oss först och främst se vad vi behöver. När det gäller hårdvara:

  • Visst, PIC MCU som är i mitt fall PIC16f877a (Du behöver inte det kortet. Detta för att förenkla några smutsiga anslutningar)
  • USB till TTL -omvandlare för att kommunicera med PIC MCU via USB -port med TX- och RX -stift.
  • MCU programmerare som är i mitt fall K150 programmerare, men du kan använda PicKit 2, 3 eller något annat.
  • Och slutligen en dator:)

När det gäller programvara:

  • En IDE för att skriva pythonkod som är i mitt fall Pycharm, men du kan också använda vanlig Python IDE.
  • En miljö för programmering av MCU som i mitt fall är MPLAB X IDE med CCS C -kompilator.

Steg 2: Hårdvaruanslutningar

Hårdvaruanslutningar
Hårdvaruanslutningar

På bilden ges bifogade hårdvaruanslutningar mellan PIC MCU och USB TTL -omvandlare enligt nedan:

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

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

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

Du behöver inte ansluta VCC -stift på USB TTL -omvandlaren (men om du vill kan du göra det). Dessa 3 anslutningar är tillräckligt.

Steg 3: Python -programvara

Låt oss börja skriva programvara för Python -sidan som kommer att vara sändare i vårt fall, eftersom den skickar strängen till MCU.

importera seriell #import seriell biblioteksdata = '24' #data som vi skickar data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect till porten ser.write (a.encode ()) #sänd data

Först och främst importeras det seriella biblioteket för att kunna använda dess framtid. Vi vill skicka ett exempel på strängdata för att bekräfta i MCU -koden att vi accepterade det. Jag vill här notera en sak. Det är därför vi har lagt till '\ 0' i strängen. Detta beror på att det på MCU -sidan är omöjligt att läsa strängen helt. Det läses tecken för karaktär. Så vi vill veta slutet på strängen för att sluta läsa. Så, vi lägger till '\ 0' i strängen som anger slutet av strängen. Sedan ansluter vi till porten som är ansluten till MCU. Du kan bestämma den porten genom att söka i "Enhetshanteraren". Så var försiktig så att du befinner dig på samma port. När allt kommer omkring skickar vi data till MCU. ".encode ()" bör läggas till strängdata för att kunna skicka den till mottagaren.

Steg 4: Mikrokontrollerprogramvara

Så, låt oss se vår kod för MCU. Först och främst vill jag visa dig "config.h" -filen som inte krävs, men jag gjorde det för enkelhetens skull. Här kan du bara ändra frekvensen för din MCU.

#ifndef CONFIG_H#definiera CONFIG_H

#omfatta

#enhet ADC = 16

#FUSES NOWDT // No Watch Dog Timer

#FUSES NOBROWNOUT // No brownout reset #FUSES NOLVP // No low voltage prgming, B3 (PIC16) or B5 (PIC18) used for I/O

#användningsfördröjning (kristall = 6000000)

Låt oss nu se huvudkoden:

#omfatta

#omfatta

#använd rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, paritet = N, stopp = 1)

#define LED_RED PIN_D0

röding inp; char cmp _ = "24"; rödingbuffert [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); osignerad int i = 0; inp = getc (); putc (inp); medan (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); medan (1) {enable_interrupts (int_rda); if (strcmp (buffert, cmp_) == 0) output_low (LED_RED); annars output_high (LED_RED); }}

I början inkluderar vi strängbibliotek som vi kommer att vara till hjälp vid strängoperationer som i vårt fall är strängjämförelse (strcmp). Så vårt syfte med denna kod är att slå på lysdioden som är ansluten till stiftet D0 om det överförda värdet är detsamma som vårt givna värde som är "cmp_" är lika med "24".

Först och främst aktiverar vi avbrott "rda" vilket kommer att orsaka avbrott när data överförs.

För det andra, låt oss titta inuti ISR (interrupt service routine) som kallas "serial_communication_interrupt". Inuti inaktiverar vi först avbrottsflagga för att läsa det mottagna värdet och orsaka avbrott ytterligare. Efter det läser vi strängen tecken för tecken tills vi når '\ 0'. När vi läser inuti strängen skriver vi också varje char till bufferten för att få mottagen sträng.

På slutet kommer vi igen in medan. Här jämför vi vår buffertsträng som tas emot string och cmp_ string för att se om vi får strängen korrekt. Om de är lika så slår jag på led, annars stänger jag av.*

*I koden backade jag eftersom mitt kort inverterar D -portens pinvärden. Ändra den i din kod till:

if (strcmp (buffert, cmp_) == 0) output_high (LED_RED); annars output_low (LED_RED);

Slutligen kompilera den och ladda upp till din MCU och kör sedan koden i Python. Du borde se LED slå på.

Steg 5: Slutsats

Vi har slutfört en uppgift framgångsrikt. Jag hoppas att det kommer att vara användbart för dig. Om du har några frågor, tveka inte att fråga:) Fram till nästa projekt.

Rekommenderad: