Programació en C del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Comunicació sèrie asíncrona

La comunicació sèrie asíncrona permet que dos dispositius es comuniquin entre ells fent servir només una pota (més la de referència GND) si la comunicació és unidireccional o dues si és bidireccional. La transmissió es fa mitjançant les potes:

Pota Correspon a Funció
TX RB7 Transmissió de dades
S'ha de connectar a la pota RX de l'altre dispositiu
RX RB5
AN11
Recepció de dades
S'ha de connectar a la pota TX de l'altre dispositiu
GND VSS Comú o negatiu de l'alimentació

La comunicació asíncrona es fa amb 8 o 9 bits (es pot triar) i sempre amb un bit d'inici (de valor 0) i un bit de final (de valor 1). Aquests bits d'inici i final no formen part de les dades enviades i són gestionats automàticament pel microcontrolador.

Per tal que la recepció funcioni, l'entrada analògica AN11 ha d'estar desactivada (posant a 0 el bit corresponent al registre ANSELH).

Podem provar la comunicació sèrie asíncrona a l'exemple TA.

Velocitat de comunicació

En una comunicació sèrie, la informació es transmet a una determinada velocitat, és a dir un nombre de canvis per segon. La unitat que ho mesura són els bauds o canvis per segon. El microcontrolador no pot generar exactament les velocitats de transmissió d'ús habitual i, per tant, hi haurà un petit error que no sol ser significatiu si es transmeten pocs caràcters seguits. En la configuració de la velocitat hi intervenen dos bits i dos registres. Segons els valors ajustats tindrem diferents velocitats.

El control de la velocitat de comunicació pot ser de 8 o de 16 bits segons si el bit BRG16 del registre BAUDCTL està, respectivament, desactivat o activat. En mode de 8 bits, la velocitat depèn del valor del registre SPBRG. En format de 16 bits els registres SPBRG i SPBRGH formen un valor de 16 bits (on SPBRGH és la part de més pes). El bit BRGH del registre TXSTA també intervé a l'hora d'obtenir la velocitat.

En la taula següent s'indiquen els valors a configurar per a obtenir de manera teòrica les velocitats més habituals amb el rellotge per defecte del microcontrolador (4 MHz). També s'indica la velocitat real obtinguda l'error que es comet. La velocitat de 10417 bauds no és d'ús habitual però l'hem inclòs perquè és una velocitat exacta i, per tant, no té error però probablement no la podrem fer servir per comunicar-nos amb dispositius comercials. Si hi ha més d'una opció per aconseguir el mateix, s'ha marcat en verd la recomanada.

Velocitat desitjada
(bauds)
BRGH
(TXSTA)
BRG16
(BAUDCTL)
SPBRGH
(decimal)
SPBRG
(decimal)
Velocitat real
(bauds)
Error
(%)
300 0 0 - 207 300,48 0,16
0 1 3 64 300,1 0,04
1 1 13 4 300,0 0,01
1200 0 0 - 51 1202 0,16
1 0 - 207 1202 0,16
0 1 0 207 1202 0,16
1 1 3 64 1200 0,04
2400 0 0 - 25 2404 0,16
1 0 - 103 2404 0,16
0 1 0 103 2404 0,16
1 1 1 160 2398 0,08
9600 1 0 - 25 9615 0,16
0 1 0 25 9615 0,16
1 1 0 103 9615 0,16
10417 0 0 - 5 10417 0
1 0 - 23 10417 0
0 1 0 23 10417 0
1 1 0 95 10417 0
19200 1 0 - 12 19230 0,16
0 1 0 12 19230 0,16
1 1 0 51 19231 0,16
57600 1 1 0 16 58824 2,12
115200 1 1 0 8 111111 -3,55

Transmissió de dades

Fem servir la transmissió sèrie per enviar dades a la pantalla sèrie i podem veure-ho a l'exemple PS.

Per activar les comunicacions hem d'activar el bit SPEN del registre RCSTA. Això anul·la el funcionament de RB5, RB7 i AN11. A més d'activar SPEN, però, indicarem que volem transmetre dades activant el bit TXEN del registre TXSTA i que ho volem fer de manera asíncrona desactivant el bit SYNC del registre TXSTA.

Quan volem transmetre un caràcter, el copiarem sobre el registre TXREG. Si la transmissió està lliure el caràcter es transmetrà immediatament. En cas contrari s'esperarà que s'acabi de transmetre l'anterior. El caràcter que s'està a mig transmetre està en un registre intern del microcontrolador, anomenat TSR, al que no tenim accés i és copiat automàticament des de TXREG quan acaba la transmissió.

Cada vegada que s'agafa un caràcter del registre TXREG s'activa el bit TXIF del registre PIR1. L'activació d'aquest bit, doncs, ens indica que el registre TXREG ens ha quedat lliure per posar-hi el caràcter següent. Quan nosaltres escrivim un nou valor a TXREG aquest bit es desactiva automàticament però pot trigar el temps d'executar una o dues instruccions; per tant convé no mirar-lo immediatament.

Podem fer que hi hagi una interrupció cada cop que s'activa aquest bit. Per a fer-ho haurem d'activar el bit TXIE del registre PIE1. A més, cal que les interrupcions estiguin activades a nivell general (bit GIE del registre INTCON) i a nivell de perifèrics (bit PEIE del registre INTCON). Pot ser interessant controlar l'enviament de caràcters mitjançant interrupcions però és convenient desactivar aquesta interrupció quan no hi ha caràcters per enviar.

