INHOUDSOPGAWE:

Seriële kommunikasie van PIC MCU en Python: 5 stappe
Seriële kommunikasie van PIC MCU en Python: 5 stappe

Video: Seriële kommunikasie van PIC MCU en Python: 5 stappe

Video: Seriële kommunikasie van PIC MCU en Python: 5 stappe
Video: BTT Manta M8P v2 - CM4 with eMMC 2024, November
Anonim
PIC MCU en Python Serial Communication
PIC MCU en Python Serial Communication
PIC MCU en Python Serial Communication
PIC MCU en Python Serial Communication

Hallo ouens! In hierdie projek sal ek probeer om my eksperimente oor PIC MCU en Python seriële kommunikasie te verduidelik. Op die internet is daar baie tutoriale en video's oor hoe om met PIC MCU via virtuele terminale te kommunikeer, wat baie handig is. In my hoofprojek is een van die vereistes egter om reële kommunikasie tussen PIC MCU en Python tot stand te bring, wat ek nie 'n goeie handleiding kon vind nie. So, kom ons begin:)

Stap 1: Wat het ons nodig?

Wat het ons nodig?
Wat het ons nodig?
Wat het ons nodig?
Wat het ons nodig?

Dus, laat ons eers kyk wat ons nodig het. Wat hardeware betref:

  • Sekerlik, PIC MCU, wat in my geval PIC16f877a is (u het nie die bord nodig nie. Dit is om vuil verbindings te vereenvoudig)
  • USB na TTL -omskakelaar om met PIC MCU via USB -poort te kommunikeer deur TX- en RX -penne te gebruik.
  • MCU -programmeerder, wat in my geval K150 -programmeerder is, maar u kan PicKit 2, 3 of enigiets anders gebruik.
  • En laastens 'n rekenaar:)

Wat sagteware betref:

  • 'N IDE om python -kode te skryf, wat in my geval Pycharm is, maar u kan ook gewone Python IDE gebruik.
  • 'N Omgewing vir die programmering van die MCU, wat in my geval MPLAB X IDE is met CCS C -samesteller.

Stap 2: Hardewareverbindings

Hardewareverbindings
Hardewareverbindings

Op die foto word aangehegte hardewareverbindings gegee wat tussen PIC MCU en USB TTL -omskakelaar is, soos hieronder:

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

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

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

U hoef nie die VCC -pen van die USB TTL -omskakelaar aan te sluit nie (maar as u wil, kan u dit doen). Hierdie 3 verbindings is redelik genoeg.

Stap 3: Python -sagteware

Kom ons begin sagteware skryf vir die Python -kant wat in ons geval die sender sal wees, want dit stuur die string na die MCU.

import serial #import serial librarydata = '24' #data wat ons data sal stuur = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #send die data

In die eerste plek word die reeksbiblioteek ingevoer om die toekoms daarvan te gebruik. Ons wil 'n voorbeeld van stringdata stuur om in die MCU -kode te bevestig dat ons dit aanvaar het. Ek wil hier een ding opmerk. Daarom het ons '\ 0' by die string gevoeg. Dit is omdat dit aan die MCU -kant onmoontlik is om die snaar heeltemal te lees. Dit word karakter vir karakter gelees. Ons wil dus die einde van die snaar ken om op te hou lees. Ons voeg dus '\ 0' by die string wat die einde van die string aandui. Dan maak ons verbinding met die poort wat aan die MCU gekoppel is. U kan die poort bepaal deur in 'Toestelbestuurder' te soek. Wees dus versigtig dat u op dieselfde poort is. Ons stuur immers die data na die MCU. ".encode ()" moet by die stringdata gevoeg word om dit na die ontvanger te kan stuur.

Stap 4: Microcontroller sagteware

Laat ons dus ons kode vir MCU sien. Eerstens wil ek u die 'config.h' -lêer aan die binnekant wys, maar ek het dit eenvoudig gedoen. Verander hier net die frekwensie van u MCU.

#ifndef CONFIG_H#definieer CONFIG_H

#insluit

#toestel ADC = 16

#FUSES NOWDT // Geen waghondtimer nie

#VEILIGHEDE NOBROWNOUT // Geen terugbranding nie

#gebruiksvertraging (kristal = 6000000)

Kom ons kyk nou na die hoofkode:

#insluit

#insluit

#gebruik rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, pariteit = N, stop = 1)

#definieer LED_RED PIN_D0

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

#int_rda

ongeldig serial_communication_interrupt () {disable_interrupts (int_rda); ongetekende int i = 0; inp = getc (); putc (inp); terwyl (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); ek ++; }}

void main (void) {

stel_tris_d (0x00); uitvoer_d (0xFF); enable_interrupts (GLOBAL); terwyl (1) {enable_interrupts (int_rda); if (strcmp (buffer, cmp_) == 0) output_low (LED_RED); anders output_high (LED_RED); }}

Aan die begin bevat ons stringbiblioteek, wat ons sal help in stringbewerkings, wat in ons geval stringvergelyking (strcmp) is. Ons doel met hierdie kode is dus om die LED aan te skakel wat aan die pen D0 gekoppel is as die oordraagbare waarde dieselfde is as ons gegewe waarde, wat "cmp_" is wat gelyk is aan "24".

In die eerste plek aktiveer ons interrupt "rda" wat onderbrekings sal veroorsaak wanneer data oorgedra word.

Tweedens, kom ons kyk na die ISR (onderbreek diensroetine), wat 'serial_communication_interrupt' genoem word. Binne -in skakel ons eers die interrupt -vlag uit om die ontvangde waarde te lees en verder te onderbreek. Daarna lees ons die string karakter vir karakter totdat ons '\ 0' bereik. Terwyl ons binne die string lees, skryf ons ook elke char na die buffer om die string te ontvang.

Aan die einde kom ons weer binne. Hier vergelyk ons ons bufferstring wat string en cmp_ string ontvang, om te sien of ons die string korrek kry. As hulle gelyk is, skakel ek LED aan, anders skakel ek af.*

*In die kode het ek omgekeer omdat my bord die waardes van die D -poort omkeer. Verander dit in u kode na:

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

Stel dit ten slotte saam en laai dit op na u MCU en voer dan kode in Python uit. U moet die LED sien aanskakel.

Stap 5: Gevolgtrekking

Ons het een taak suksesvol voltooi. Ek hoop dat dit vir u nuttig sal wees. As u enige vrae het, moet asseblief nie huiwer om dit te vra nie:) Tot die volgende projek.

Aanbeveel: