Taula de continguts:

MCU PIC i comunicació serial Python: 5 passos
MCU PIC i comunicació serial Python: 5 passos

Vídeo: MCU PIC i comunicació serial Python: 5 passos

Vídeo: MCU PIC i comunicació serial Python: 5 passos
Vídeo: Serial Communication In PIC Microcontroller | UART in PIC 2024, Desembre
Anonim
PIC MCU i Python Serial Communication
PIC MCU i Python Serial Communication
PIC MCU i Python Serial Communication
PIC MCU i Python Serial Communication

Hola nois! En aquest projecte intentaré explicar els meus experiments sobre la comunicació serial PIC MCU i Python. A Internet, hi ha molts tutorials i vídeos sobre com comunicar-se amb PIC MCU mitjançant terminal virtual, cosa que és molt útil. Tanmateix, en el meu projecte principal, un dels requisits és establir una comunicació en sèrie entre PIC MCU i Python, cosa que no he pogut trobar amb un bon tutorial. Comencem, doncs,:)

Pas 1: què necessitem?

Què necessitem?
Què necessitem?
Què necessitem?
Què necessitem?

Per tant, primer de tot, vegem què necessitem. Pel que fa al maquinari:

  • Segurament, PIC MCU que és en el meu cas PIC16f877a (no necessiteu aquesta placa. Això és per simplificar algunes connexions brutes)
  • Convertidor d'USB a TTL per comunicar-se amb PIC MCU a través del port USB mitjançant l'ús de pins TX i RX.
  • Programador MCU que és en el meu cas programador K150, però podeu utilitzar PicKit 2, 3 o qualsevol altra cosa.
  • I finalment un ordinador:)

Pel que fa al programari:

  • Un IDE per escriure codi Python que és en el meu cas Pycharm, però també podeu utilitzar un IDE Python normal.
  • Un entorn per programar l'MCU que és en el meu cas MPLAB X IDE amb compilador CCS C.

Pas 2: connexions de maquinari

Connexions de maquinari
Connexions de maquinari

A la imatge es mostren les connexions de maquinari adjuntes que es troben entre el PIC MCU i el convertidor USB TTL com es mostra a continuació:

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

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

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

No cal que connecteu el pin VCC del convertidor USB TTL (però, si voleu, podeu fer-ho). Aquestes 3 connexions són suficients.

Pas 3: programari Python

Comencem a escriure programari per al costat de Python que serà transmissor en el nostre cas, perquè enviarà la cadena a la MCU.

import serial #import serial librarydata = '24' #data que enviarem data = a + '\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #envia les dades

En primer lloc, s’importa la biblioteca en sèrie per tal d’utilitzar el seu futur. Volem enviar un exemple de dades de cadenes per confirmar al codi MCU que les hem acceptat. Aquí vull assenyalar una cosa. És per això que hem afegit "\ 0" a la cadena. Això es deu al fet que, al costat de la MCU, és impossible llegir la cadena totalment. Es llegeix caràcter a personatge. Per tant, volem conèixer el final de la cadena per deixar de llegir. Per tant, afegim '\ 0' a la cadena que indica el final de la cadena. A continuació, ens connectem al port que està connectat a la MCU. Podeu determinar aquest port cercant al Gestor de dispositius. Per tant, aneu amb compte que esteu al mateix port. Al cap i a la fi, enviem les dades a la MCU. S'ha d'afegir ".encode ()" a les dades de la cadena per poder enviar-les al receptor.

Pas 4: programari de microcontrolador

Per tant, vegem el nostre codi per a MCU. Primer de tot, vull mostrar-vos el fitxer "config.h" que no és obligatori, però ho he fet per simplicitat. Aquí només heu de canviar la freqüència de la vostra MCU.

#ifndef CONFIG_H # defineix CONFIG_H

#incloure

#device ADC = 16

#FUSES NOWDT // Sense temporitzador de gossos vigilants

#FUSES NOBROWNOUT // No es restableix l’enfosquiment #FUSES NOLVP // No hi ha programació de baixa tensió, B3 (PIC16) o B5 (PIC18) utilitzats per a E / S

# retard d'ús (cristall = 6000000)

Ara vegem el codi principal:

#incloure

#incloure

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

#define LED_RED PIN_D0

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

#int_rda

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

void main (buit) {

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

Al principi incloem una biblioteca de cadenes que ens serà útil en operacions de cadenes, que en el nostre cas són operacions de comparació de cadenes (strcmp). Per tant, el nostre propòsit en aquest codi és encendre el led connectat al pin D0 si el valor transmès és el mateix que el nostre valor donat que és "cmp_" igual a "24".

En primer lloc, activem la interrupció "rda", que provocarà una interrupció quan es transmetin dades.

En segon lloc, mirem dins de l'ISR (rutina de servei d'interrupció) que s'anomena "interrupció_comunicació_serial". Dins, desactivem primer el senyal d'interrupció per llegir el valor rebut i provocar una interrupció addicional. Després d'això, llegim la cadena caràcter per caràcter fins arribar a "\ 0". Mentre llegim la cadena interior, també escrivim cada caràcter al buffer per obtenir la cadena rebuda.

Al final, tornem a entrar mentre. Aquí comparem la nostra cadena de memòria intermèdia, que és la cadena rebuda i la cadena cmp_, per veure si obtenim la cadena correctament. Si són iguals, encenc el led, en cas contrari ho apago. *

* En el codi he realitzat inversions perquè la meva placa inverteix els valors del pin del port D. Al vostre codi, canvieu-lo per:

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

Finalment, compileu-lo i pengeu-lo a la vostra MCU i, a continuació, executeu codi a Python. Hauríeu de veure encendre el led.

Pas 5: Conclusió

Hem acabat una tasca amb èxit. Espero que us sigui útil. Si teniu alguna pregunta, no dubteu a fer-ho:) Fins al proper projecte.

Recomanat: