La USART del PIC16F628/648ALa
USART puede configurarse como sistema asíncrono -full dúplex-, que puede comunicarse con dispositivos periféricos como ordenadores personales u otros microcontroladores, o puede configurarse como sistema síncrono -half dúplex-, que puede comunicarse con periféricos tales como circuitos integrados convertidores A/D y D/A, EEPROMs serie, etc.
La USART del PIC puede ser configurada para operar en tres modos:
• Modo Asíncrono (Full dúplex, transmisión y recepción simultaneas)
• Modo síncrono Maestro (Hald duplex)
• Modo síncrono Esclavo (Hald duplex)
Aquí solo trataré el modo asíncrono.
Modo Asíncrono. En este modo la USART usa un formato estándar NRZ asíncrono, el cual para la sincronización usa: 1 bit de inicio (I), 8 o 9 bits de datos y 1 bit de paro (P). Mientras no se están transmitiendo datos la USART envía continuamente un bit de marca. El modo asíncrono se selecciona limpiando el bit
SYNC del registro
TXSTA (98H). El modo asíncrono es deshabilitado durante el modo
SLEEP.
Cada dato es transmitido y recibido comenzando por el LSB. El hardware no maneja bit de Paridad, pero el noveno bit puede ser usado para este fin y manejado por software.
El módulo Asíncrono de la USART consta de 3 módulos fundamentales:
• El circuito de muestreo
• El generador de frecuencia de transmisión (Baud Rate)
• El transmisor asíncrono
• El receptor asíncrono.
El circuito de muestreo: El dato en la patita de recepción
(RB1/RX/DT) es muestreado tres veces para poder decidir mediante un circuito de mayoría, si se trata de un nivel alto o un nivel bajo.
El Generador de Baud Rate (BRG)
Este generador consiste de un contador/divisor de frecuencia de 8 bits controlado por el registro
SPBRG (99H).
De tal manera que la frecuencia de transmisión se calcula de acuerdo a la siguiente tabla:
En esta tabla X=valor de 8 bits en el registro del divisor,
SPBRG. El bit BRGH corresponde a
TXSTA<2>.En el datasheet del
PIC16F628/648A hay tablas donde se muestran algunos valores baud estándares, el divisor necesario (X=SPBRG) bajo diferentes frecuencias Fosc y el error producido en porcentaje.
El transmisor asíncronoEn la siguiente figura se muestra el diagrama de bloques del transmisor de la USART.
El corazón de este módulo es el registro de corrimiento
TSR y la única manera de acceder al registro TSR es a través del registro
TXREG (19H). Para transmitir un dato, el programa deberá ponerlo primero en el registro TXREG. En cuanto el TSR termina de enviar el dato que tenía, enviando el bit de paro, se transfiere el dato contenido en TXREG (si hay alguno). En cuanto el dato de TXREG es transferido al TSR el TXREG queda vacío y esta condición se indicada mediante el bit bandera
TXIF (PIR1<4>), el cual se pone en alto. Este bit NO puede ser limpiado por software, solamente se borrará cuando un nuevo dato se cargue en el registro TXREG. Si se escribe un dato seguido de otro a TXREG el primero se transfiere inmediatamente a TSR y el otro tiene que esperar hasta que el TSR termine de enviar el bit de Stop del primero. Durante esta espera TXIF permanece en bajo. Mientras el bit indicador TXIF señala el estado del registro TXREG, otro bit,
TRMT (TXSTA<1>), muestra el estado del registro TSR. El bit de estado TRMT es de lectura, y se activa cuando el registro TSR está vacío. Ninguna interrupción está unida a este bit por lo que TRMT está pensado para ser consultado por “poleo” (sin usar interrupciones).
Para habilitar el módulo de transmisión es necesario poner en alto el bit
TXEN (TXSTA<5>), mientras no se habilite el módulo, la patita de transmisión (RB2/TX/CK) se mantiene en alta impedancia. Si TXEN es deshabilitada a la mitad de una transmisión, está será abortada y el transmisor será reseteado.
Para seleccionar una transmisión a 9 bits, el bit
TX9 (TXSTA<6>) deberá activarse, y el noveno bit deberá escribirse en
TX9D (TXSTA<0>). El noveno bit se escribirá antes de cargar los 8 bits de datos en el registro TXREG. Esto es necesario, porque al escribir un dato en el registro TXREG puede tener lugar una transferencia inmediata del dato al registro TSR (si TSR está vacío). En este caso, se habrá cargado un dato incorrecto de nueve bits en el registro TSR.
De acuerdo a lo anterior, la inicialización del módulo de transmisión consiste en los siguientes pasos:
1. Inicializar baud rate escribiendo al registro SPBRG el divisor adecuado y opcionalmente al bit BRGH.
2. Habilitar comunicación asíncrona limpiando el bit SYNC y poniendo el bit SPEN.
3. Si se van a usar interrupciones, poner el bit TXIE (PIE<4>).
4. Poner el bit TX9 si se desea transmitir datos de 9 bits
5. Habilitar transmisión poniendo el bit TXEN, lo cual pondrá el bit TXIF.
6. Colocar el noveno bit del dato en TX9D si se están usando datos de 9 bits.
7. Cargar el dato al registro TXREG (inicia la transmisión).
El receptor asíncronoEl módulo de recepción es similar al de transmisión, en la siguiente figura se muestran los bloques que lo constituyen.
Una vez que se ha seleccionado el modo asíncrono, la recepción se habilita poniendo en alto el bit
CREN (RCSTA<4>)El dato es recibido mediante la línea
RB1/RX/DT y se conduce hasta el bloque Data Recovery (Recuperación de dato), la cual maneja un registro de corrimiento de alta velocidad (16 veces el Baud rate).
El corazón del receptor es el registro de corrimiento
RSR. Este registro no es accesible por software, pero al capturar del bit de STOP el dato de RSR es transferido automáticamente al registro
RCREG (1Ah) si éste está vacío y al mismo tiempo es puesto en alto la bandera de recepción
RCIF (PIR1<5>). La única manera de limpiar la bandera RCIF es leyendo el/los datos del registro RCREG. El RCREG es un registro de doble buffer (una FIFO de dos posiciones).
Si las dos posiciones del registro RCREG están llenas (no han sido leídas) y se detecta el bit de Stop de un tercer dato de recepción, lo cual ocasiona un transferencia automática del dato recibido a RCREG, esto destruirá el primer dato recibido y activará el indicador de desbordamiento
OERR (RCSTA<1>).
La única manera de limpiar el bit OERR una vez que ha sido activado es reseteando el módulo de recepción (limpiando CREN y volviéndolo a poner). Si el bit OERR está en 1, se inhibe la transferencia desde el registro RSR hasta el registro RCREG, por lo que es vital borrar el bit OERR, si estuviese activado.
El error de concordancia
FERR (RCSTA<2>) se activa si un bit de STOP se lee en nivel bajo. Tanto este indicador como el noveno bit RX9D se memorizan en el mismo canal que el dato recibido, de manera que al leer RCREG se actualizan FERR y RX9D con nuevos valores, por lo cual estos bits deberán ser leídos antes de leer RCREG para no perder su información.
De acuerdo a lo anterior, la inicialización del módulo de recepción es como sigue:
1. Inicializar el baud rate escribiendo al registro SPBRG el divisor adecuado y opcionalmente al bit BRGH .
2. Habilitar el puerto serie asíncrono limpiando el bit SYNC y poniendo el bit SPEN.
3. Si se van a usar interrupciones, poner el bit RCIE (PIE<5>).
4. Si se desea recepción de datos de 9 bits se deberá poner el bit RX9 (RCSTA<0>).
5. Habilitar la recepción poniendo el bit CREN (RCSTA<4>)
6. El bit RCIF se pondrá cuando la recepción de un dato se complete y se generará una interrupción si RCIE está puesto.
7. Leer el registro RCSTA para obtener el noveno bit (si se están recibiendo datos de 9 bits) o para determinar si ha ocurrido un error de recepción.
8. Leer los 8 bits del dato recibido leyendo el registro RCREG.
9. Si ocurrió algún error este se limpia al limpiar el bit CREN, el cual deberá volver a ponerse si se desea continuar la recepción.
ConfigPIC permite seleccionar algunos parámetros para configurar el módulo USART del pic, y generar el código de ayuda