- Requisits:
- Programació del microcontrolador PIC per a la comunicació UART:
- Simulant el nostre programa:
- Configuració i prova de maquinari de la sortida:
En aquest tutorial aprenem a habilitar la comunicació UART amb el microcontrolador PIC i a transferir dades des del vostre ordinador i des del vostre ordinador. Fins ara, hem cobert tots els mòduls bàsics com ADC, temporitzadors, PWM i també hem après a la interfície de pantalles LCD i pantalles de 7 segments. Ara, equiparem el nostre jo amb una nova eina de comunicació anomenada UART, àmpliament utilitzada en la majoria dels projectes de microcontroladors. Consulteu aquí els nostres tutorials complets de microcontroladors PIC amb MPLAB i XC8.
Aquí hem utilitzat el MCU PIC16F877A, que té un mòdul anomenat "Receptor i transmissor asíncron síncron universal adreçable" conegut en breu com USART. USART és un sistema de comunicació de dos fils en el qual les dades flueixen en sèrie. USART també és una comunicació full-duplex, que permet enviar i rebre dades alhora que es poden utilitzar per comunicar-se amb dispositius perifèrics, com ara terminals CRT i ordinadors personals.
L' USART es pot configurar en els modes següents:
- Asíncron (full-duplex)
- Síncron - Mestre (semidúplex)
- Síncron - Esclau (semidúplex)
També hi ha dos modes diferents: el mode de 8 i el de 9 bits, en aquest tutorial configurarem el mòdul USART perquè funcioni en mode asíncron amb sistema de comunicació de 8 bits, ja que és el tipus de comunicació més utilitzat. Com que és asíncron, no necessita enviar senyal de rellotge junt amb els senyals de dades. UART utilitza dues línies de dades per enviar (Tx) i rebre (Rx) dades. El sòl dels dos dispositius també s’hauria de fer comú. Aquest tipus de comunicació no comparteix un rellotge comú, per la qual cosa és molt important que el sistema funcioni amb un terreny comú.

Al final d'aquest tutorial, podreu establir una comunicació (UART) entre l'ordinador i el microcontrolador PIC i canviar un LED a la placa PIC des del portàtil. L'estat del LED s'enviarà al vostre ordinador portàtil des de la MCU PIC. Provarem la sortida mitjançant Hyper Terminal a l’ordinador. El vídeo detallat també es proporciona al final d’aquest tutorial.
Requisits:
Maquinari:
- PIC16F877A Tauler de perfils
- Mòdul convertidor RS232 a USB
- Ordinador
- Programador PICkit 3
Programari:
- MPLABX
- HyperTerminal
Es necessita un convertidor RS232 a USB per convertir les dades de sèrie en un format llegible per ordinador. Hi ha maneres de dissenyar el vostre propi circuit en lloc de comprar el vostre propi mòdul, però no són fiables ja que estan sotmesos a sorolls. El que estem utilitzant es mostra a continuació