El bit TRMT del registre TXSTA està activar si el registre TSR és buit (no s'està enviant res) i desactivat si està ocupat.

Els caràcters poden estar codificats amb 8 bits (cas normal) o amb 9 bits (quan hi ha bit de paritat). Per a transmetre caràcters de 9 bits cal activar el bit TX9 del registre TXSTA i desactivar-lo si només se'n volen enviar 8. Quan hem d'enviar 9 bits, posarem el bit de més pes (bit més significatiu) a la posició TX9D del registre TXSTA i els altres vuit al registre TXREG. Si treballem amb nou bits, s'ha d'escriure sempre primer el bit TX9D i després el registre TXREG i mai en ordre contrari.

Els passos a seguir per a fer una transmissió serien els de la taula següent:

Ordre Acció Registres afectats
1 Establir la velocitat de transmissió SPBRGH, SPBRG, BRGH (TXSTA), BRG16 (BAUDCTL)
2 Configurar el tipus de comunicació SYNC (TXSTA), SPEN (RCSTA)
3 Establir el nombre de bits de la comunicació TX9 (TXSTA)
4 Activar la comunicació TXEN (TXSTA)
5 Activar les interrupcions si es volen fer servir TXIE (PIE1), GIE (INTCON), PEIE (INTCON)
6 Si treballem amb 9 bits, escriure el bit més significatiu TX9D (TXSTA)
7 Copiar el caràcter a enviar en el registre TXREG
Repetir els passos 6 i 7 tants cops com calgui

Recepció de dades

Per activar les comunicacions hem d'activar el bit SPEN del registre RCSTA. Això anul·la el funcionament de RB5, RB7 i AN11. A més d'activar SPEN, però, indicarem que volem rebre dades activant el bit CREN del registre RCSTA i que ho volem fer de manera asíncrona desactivant el bit SYNC del registre TXSTA.

Quan apareix un 0 a la pota de recepció el microcontrolador suposa que comença una comunicació i comprova que realment sigui un bit d'inici. Si el que arriba no sembla un bit d'inici (per tenir una durada inapropiada) es descarta la comunicació i s'espera l'arribada d'un altre bit d'inici.

Un cop es comencen a rebre bits, es van guardant al registre de recepció, anomenat RSR, al que no tenim accés. Un cop ha arribat el darrer bit esperat es mira si arriba un bit d'aturada, que sempre és 1. Si el bit que arriba no és 1 es manté la informació rebuda però, a més, s'activa el bit d'error de caràcter. Si, en canvi, el caràcter arriba correctament aquest bit és desactivat. Un cop ha acabat la recepció, el caràcter llegit es guarda automàticament a la pila de recepció. En aquesta pila, que no és accessible a l'usuari, hi caben dos caràcters. El caràcter més antic de la pila es pot llegir en el registre RCREG. Quan es fa aquesta lectura, el següent caràcter de la pila es desplaça deixant espai per posar-n'hi un altre.

Cada cop que el microcontrolador escriu un caràcter a la pila de recepció s'activa el bit RCIF del registre PIR1. Podem fer que hi hagi una interrupció cada cop que s'activa aquest bit. Per a fer-ho haurem d'activar el bit RCIE del registre PIE1. A més, cal que les interrupcions estiguin activades a nivell general (bit GIE del registre INTCON) i a nivell de perifèrics (bit PEIE del registre INTCON). Quan nosaltres llegim un valor a RCREG aquest bit es desactiva automàticament si ja no queda cap caràcter a la pila de recepció.

Els caràcters poden estar codificats amb 8 bits (cas normal) o amb 9 bits (quan hi ha bit de paritat). Per a rebre caràcters de 9 bits cal activar el bit RX9 del registre RCSTA i desactivar-lo si només se'n volen enviar 8. Quan rebem 9 bits, trobarem el bit de més pes (bit més significatiu) a la posició RX9D del registre RCSTA i els altres vuit a la pila de recepció que és accessible des del registre RCREG. Cal tenir present que la pila de recepció pot contenir dos caràcters i que quan llegim RCREG es fa un desplaçament a la pila; per això, si treballem amb nou bits, s'ha de llegir sempre primer el bit RX9D i després el registre RCREG i mai en ordre contrari.

Si hi ha hagut una errada en la recepció del caràcter que està a dalt de la pila (accessible a RCREG), s'activarà el bit FERR del registre RCSTA. Si volem controlar aquesta errada, cal llegir el bit d'error abans que el caràcter ja que quan haguem llegit el caràcter el bit passarà a ser el del caràcter següent.

Si quan s'acaba la recepció d'un caràcter la pila de recepció ja és plena (ja n'hi ha dos) es produeix un error i s'activa el bit OERR del registre RCSTA. Això implica que es deixen de rebre caràcters. Per desactivar aquest bit cal bloquejar la recepció desactivant el bit CREN.

Els passos a seguir per a fer una transmissió serien els de la taula següent:

Ordre Acció Registres afectats
1 Establir la velocitat de transmissió SPBRGH, SPBRG, BRGH (TXSTA), BRG16 (BAUDCTL)
2 Configurar el tipus de comunicació SYNC (TXSTA), SPEN (RCSTA)
3 Activar les interrupcions si es volen fer servir RCIE (PIE1), GIE (INTCON), PEIE (INTCON)
4 Establir el nombre de bits de la comunicació RX9 (RCSTA)
5 Activar la comunicació CREN (RCSTA)
6 Esperar a que es rebi un caràcter RCIF (PIR1)
7 Mirem si hi ha hagut algun error FERR (RCSTA), OERR (RCSTA)
Si s'ha activat OERR cal desactivar les comunicacions i tornar-les a activar CREN (RCSTA)
8 Si treballem amb 9 bits, llegir el bit més significatiu RX9D (RCSTA)
9 Llegir el caràcter rebut RCREG
Repetir els passos 6 a 9 tants cops com calgui

Per a informació completa, heu de consultar l'apartat 12 del document de característiques del PIC 16F690.

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.