Departament de Microelectrònica i Sistemes Electrònics
AVR i FONAMENTS DE COMPUTADORS
Enginyeria en Informàtica (ETSE)
Ús de la UART
L’ATmega8 i la comunicació sèrie
Quan es vol mostrar un resultat o mesura que s'obté amb el microcontrolador per la pantalla de l’ordinador enlloc d'haver de realitzar un muntatge amb leds (quan es pot, que no sempre és factible) per un port de sortida, cal establir una comunicació entre el microcontrolador i el PC.
La forma més simple d’establir aquesta comunicació és emprant la comunicació sèrie, molt simple, entre el microcontrolador i l’hyperterminal en l’ordinador. El protocol sèrie és la primera forma de comunicació que es va establir per transmetre dades entre dos terminals. És, per tant, un mètode molt simple. També és per aquesta simplicitat que avui en dia encara es fa servir en múltiples aplicacions.
Entendre la comunicació sèrie implica entendre no només el funcionament del protocol sèrie, sinó també la mecànica del funcionament i entendre el connexionat i adaptadors de nivell que calen en el seu ús. El document Comunicació RS232 mostra els aspectes més mecànics de la comunicació RS232.
El protocol sèrie RS232 que és el que es fa servir en aquesta comunicació és un estàndard que molts dispositius porten implementat o que es pot trobar en un dispositiu que implementa el protocol anomenat USART (Universal Synchronous and Asynchronous Serial Receiver and Transmitter). En el cas dels microcontroladors ATmega la USART es troba integrada dintre el mateix xip.
Per establir una comunicació RS232 només són estrictament necessaris 3 pins: RxD, que significa línia de recepció, TxD que significa línia de transmissió i GND, que és el terra que s’ha de connectar entre els elements que es comuniquen per unificar terres.
El microcontrolador ATmega8 empra el pin2 (corresponent a PORTD.0) per rebre el senyal sèrie del computador RxD i el pin3 (PORTD.1) com a pin de transmissió TxD. Compta amb aquests noms per què el pin TxD, que és transmissió en el microcontrolador s’ha de connectar al RxD del computador, ja que és el seu pin de recepció; i a la inversa, el pin TxD del computador es connecta al RxD del microcontrolador.
Una segona qüestió a tenir present és l’adaptació de nivells (voltatge) que s’ha de realitzar en la comunicació. Els nivells lògics 0 i 1 estàndard del microcontrolador s’identifiquen amb els valors 0V i 5V, respectivament. Per a l’ordinador, el 0 i 1 lògic solen entendre’s com a valors de 12V i -12V, respectivament. Per tant, quan es realitza una comunicació entre ambdós sistemes cal realitzar una conversió de nivells. La forma més fàcil és emprant un circuit com el MAX232 (implementat per diferents fabricants de circuits integrats).
La figura 1 esquematitza el connexionat que cal fer en el cas del ATmega8. Quan s'empren entorns de desenvolupament sovint ja tenen preparada la sortida sèrie per establir directament la comunicació només connectant el cable sèrie. Si no és el cas, s'ha de preparar la interfísie.Figura 1. Interfísie sèrie emprant un circuit MAX232
Configuració de registres
Un cop realitzada la connexió física entre terminals s’ha de configurar el microcontrolador. La configuració és una mica complexa respecte al que és indispensable per a iniciar-se en la programació del microcontrolador. Però entendre-la i emprar-la dóna grans beneficis.
Per a simplificar, aquí només es nomenen aquells bits de configuració que són indispensables per entendre una transmissió simple de 8 bits, sense paritat, amb 1 bit de stop i a una velocitat de transmissió de 4800 bauds. Si es vol aprofundir i optimitzar el rendiment en la comunicació cal anar als fulls d'especificacions del fabricant.
Els diferents registres sobre els que cal actuar són:
- Registre UDR, registre de dades. És un doble registre, un per transmissió i l’altre per recepció. Només s’empra el bit TXB (d’escriptura), que és bit de transmissió.
- El registre A de control i de status, UCSRA.
· El bit 6, TXC (transmissió completada) indica que el buffer de transmissió és buit.
· El bit 5, UDRE (USART Data Register Empty), indica que el buffer de transmissió pot rebre una nova dada.- El registre B de control i de status, UCSRB.
· El bit 6, TXCIE (TX Complete Interrupt Enable), habilita que es generi una interrupció quan s’ha de transmès la dada (quan TXC és 1).
· El bit 5, UDRIE (USART Data Register Empty Interrupt Enable), habilita la generació d’interrupció quan el bit UDRE és 1.
· El bit 3, TXEN (Transmitter Enable), habilita el transmissor de la USART.- La inicialització del nombre de bits que s’emeten en cada transmissió s’estableix amb els bits
· UCSZ2, que és el bit 2 del registre UCSRB.
· UCSZ1, UCSZ0, que són els bits 2 i 1, respectivament, del registre UCSRC.- Establiment del baud rate. Es fa amb el doble registre UBRR (UBRRH, UBRRL). Cal anar amb compta ja que UBRRH comparteix espai de memòria amb UCSRC. El control es realitza amb el bit URSEL (bit7 de UCSRC).
· UCSZ2, que és el bit 2 del registre UCSRB.
· UCSZ1, UCSZ0, que són els bits 2 i 1, respectivament, del registre UCSRC.Creació d’un programa simple de transmissió de dades
En l'exemple que segueix s'estableix una transmissió: 8 bits, sense paritat, amb 1 bit de stop i velocitat de transmissió de 4800 bauds. Això vol dir que UCSZ(2..0)=(011) i que UBRR=12.
El programa transmissió és un exemple simple de comunicació entre el microcontrolador i el computador: quan es produeix una interrupció en INT0, s'envia la dada que hi ha en el port B. Aquesta simplicitat permet que es pugui comprovar fàcilment el seu funcionament emprant un microcontrolador ATmega8 i l’entrada sèrie de l’ordinador mitjançant un cable sèrie (a través del corresponent MAX232). Donat que només es realitza una transmissió cap al host, la rutina implementada és molt simple.
Configuració de l’hyperterminal
L’hyperterminal és una aplicació de comunicació simple que podem trobar en el menú de programes del Windows sota “Accessoris”. L’hyperterminal s’ha de configurar amb els mateixos paràmetres de comunicació que s’utilitzen en el microcontrolador. Els paràmetres de configuració s'introdueixen en el moment d’entrar a l’hyperterminal.
Un cop a dintre de l'hyperterminal i establerta la comunicació només cal comprovar que el programa funciona com cal. En aquest primer programa hi trobarem un munt de coses a millorar. Però si funciona alguna cosa ja està fet el primer pas!
Molt probablement passi que en la transmissió sovint s'observen salts i caràcters rars. Bé, cal tenir presents dues coses:
- Primer que les dades s'envien 'apretant' un switch i això pot molt fàcilment provocar glitchs i altres atzars.
- Segon, que l'hyperterminal espera rebre codis ASCII dels caràcters que s'envien. I què enviem? Segurament no s'ha mirat si s'està enviant qualsevol codi que no està reflexat en uncaràcter amb codi ASCII conegut...
Evidentment, s'ha de millorar el programa.
Transmissió emprant interrupcions
Un problema del programa de transmissió anterior és que el programa queda pendent de la transmissió de les dades. Cada cop que es vol enviar una nova dada s'ha de fer la comprovació (preguntant sobre UDR) de si la dada anterior ja ha sortit del buffer de transmissió. De no ser així s'atura tot el programa a l'espera de poder carregar la nova dada al buffer de transmissió.
Quan el programa necessita fer poques transmissions respecte a la seva velocitat de procés, el procediment és adequat. Però no en cas contrari. Aleshores es millor emprar la interrupció per transmissió de la dada per carregar la nova dada al buffer.
El programa transInt empra la interrupció com a mitjà per indicar que ja es pot escriure una nova dada al buffer. En aquest cas es traspassa la feina de preguntar si es pot enviar una nova dada a la rutina principal. És aquesta la que ha de decidir, aleshores, si s'espera o fa altres taques.
Recepció emprant interrupcions
De forma similar es configura la recepció de dades a través del port RS232.
El programa recepció mostra una configuració elemental per rebre per la línia RxC0 (PORTE.0 en el microcontrolador ATmega128) les dades que provenen de l'hyperterminal.