Nota: Per a cada convertidor RS232 a USB caldria instal·lar un controlador especial; la majoria d'ells s'haurien d'instal·lar automàticament tan bon punt connecteu el dispositiu. Però, si no es relaxa !!! Utilitzeu la secció de comentaris i us ajudaré.
Programació del microcontrolador PIC per a la comunicació UART:
Com tots els mòduls (ADC, temporitzador, PWM), també hem d’inicialitzar el mòdul USART de la nostra MCU PIC16F877A i indicar-li que funcioni en mode de comunicació UART de 8 bits. Definim els bits de configuració i comencem amb la funció d'inicialització UART.
Inicialització del mòdul UART del microcontrolador PIC:
Els pins Tx i Rx estan físicament presents als pins RC6 i RC7. Segons el full de dades, declarem TX com a sortida i RX com a entrada.
// **** Configuració de pins d'E / S per UART **** // TRISC6 = 0; // Pin PIN configurat com a sortida TRISC7 = 1; // Conjunt de pins RX com a entrada // ________ Conjunts de pins d'E / S __________ //
Ara s’ha d’establir la velocitat en bauds. La velocitat en bauds és la velocitat a la qual es transfereix la informació en un canal de comunicació. Aquest pot ser un dels molts valors per defecte, però en aquest programa estem utilitzant 9600, ja que és la velocitat de transmissió més utilitzada.
/ ** Inicialitzeu el registre SPBRG per a la velocitat de transmissions necessària i configureu BRGH per a velocitat de transmissió ràpida ** / SPBRG = ((_XTAL_FREQ / 16) / Taxa de transmissió) - 1; BRGH = 1; // per a velocitat de transmissió elevada // _________ Finalització de la configuració de velocitat de transmissió _________ //
El valor de la velocitat en bauds s’ha d’establir mitjançant el registre SPBRG; el valor depèn del valor de la freqüència de cristall extern; les fórmules per calcular la velocitat en bauds es mostren a continuació:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
El bit BRGH s'ha d'elevar per permetre la velocitat de bits d'alta velocitat. Segons el full de dades (pàgina 13), sempre és avantatjós habilitar-lo, ja que pot eliminar els errors durant la comunicació.
Com s'ha dit anteriorment, treballarem en mode asíncron, per tant, el bit SYNC s'hauria de fer zero i el bit SPEM s'hauria d'elevar per habilitar els pins sèrie (TRISC6 i TRICSC5)
// **** Activa el port sèrie asíncron ******* // SYNC = 0; // SPEN asíncron = 1; // Habilita els pins del port sèrie // _____ El port sèrie asíncron està habilitat _______ //
En aquest tutorial enviarem i rebrem dades entre MCU i ordinador, de manera que hem d’ habilitar els bits TXEN i CREN.
// ** Ens preparem per a la transmissió i recepció ** // TXEN = 1; // habilitar la transmissió CREN = 1; // habilitar la recepció // __ El mòdul UART està preparat per a la transmissió i recepció __ //
Els bits TX9 i RX9 s’han de posar a zero perquè funcionem en mode de 8 bits. Si cal establir una alta fiabilitat, es pot seleccionar el mode de 9 bits.
// ** Seleccioneu el mode de 8 bits ** // TX9 = 0; // Recepció de 8 bits seleccionada RX9 = 0; // Mode de recepció de 8 bits seleccionat // __ Mode de 8 bits seleccionat __ //
Amb això, completem la configuració d'inicialització. i està llest per al seu funcionament.
Transmissió de dades mitjançant UART:
La funció següent es pot utilitzar per transmetre dades a través del mòdul UART:
// ** Funció per enviar un byte de data a UART ** // void UART_send_char (char bt) {while (! TXIF); // manteniu el programa fins que el buffer TX sigui lliure TXREG = bt; // Carregueu la memòria intermèdia del transmissor amb el valor rebut} // _____________ Fi de la funció ________________ //
Un cop inicialitzat el mòdul, qualsevol valor carregat al registre TXREG es transmetrà a través de UART, però la transmissió es pot superposar. Per tant, sempre hem de comprovar si hi ha el senyal d'interrupció de transmissió TXIF. Només si aquest bit és baix, podem continuar amb el següent bit per a la transmissió, en cas contrari, hauríem d'esperar que aquest indicador baixi.
Tanmateix, la funció anterior només es pot utilitzar per enviar només un byte de dades, per enviar una cadena completa s'ha d'utilitzar la funció següent
// ** Funció per convertir la cadena a bytes ** // void UART_send_string (char * st_pt) {while (* st_pt) // si hi ha un char UART_send_char (* st_pt ++); // processar-lo com a dades de bytes} // ___________ Fi de la funció ______________ //
Aquesta funció pot ser una mica complicada d’entendre, ja que té indicadors, però confieu en mi, els indicadors són meravellosos i faciliten la programació i aquest és un bon exemple de la mateixa.
Com podeu observar, hem tornat a cridar UART_send_char (), però ara dins del bucle while. Hem dividit la cadena en caràcters individuals, cada vegada que es crida aquesta funció, s'enviarà un caràcter al TXREG i es transmetrà.
Recepció de dades mitjançant UART:
La funció següent es pot utilitzar per rebre dades del mòdul UART:
// ** Funció per obtenir un byte de data de UART ** // char UART_get_char () {if (OERR) // comproveu si hi ha un error {CREN = 0; // Si hi ha un error -> Restableix CREN = 1; // If error -> Reset} while (! RCIF); // Mantingueu el programa fins que la memòria intermèdia RX sigui lliure de retorn RCREG; // rebre el valor i enviar-lo a la funció principal} // _____________ Fi de la funció ________________ //
Quan el mòdul UART rep una dada, la recull i la desa al registre RCREG. Simplement podem transferir el valor a qualsevol variable i utilitzar-lo. Però és possible que hi hagi un error de superposició o que l'usuari estigui enviant dades contínuament i encara no les hem transferit a una variable.
En aquest cas, el bit de senyal de recepció RCIF es rescata. Aquest bit disminuirà sempre que es rebin dades i encara no es processin. Per tant, l’utilitzem al bucle while creant un retard per retenir el programa fins que tractem aquest valor.
Commutació de LED mitjançant el mòdul UART del microcontrolador PIC:
Ara anem a la part final del programa, la funció void main (void) , on canviarem un LED a través de l’ordinador mitjançant la comunicació UART entre PIC i ordinador.
Quan enviem un caràcter "1" (des de l'ordinador), el LED s'encendrà i el missatge d'estat "LED VERMELL -> ON" es tornarà a enviar (des de PIC MCU) a l'ordinador.
De la mateixa manera, enviem un caràcter “0” (des de l’ordinador), el LED s’apagarà i el missatge d’estat “LED VERMELL -> APAGAT” es tornarà a enviar (des de PIC MCU) a l’ordinador.
while (1) // Bucle infinit {get_value = UART_get_char (); if (get_value == '1') // Si l'usuari envia "1" {RB3 = 1; // Enceneu el LED UART_send_string ("LED VERMELL -> ACTIVAT"); // Envieu una notificació a l'ordinador UART_send_char (10); // El valor ASCII 10 s'utilitza per a la devolució del carro (per imprimir en una nova línia)} si (get_value == '0') // Si l'usuari envia "0" {RB3 = 0; // Apagueu el LED UART_send_string ("VERMELL -> APAGAT"); // Enviar notificació a l’ordinador UART_send_char (10); // El valor ASCII 10 s’utilitza per a la devolució del carro (per imprimir en una nova línia)}}
Simulant el nostre programa:
Com de costum, simulem el nostre programa mitjançant proteus i descobrim si funciona com s’esperava.

La imatge anterior mostra un terminal virtual en què mostra un missatge de benvinguda i l’estat del LED. Es pot notar que el LED de color vermell està connectat al pin RB3. El treball detallat de la simulació es pot trobar al vídeo al final.
Configuració i prova de maquinari de la sortida:
La connexió d’aquest circuit és realment senzilla, fem servir la nostra placa PIC Perf i connectem els tres cables al convertidor RS232 a USB i connectem el mòdul al nostre ordinador mitjançant un cable de dades USB, tal com es mostra a continuació.


A continuació, instal·lem l’ aplicació Hyper Terminal (descarregueu-la des d’aquí) i l’obrim. Hauria de mostrar alguna cosa així

Ara obriu el Gestor de dispositius a l'ordinador i comproveu a quin port de connexió està connectat el vostre mòdul; el meu està connectat al port COM 17, tal com es mostra a continuació

Nota: el nom del port COM del vostre mòdul pot canviar segons el vostre proveïdor, no és un problema.
Ara torneu a l'aplicació Hyper Terminal i aneu a Configuració -> Configuració del port o premeu Alt + C, per obtenir el següent quadre emergent i seleccionar el port desitjat (COM17 en el meu cas) a la finestra emergent i fer clic a connectar.

Un cop establerta la connexió, enceneu la vostra placa de perfils PIC i hauríeu de veure alguna cosa semblant a continuació

Mantingueu el cursor a la finestra d’ordres i introduïu 1 i premeu Retorn. El LED s’encendrà i l’estat es mostrarà com es mostra a continuació.

De la mateixa manera, mantingueu el cursor a la finestra d'ordres i introduïu 0 i premeu Retorn. El LED s’apagarà i es mostrarà l’estat tal com es mostra a continuació.

A continuació es mostra el codi complet i el vídeo detallat, que mostrarà com el LED respon en temps real per a "1" i "0".
Ja està, nois, hem interficat PIC UART amb el nostre ordinador i hem transferit les dades per canviar el LED mitjançant el terminal Hyper. Espero que hagueu entès, si no, utilitzeu la secció de comentaris per fer la vostra consulta. Al nostre següent tutorial tornarem a utilitzar UART, però el farem més interessant mitjançant un mòdul Bluetooth i difondrem les dades per antena.
Comproveu també la comunicació UART entre dos microcontroladors ATmega8 i la comunicació UART entre ATmega8 i Arduino Uno.
