Вы находитесь на странице: 1из 39

El Puerto Serie USART

1. El Puerto Serie USART


1.1. Introduccin La USART (Universal Synchronous Asynchronous Receiver Transmitter) es uno de los dos perifricos contenidos en el PIC que le permiten realizar comunicacin en serie. El otro es el MSSP (Master Synchronous Serial Port). La USART, tambin conocida como SCI (Serial Communications Interface) puede configurarse como una unidad de comunicacin en serie para la transmisin de datos asncrona con dispositivos tales como terminales de computadora o computadoras personales, o bien para comunicacin sncrona con dispositivos tales como convertidores A/D o D/A, circuitos integrados o memorias EEPROM con comunicacin serie, etc. La gran mayora de los sistemas de comunicacin de datos digitales actuales utilizan la comunicacin en serie, debido a las grandes ventajas que representa esta manera de comunicar los datos: Econmica. Utiliza pocas lneas de transmisin inclusive puede usar slo una lnea. Confiable. Los estndares actuales permiten transmitir datos con bits de paridad y a niveles de voltaje o corriente que los hacen poco sensibles a ruido externo. Adems por tratarse de informacin digital, los cambios en amplitud de las seales (normalmente causados por ruido) afectan muy poco o nada a la informacin. Verstil. No est limitada a usar conductores elctricos como medio de transmisin, pudiendo usarse tambin: fibra ptica, aire, vaco, etc. Adems el tipo de energa utilizada puede ser diferente: luz visible, infrarroja, ultrasonido, pulsos elctricos, radio frecuencia, microondas, etc. Una gran cantidad de perifricos se comunican actualmente en serie con una microcomputadora: lneas telefnicas, terminales remotas, unidades de dispositivos magnticos, ratn, teclados, etc. En general existen dos tipos de comunicacin de informacin: 1. Comunicacin en paralelo 2. Comunicacin en Serie. 1. Comunicacin en paralelo. En este caso se utiliza una lnea fsica por cada bit del dato a comunicar; adems de posibles lneas para protocolo. Esquemticamente en la siguiente figura se muestra como se transmitira el dato de 8 bits 1001 0111= 97h.

Este tipo de comunicacin se puede realizar mediante el PIC usando el puerto D como puerto de datos y las lneas del puerto E como lneas de protocolo. 2

La principal ventaja de la comunicacin paralela es la alta velocidad de transmisin, ya que se envan simultneamente todos los bits de un dato. No obstante, si la distancia entre el transmisor y el receptor es grande, puede ser que el costo de las lneas sea tan alto que se vuelva incosteable este mtodo de comunicacin. 2. Comunicacin en Serie. En cambio, la comunicacin en serie slo utiliza una lnea para la transmisin de datos, y opcionalmente alguna lnea o lneas para protocolo. Por ejemplo, en la siguiente figura se muestra como se transmitira en serie el mismo dato (97h):

La desventaja obvia de la comunicacin serie es que los bits de un dato se envan de a uno por uno, de manera que mientras que la comunicacin en paralelo enva en un ciclo un dato de 8 bits, a la comunicacin serie le toma ms de 8 ciclos (ya que adems del dato en la comunicacin serie se requiere agregar algunos bits de sincronizacin. Sin embargo, debido a que la comunicacin serie requiere slo una lnea para la transmisin esto abarata los costos en lneas de transmisin y no slo esto, ya que este hecho tambin hace posible que los datos puedan ser enviados no necesariamente por un conductor elctrico, sino inclusive por aire o por el vaco si en lugar de pulsos elctricos se usan impulsos electromagnticos, tales como: ondas de radio, microondas, pulsos luminosos, infrarrojo, ultrasonido, lser (a travs de fibra ptica), etc. 1.2. Protocolo de comunicacin serie A diferencia de la comunicacin en paralelo, en la comunicacin en serie se hace necesario establecer mtodos de sincronizacin para evitar la interpretacin errnea de los datos transmitidos. Para ilustrar esto consideremos la siguiente informacin en serie: ...0100110001001100100... Esta informacin puede interpretarse de diversas maneras, (an si se recibe a la velocidad adecuada) dependiendo del punto de inicio de separacin de datos, por ejemplo, una posible interpretacin sera como sigue:

Que interpretado como cdigos ASCII corresponde a los caracteres 1 y 2. Sin embargo, otra posible interpretacin es:

Que corresponde a los caracteres b y d. 3

Sincronizacin de bit. Una manera de resolver el problema anterior es la sincronizacin de bits que puede realizarse por varios mtodos: 1) Enviar por una lnea adicional una seal de reloj que indique el centro de las celdas de bits en la lnea de datos (datos no - auto reloj). 2) Enviar con cada bit y por la misma lnea de datos informacin que permita extraer la seal de reloj (datos auto reloj). 3) Lograr mediante alguna estrategia que los relojes de transmisin y de recepcin se mantengan en fase continuamente. Codificacin no auto reloj. En la figura siguiente se muestran las tres codificaciones de una lnea de datos:

RZ. Una celda de bit es 1 si contiene un impulso positivo y un 0 si no lo contiene. NRZ. La celda contiene un 1 o 0 de acuerdo al nivel de la seal (constante) en la celda. NRZI. La celda de bit contiene un 1 si hay una transicin y un 0 si no la hay. Como puede verse, en estos sistemas (RZ, NRZ y NRZI) las secuencias de ceros no contienen ninguna transicin que permita ubicar la situacin de las celdas de bit. De hecho, el formato NRZ no la contiene ni en los unos. Codificacin auto reloj. Algunos mtodos que contienen en la misma lnea de datos informacin adicional para determinar la velocidad del reloj a costa de disminuir la cantidad de informacin til a la mitad que los mtodos no-auto reloj. En la siguiente figura se muestran los ms utilizados, como son:

PE. Codificacin de fase. FSC. Codificacin por cambio de frecuencia FM. Modulacin de frecuencia. MFM y M2FM. Modulacin de frecuencia modificada. Los mtodos auto reloj son muy tiles cuando la velocidad de transmisin no es constante, por ejemplo, cuando los datos han sido grabados en un medio magntico giratorio; discos, cintas magnticas, etc. Sincronizacin de caracter. Algunos sistemas utilizan lneas adicionales que envan impulsos para indicar el inicio de un bloque de caracteres. Otros sistemas que no requieren lneas adicionales a la lnea de datos son: 1. Mtodo Asncrono. Cada carcter va sealizado mediante dos bits: un bit de inicio y un bit de paro, estos dos bits permiten al receptor reconocer el inicio y el final de cada carcter. La especificacin RS404 de EIA (Electronic Industries Association) define las caractersticas del mtodo asncrono para transmisin en serie de acuerdo a las siguientes reglas: 1) Cuando no se envan datos la lnea debe mantenerse en estado 1. 2) Cuando se va a mandar un carcter se enva primero un bit de inicio de valor 0. 3) A continuacin se envan todos los bits del carcter a transmitir al ritmo marcado por el reloj de transmisin. 4) Despus del ltimo bit del carcter enviado se enva un bit de paro de valor 1. 2. Mtodo Sncrono. Cada mensaje o bloque de transmisin va precedido de unos caracteres de sincronismo. As, cuando el receptor identifica una configuracin de bits igual a la de los caracteres de sincronismo da por detectado el inicio y el tamao de los datos.

Observacin: Para el usuario de un microcontrolador que posee una USART o sistema similar la manera detallada como el sistema logra establecer la comunicacin resulta transparente a l, ya que slo tiene que configurar el protocolo del transmisor y del receptor para que estos logren la comunicacin adecuada, es decir, el usuario usualmente slo debe configurar: Tipo de comunicacin (sncrona o asncrona) Velocidad de transmisin en Baudios (bits por segundo) Longitud de los datos Bits de inicio y de paro, bits de paridad, etc.

1.3. La USART del PIC16F877 La USART del PIC puede ser configurada para operar en tres modos: 1. Modo Asncrono (full duplex (transmisin y recepcin simultneas)) 2. Modo Sncrono Maestro (half duplex) 3. Modo Sncrono Esclavo (half duplex) 1.3.1. La Interfase RS232 Se prosigue con el estudio de conectar el PIC con el mundo externo analizando, ahora, cmo es posible dotar al PIC de una interfase RS232 para conectarlo al puerto serie del PC. 5

1. La Norma RS232 La norma RS232 define una especificacin para la transmisin serial de datos entre dos dispositivos denominados DTE (Data Terminal Equipment) y DCE (Data Communication Equipment). Como no se pueden comprender estas definiciones, el Data Communication Equipment es un dispositivo que se usa para manejar una comunicacin de los datos mientras Data Terminal Equipment es un dispositivo que se usa para almacenar o recibir datos. En la prctica el RS232 se ha creado para conectar terminales de datos (en el caso del ejercicio a desarrollarse una computadora) con un mdem para la transmisin de datos generados. Tener una conexin entre dos computadoras es por consiguiente disponer de cuatro dispositivos como se puede observar en la figura: una computadora (DTE) conectado a un mdem (DCE) y otro mdem (DCE) conectado a su computadora (DTE). De manera que cualquier dato de la primera computadora es transmitido a travs de RS232 al mdem relativo, luego transmitido de ste al mdem remoto que a su vez vuelve a envirselo a su computadora a travs de RS232.

Para usar la conexin RS232 entre dos computadoras cercanas sin interponer entre ellos algunos mdems, se debe simular las conexiones del intermediario que de algn modo comprenden un cable NULL MODEM o un cable intermedio, de tal manera de conectar directamente los dos DTEs como si entre ellos existiera los DCEs de hecho. Para conectar el PC a un circuito se simula directamente un DCE que tiene al PC conectado a un mdem. Antes de hacer esto se debe ver en detalle el principio de funcionamiento de la comunicacin serial. 2. La comunicacin serial asincrnica Para permitir la transmisin de datos entre el PC y el mdem, la norma RS232 define una serie de especificaciones elctricas y mecnicas. Una de estas preocupaciones es el tipo de comunicacin serial que se quiere llevar a cabo, la que puede ser sncrono o asncrono. Se analiza la ms usada que es la comunicacin serial asncrono, ignorando completamente la sncrono en cunto es ms complejo y no est disponible en el PC normal. Una comunicacin serial. Generalmente consiste en la transmisin y recepcin de datos de un punto a otro slo usando una lnea elctrica. En la prctica si se desea transmitir un byte entero se debe obtener un solo bit para luego enviarlos en secuencia en la misma lnea elctrica.

La comunicacin serial usando RS232 entre un par de PCs, se hace de acuerdo a la siguiente figura, en donde se toma un par de hilos y se conecta entre los puertos seriales de las dos PC ( que se denominarn transmisor PC y receptor PC ), segn lo mostrado en la figura:

La lnea de transmisin de Datos (TXD) se presenta con el pin 3 del conector DB9 macho del PC, para ser conectado a la lnea de recepcin de datos(RXD) que se presenta en el pin 2 del segundo PC. Las masas (GND) se presentan en el pin 5 de ambos PC y se conectan entre ellos. Para observar las seales generadas del PC transmisor durante la transmisin serial, se conecta entre la lnea TXD y la lnea GND un osciloscopio y se ejecutan en ambos PCs un programa de emulacin terminal ( tipo Hyperterminal o similar ). La configuracin del puerto serial entre dos PCs. Se realiza para que la informacin del un PC se pueda transmitir inmediatamente a travs del puerto serial al otro PC. Por ejemplo, la configuracin del puerto serial de ambos PCs podran ser: 9600 baudios, 8 bits por dato, 1 bit de parada, ninguna paridad y se deshabilita el control de flujo (handshake ), como un hardware con xon/xoff. Adems, se debe asegurar que el programa de seleccin de emulacin terminal est configurado para usar el puerto serial en el que se conecta oportunamente (COM1 o COM2). Cuando no hay ninguna transmisin en marcha la tensin en la lnea TXD es de -12 voltios correspondientes a la condicin 1 lgico. Para indicar al receptor PC que la transmisin ha empezando, el PC transmisor coloca la lnea TXD a +12 voltios correspondientes a la condicin 0 lgico, por un tiempo igual al inverso de la frecuencia de transmisin o al tiempo de transmisin de un slo bit. Este 0 lgico se denomina bit de inicio ( START BIT ) y siempre est presente en la transmisin al principio de un solo byte. El bit de inicio se transmite en sucesin con los ocho bits componentes del cdigo ASCII del carcter transmitido partiendo del bit menos significativo. Una vez transmitido el octavo bit ( bit 7 ), el PC agrega automticamente un ltimo bit con valor 1 lgico denominado STOP BIT ( bit de parada ); para indicar la transmisin del byte entero se ha realizado. La misma secuencia se repite para cada byte transmitido en la lnea. Por ejemplo, al transmitir el carcter A minscula desde un PC a otro PC usando RS232, con una configuracin del puerto serial de ambos PCs de: 9600 bits por segundo, 8 bits por dato, 1 bit de parada, ninguna paridad y la tensin de alimentacin a +12 voltios, la secuencia de transmisin que se ver en el osciloscopio ser la siguiente: Tiempo de transmisin de un slo bit = 1 / 9600 = 0.104 ms Valor binario de la letra A minscula = 01000001

Transmisin RS232 bidireccional. Para efectuar una transmisin RS232 bidireccional se agrega al cable serial una conexin entre el pin TXD ( pin 3 ) del PC receptor con el pin RXD ( pin 2 ) del PC transmisor. El cable que se consigue es el cable ms simple NULL MODEM para poner en conexin entre los dos DTE. 3. Conexin a un circuito con PIC El circuito con PIC simula un dispositivo DCE, esto significa que el cable que se debe usar no debe ser de tipo NULL MODEM o INVERTENTE, pero debe ser DRITTO con los pines numerados igualmente conectados entre ellos. Este tipo de cable es idntico a aqullos que se usan para conectar un mdem externo al PC. Dado que el dispositivo DTE siempre est dotado de conector DB9 macho, el circuito siendo un DCE, tendr un conector DB9 hembra. El cable de conexin entre el PIC y el circuito debe estar a su vez seguido de un conector hembra de un lado, para poder realizar la transmisin serial del PIC, y un conector macho del otro para poder estar conectado al conector del circuito de prueba. Se tienen en la figura siguiente las conexiones internas al cable que se usa:

4. Funcionamiento del MAX232 Para la conexin entre el PC y el circuito con PIC se usa un driver RS232 (MAX232) o un integrado para convertir las seales a + / - 12 voltios tpico del RS232 en seales a 0/5 voltios del puerto del PIC. Por lo tanto, la conexin entre el PC y el circuito con PIC se debe realizar que la seal de transmisin proveniente del PC entre del pin 3 del conector DB9 hembra en el pin 13 del driver. En el pin 12 del driver la seal estar presente a 0 voltios cuando en el pin 13 exista +12 voltios y 5 voltios cuando en el pin 13 exista -12 voltios. La seal presente en el pin 12 del driver es enviado por consiguiente a la lnea RA1 del puerto A del PIC que en este caso har de lnea de recepcin. 8

En el pin 18 del PIC (RA1) tiene por lo tanto la siguiente correspondencia de la seal con la lnea TXD del PC:

De igual forma en el pin 17 (RA0) del PIC se genera una seal para enviarla hacia el PC para nivelar en TTL que luego se convierte en seales RS232 del driver por medio del pin 11 ( entrada TTL ) y 14 ( salida RS232 ) y por consiguiente los enviados al PC a travs del pin 2 del conector. En la siguiente Figura se muestra la conexin del MAX232 entre la PC y el PIC:

5. Modo Universal Synchronous Asynchronous Receiver Transmitter (USART) El mdulo transmisor (USART) es otro de los dos puertos serie de los que dispone esta familia de microcontroladores, USART tambin se conocen como Serial Communications o Interface (SCI). El USART puede configurarse como asncrono full dplex que puede comunique con los dispositivos perifricos como el terminales de CRT y los ordenadores personales, o puede configurarse como un sistema sncrono half duplex que puede comunicar con otros microcontroladores, con dispositivos perifricos como A/D o D/A circuitos integrados, EEPROMs serie etc. El USART puede configurarse en los modos siguientes: 9

Asncrono( Full duplex ) Sncrono- Master (half duplex) Sncrono- Slave (half duplex)

Poniendo a "1" bit SPEN (RCSTA <7>), y los bits TRISC <7:6>, se configura RC6/TX/CK y RC7/RX/DT como USART. Como ya se ha dicho, en este modo de comunicaciones se emplea una configuracin estndar de un bit de Start, ocho o nueve bits de datos, y un bit de Stop. Este modo de trabajo es detenido durante la funcin Sleep. Aunque la USART tiene funciones independientes para la transmisin y recepcin, los formatos de datos y de velocidad de transmisin son iguales para los dos casos. El generador de baudios produce siempre las seales de reloj x16 x64 (dependiendo de BRGH, TXSTA<2>) para el desplazamiento de los bits. El bit de paridad no est soportado por el hardware, pero se puede implementar por software empleando para ello el noveno bit de datos. En este modo la USART usa un formato estndar NRZ asncrono, el cual para la sincronizacin usa: 1 bit de inicio (I), 8 o 9 bits de datos y 1 bit de paro (P). Mientras no se estn transmitiendo datos la USART enva continuamente un bit de marca. El modo asncrono se selecciona limpiando el bit SYNC del registro TXSTA (98H). El modo asncrono 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 circuito de muestreo. El dato en la patita de recepcin (RC7/RX/DT) es muestreado tres veces para poder decidir mediante un circuito de mayora, si se trata de un nivel alto o un nivel bajo. El mdulo Asncrono de la USART consta de 3 mdulos fundamentales: a. El generador de frecuencia de transmisin (Baud Rate) b. El transmisor asncrono c. El receptor asncrono. a. El Generador de Baud Rate (BRG) Este generador sirve tanto para el modo sncrono como el asncrono y consiste de un contador/divisor de frecuencia de 8 bits controlado por el registro SPBRG (99H). De tal manera que la frecuencia de transmisin se calcula de acuerdo a la siguiente tabla: SYNC 0 (modo asncrono) 1 (modo sncrono) BRGH=0 (baja velocidad) Baud rate=Fosc/(64(X+1)) Baud rate=Fosc/(4(X+1)) BRGH=1 (Alta velocidad) Baud rate=Fosc/(16(X+1)) 10

En esta tabla X=valor de 8 bits en el registro del divisor, SPBRG. El bit BRGH corresponde a TXSTA<2>.

Debido a que el divisor es de 8 bits, no se puede tener cualquier velocidad de transmisin deseada, ya que X se deber redondear al entero ms cercano. En las dos tablas anteriores se muestran algunos valores baud estndares, el divisor necesario (X=SPBRG) bajo diferentes frecuencias Fosc y el error producido en porcentaje. Ejemplo: Clculo de la proporcin del error de velocidad de transmisin para las siguientes condiciones: FOSC = 16 MHZ Velocidad de transmisin deseada = 9600 baudios BRGH = 0 SYNC = 0

11

Como puede apreciarse, el error no tiene ninguna importania para la mayora de las aplicaciones, no obstante, se puede realizar los clculos empleando el ndice (BRGH=1) y sustituyendo la constante 64 por 16 (ver la tabla) y comprobar si el error se reduce. Los datos de la patilla RC7/RX/DT son muestreados en tres tiempos para detectar y determinar mejor si el nivel presente en la patilla RX est a nivel alto o bajo. Si el bit BRGH (TXSTA<2>) est a cero, el muestreo se realiza en el sptimo, octavo, y noveno flanco de bajada de x1 6 de reloj. Si por el contrario, el bit BRGH est a uno, el muestreo tiene lugar en el tercer flanco de reloj precedido de la segunda subida de reloj y de la primera bajada de x4 de reloj. Registros asociados al Generador de Baud Rate
Direccin 98h 18h 99h Nombre TXSTA RCSTA SPGBRG Bit 7 CSRC SPEN Bit 6 TX9 RX9 Bit 5 TXEN SREN Bit 4 SYNC CREN Bit 3 --ADDEN Bit 2 BRGH FERR Bit 1 TRMT OERR Bit 0 TX9D RX9D
Valor en POR,BOR Valor en el resto de Reset

0000 010 0000 000X

0000 010 0000 000X

Registro generador de Baud Rate

Leyenda.

x = desconocido

u= sin cambios

- = Sin implementar, se lee 0

b. El transmisor asncrono En la siguiente figura se muestra el diagrama de bloques del transmisor de la USART. El corazn de este mdulo es el registro de corrimiento (transmit shift register, TSR). La nica manera de acceder al registro TSR es a travs 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 tena (en cuanto transmite el bit de paro) lee el dato contenido en TXREG (si hay alguno) esto ocurre en un ciclo TCY. En cuanto el dato de TXREG es transferido al TSR el TXREG queda vaco esta condicin es indicada mediante el bit bandera TXIF (que es el bit 4 del registro PIR1 (0Ch)), el cual se pone en alto. Este bit NO puede ser limpiado por software, slo dura un instante en bajo cuando se escribe un nuevo dato a TXREG. Si se escribe un dato seguido de otro (back to back) 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. Existe otro bit, llamado TRMT (TXSTA<1>), el cual muesta el estado del TSR. TRMT se pone en alto cuando TSR est vaco, y en bajo cuando TSR est transmitiendo un dato. Mientras que TXIF puede generar una interrupcin TRMT no lo puede hacer, TRMT est pensado para ser consultado por poleo (sin usar interrupciones).

12

Diagrama de bloques del transmisor de la USART

Para habilitar el mdulo de transmisin es necesario poner en alto el bit TXEN (TXSTA<5>), mientras no se habilite el mdulo, la patita de transmisin (RC6/TX/CK) se mantiene en alta impedancia. Si TXEN es deshabilitada a la mitad de una transmisin, est ser abortada y el transmisor ser reseteado. Si se est usando un noveno bit TX9 (TXSTA<6>), ste deber ser escrito antes de escribir los 8 bits restantes a TXREG, ya que en cuanto se escribe un dato a este registro inmediatamente es transferido a TSR (si ste est vaco). Registro de Estado y Control TXSTA (Transmisor) R/W-0 CSRC Bit 7 R/W-0 TX9 R/W-0 TXEN R/W-0 SYNC U-0 ---R/W-0 BRGH R/W-0 TRMT R/W-0 TX9D Bit 0

bit 7: CSRC: Bit de seleccin de reloj Modo Asncrono Sin importancia Modo Sncrono 1 = Modo master (reloj generado internamente para BRG (Generador de Baudios)) 0 = Modo esclavo (reloj externo) bit 6: TX9: Habilita transmisin de 9-8 bits 1 = Transmisin de 9 bits 0 = Transmisin de 8 bits bit 5: TXEN: Bit de habilitacin del transmisor 1 = Habilita transmisin 0 = Deshabilita transmisin Nota: SREN/CREN anula TXEN en modo SYNC. bit 4: SYNC: Bit de seleccin del modo USART 1 = Modo Sncrono 13

0 = Modo Asncrono bit 3: Sin implementar: En lectura es'0' bit 2: BRGH: Bit de seleccin del rango de baudios alto Modo Asncrono 1 = Alta velocidad 0 = Baja velocidad Modo Sncrono No se usa este modo bit 1: TRMT: Bit de estado del registro de desplazamiento del transmisor (TSR) 1 = TSR vaco 0 = TSR lleno bit 0: TX9D: Noveno bit de datos de transmisin. Se puede emplear como bit de paridad.

De acuerdo a lo anterior, la inicializacin del mdulo de transmisin consiste en los siguientes pasos: 1. Inicializar baud rate escribiendo al registro SPBRG el divisor adecuado y opcionalmente al bit BRGH . 2. Habilitar comunicacin asncrona limpiando el bit SYNC y poniendo el 1el 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 transmisin poniendo el bit TXEN, lo cual pondr el bit TXIF. 6. Colocar el noveno bit del dato en TX9D si se estn usando datos de 9 bits. 7. Cargar el dato al registro TXREG (inicia la transmisin). Ejemplo 1 Transmisin asncrona El siguiente programa enva de manera asncrona a travs de la USART una cadena de caracteres. Esta cadena puede ser recibida mediante el puerto serie RS232 de una PC usando un software de comunicacin tal como la hiperterminal de windows y un cable de comunicacin serie uno a uno (es decir, un cable sin intercambio interno de lneas).
;* Este programa enva repetidamente una cadena de caracteres a travs ;* del puerto serie asncrono USART, La cadena utiliza como terminador ;* un carcter "$". Se supone un oscilador a cristal Fosc=14.7456 Mhz ;************************************************************************ Include "p16f877.inc" apun EQU 0x20 dato EQU 0x21 org 0x0000 trans BSF STATUS,RP0 ;banco 1 BCF TXSTA,BRGH ;pone bit BRGH=0 (velocidad baja) MOVLW 0x17 ;valor para 9600 Bauds (Fosc=14.7456 Mhz) MOVWF SPBRG ;configura 9600 Bauds BCF TXSTA,SYNC ;limpia bit SYNC (modo asncrono) BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisin) BCF STATUS,RP0 ;regresa al banco 0

14

BSF RCSTA,SPEN rep cic2 CLRF apun CALL letrero MOVWF dato SUBLW "$" BTFSC STATUS,Z GOTO rep CALL envia INCF apun,1 GOTO cic2

;pone bit SPEN=1 (habilita puerto serie) ;inicializa apuntador ;obtiene el siguiente carcter apuntado en W ;lo guarda en dato ;Compara con el signo "$" ; ;si es, reinicia ;si no es "$" enva el dato ;apunta al siguiente carcter ;repite

;************************************************* ;Subrutina para enviar un dato por el puerto serie ;************************************************* envia BSF STATUS,RP0 ;banco 1 esp BTFSS TXSTA,TRMT ;checa si el buffer de transmisin: GOTO esp ;si est ocupado espera BCF STATUS,RP0 ;regresa al banco 0 MOVF dato,W ;rescata dato a enviar MOVWF TXREG ;lo enva RETURN letrero: MOVF apun,W ;carga apuntador en W ADDWF PCL,1 ;Salta W instrucciones adelante DT "HOLA MUNDO 14.756 Mhz",0x0D,0x0A,"$" end

Anlisis del cdigo En primer lugar configuramos los registros: Registro TXSTA CSRC Bit 7 TXEN = 1, Habilita la transicin SYNC = 0, Comunicacin asincrnica BRGH = 0, velocidad de baja transmisin Registro SPBRG = 0x17 0 Bit 7 De la frmula: Baud rate = Fosc / (64(X+1)) 9,6x103 = 14,241x1066 / (64 (X+1 )) X = 14,241x10 / 9,6x103 x 64 - 1 X = 23D X = 17H = SPBRG Registro RCSTA SPEN 1 Bit 7 RX9 SREN CREN ---FERR OERR RX9D Bit 0 15 0 0 1 0 1 1 1 Bit 0 TX9 TXEN 1 SYNC 0 ---BRGH 0 TRMT TX9D Bit 0

ESPEN = 1, Habilita el puerto serie Programa principal. Toma cada carcter del mensaje y enva al puerto serie, repitiendo indefinidamente el envo del mensaje, el carcter a enviar se almacena en el registro dato. Para el control del envo de caracteres se utiliza las siguientes sentencias:
MOVWF dato SUBLW "$" BTFSC STATUS,Z

que realizan la comparacin mediante la resta del dato con el carcter "$", activndose la bandera Z de STATUS de acuerdo a lo siguiente: - resultado = 0 si los caracteres son iguales a "$", entonces Z=1 - resultado = 1 si los caracteres son diferentes, entonces Z=0 Subrutinas. Son dos: envio y letrero: envio. Para evitar prdida de datos se chequea la bandera TRMT del registro TXSTA, la cual se activa cuando se culmina la transmisin, inserta un tiempo de espera y permanece un tiempo en 1. Luego de esto se enva el carcter al puerto. letrero. El registro apun comienza con el valor de 0 y cada vez se incrementa en 1, para sumarle con el contador de programa PCL, lo que permitir acceder a cada carcter del mensaje, de acuerdo a la siguiente tabla.
Memoria de programa
PCL H O L A M U N D O 1 4 . 7 5 6 M H Z 0x0D Retorno de carro 0x0A Cambio de lnea $ Fin de mensaje

Porque la sentencia:
DT "HOLA MUNDO 14.756 Mhz",0x0D,0x0A ,"$"

define una tabla de caracteres dentro de la memoria de programa y al ejecutarse termina la subrutina, retornando en el registro W el valor que est apuntando el registro PCL. 16

c. El receptor asncrono El mdulo de recepcin es similar al de transmisin, en la siguiente figura se muestran los bloques que lo constituyen. Una vez que se ha seleccionado el modo asncrono, la recepcin se habilita poniendo en alto el bit CREN (RCSTA<4>) El dato es recibido mediante la lnea RC7/RX/DT, la cual maneja un registro de corrimiento de alta velocidad (16 veces el Baud rate). El corazn del receptor es el registro de corrimiento RSR. Este registro no es acesabel por software, pero, cuando el dato recibido se ha completado (se ha recibido el bit de Stop) el dato de RSR es transferido automticamente al registro RCREG (1Ah) si ste est vaco y al mismo tiempo es puesto en alto la bandera de recepcin RCIF (PIR1<5>). La nica manera de limpiar la bandera RCIF es leyendo el los datos del registro RCREG. El registro RCREG puede contener hasta dos datos, ya que es un buffer doble que funciona como un cola de dos posiciones. Si las dos posiciones del registro RCREG estn llenas (no han sido ledas) y se detecta el bit de Stop de un tercer dato de recepcin, lo cual ocasiona un transferencia automtica del dato recibido a RCREG, esto destruir el primer dato recibido y activar el indicador de sobreescritura OERR (RCSTA<1>). Para evitar esto, se debern leer los dos datos en RSREG haciendo dos lecturas consecutivas. La nica manera de limpiar el bit OERR una vez que ha sido activado es reseteando el mdulo de recepcin (limpiando CREN y volvindolo a poner), si no se limpia OERR se bloquea la transferencia de datos de RSR a RCREG y no puede haber ms recepcin de datos.

Diagrama de bloques de recepcin de la USART

Si se detecta un bit nivel bajo en la posicin del bit de stop se pone el indicador de error de encuadre (frame error) FERR RCSTA<2>. Tanto este indicador como el noveno bit RX9D de los datos estn en una cola de dos posiciones al igual que los datos recibidos, de manera que al leer RCREG se actualizan FERR y RX9D con nuevos valores, por lo cual estos bits debern ser ledos antes de leer RCREG para no perder su informacin. 17

Registro de estado y Control RCSTA (Receptor) R/W-0 SPEN Bit 7 R/W-0 RX9 R/W-0 SREN R/W-0 CREN U-0 ---R/W-0 FERR R/W-0 OERR R/W-0 RX9D Bit 0

bit 7: SPEN: Bit de habilitacin del puerto serie 1 = Habilita puerto serie (configura patillas RC7/RX/DT y RC6/TX/CK para el puerto serie) 0 = Deshabilita puerto serie bit 6: RX9: Habilita recepcin de 9-8 bits 1 = Selecciona 9 bits de recepcin 0 = Selecciona 8 bits de recepcin SREN: Bit de habilitacin de recepcin nica Modo asncrono Este modo no se usa Modo Sncrono master 1 = Habilita una recepcin nica 0 = Deshabilita una recepcin nica Este bit se borra despus de completar la recepcin Modo Sncrono esclavo En este modo no se usa

bit 5:

bit 4: CREN: Bit de habilitacin de recepcin continua Modo Asncrono 1 = Habilita recepcin continua 0 = Deshabilita recepcin continua Modo Sncrono 1 = Habilita recepcin continua hasta que el bit CREN sea borrado (CREN anula SREN) 0 = Deshabilita la recepcin continua bit 3: Sin implementar: En lectura es '0' bit 2: FERR: Bit de error de empaquetamiento 1 = Error de empaquetamiento (Puede actualizarse al leer el registro RCREG y recibir el siguiente byte) 0 = No hay error bit 1: OERR: Bit de error de desbordamiento 1 = Error de desbordamiento (puede ser borrado al borrar CREN) 0 = No hay desbordamiento bit 0: RXGD: Noveno bit de datos de recepcin. Se puede emplear como bit de paridad

De acuerdo a lo anterior, la inicializacin del mdulo de recepcin es como sigue: 1. Inicializar el baud rate escribiendo al registro SPBRG el divisor adecuado y 18

opcionalmente al bit BRGH . Habilitar el puerto serie asncrono limpiando el bit SYNC y poniendo el bit SPEN. Si se van a usar interrupciones, poner el bit RCIE (PIE<5>). Si se desea recepcin de datos de 9 bits se deber poner el bit RX9 (RCSTA<0>). Habilitar la recepcin poniendo el bit CREN (RCSTA<4>) El bit RCIF se pondr cuando la recepcin de un dato se complete y se generar una interrupcin si RCIE est puesto. 7. Leer el registro RCSTA para obtener el noveno bit (si se estn recibiendo datos de 9 bits) o para determinar si ha ocurrido un error de recepcin. 8. Leer los 8 bits del dato recibido leyendo el registro RCREG. 9. Si ocurri algn error este se limpia al limpiar el bit CREN, el cual deber volver a ponerse si se desea continuar la recepcin. 2. 3. 4. 5. 6. Para ilustrar este procedimiento se presenta a continuacin un ejemplo de transmisin de datos en modo asncrono a travs de la USART. Ejemplo 2 Recepcin asncrona El siguiente programa recibe datos de manera asncrona a travs del la USART. Los datos recibidos son interpretados por el programa como cadenas de caracteres con un carcter de terminacin retorno de carro <CR> (elegido arbitrariamente) cuyo cdigo ASCII es un 0Dh. Los datos pueden ser enviados mediante el puerto serie RS232 de una PC usando un software de comunicacin como la hiperterminal de windows y un cable de comunicacin serie uno a uno. El programa recibe la cadena de caracteres y la compara con la palabra clave enciende (tambin elegida arbitrariamente), de manera que solamente cuando la cadena recibida coincide con la palabra clave encender un Led conectado a la lnea RC0 del puerto C. De lo contrario, (cuando reciba cualquier otra cadena) apagar el LED. Observacin: En realidad, por el diseo del programa, cuando se reciba alguna subcadena inicial de la palabra clave enciende (incluyendo la subcadena vaca) el Led no cambia de estado.
;* Este programa recibe datos a travs del puerto serie asncrono USART ;* La cadena de caracteres recibidos deber terminar con un carcter <CR> ;* Si la cadena recibida es "enciende" se encender un led conectado a RC0 ;* si no, se apagar. Se supone un oscilador Fosc=14.7456 Mhz ;************************************************************************ Include "p16f877.inc" apun EQU 0x20 dato EQU 0x21 org 0x0000 trans BSF STATUS,RP0 ;banco 1 BCF TRISC,0 ;pone RC0 como salida BCF TXSTA,BRGH ;pone bit BRGH=0 (velocidad baja) MOVLW 0x17 ;valor para configurar 9600 Bauds MOVWF SPBRG ;configura 9600 Bauds BCF TXSTA,SYNC ;limpia bit SYNC (modo asncrono) BCF STATUS,RP0 ;regresa al banco 0 BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie) BSF RCSTA,CREN ;Habilita recepcin ciclo CLRF apun ;inicializa apuntador

19

sig

CALL recibe MOVLW 0x0D SUBWF dato,W BTFSC STATUS,Z GOTO longi CALL letrero SUBWF dato,W BTFSS STATUS,Z

;recibe un caracter del puerto serie, ;(dato recibido est en el registro dato) ;carga caracter de fin de cadena ;compara ;ya es fin de cadena? ;si es, checa longitud de cadena recibida ;(Fin de la cadena enciende) ;si no es, obtiene un caracter a comparar ;son iguales? ;(caracteres iguales)

;si los caracteres son iguales o no ;si no son iguales sale del ciclo GOTO noes INCF apun,1 ;si son iguales incrementa apuntador ;repite para el siguiente carcter GOTO sig longi MOVLW 0x08 SUBWF apun,W BTFSC STATUS,Z BSF PORTC,0 GOTO ciclo noes ;carga longitud de la palabra clave ;compara con nmero de caracteres iguales ;(tamano de 8 caracteres) ;si coincide Enciende Led ;si no reinicia ciclo

;solo si recibe toda la cadena del puerto CALL recibe ;recibe un caracter del puerto serie MOVLW 0x0D SUBWF dato,W BTFSC STATUS,Z ;carga caracter de fin de cadena ;compara ;ya es fin de cadena? ;si es, apaga led ;si no es, repite ;apaga el Led ;regresa a esperar nueva cadena

GOTO apaga GOTO noes apaga BCF PORTC,0 GOTO ciclo

;************************************************** ;subrutina de recepcin de un dato del puerto serie ;************************************************** recibe BTFSS PIR1,RCIF ;checa el buffer de recepcin GOTO recibe ;si no hay dato listo espera MOVF RCREG,W ;si hay dato, lo lee MOVWF dato ;lo almacena en dato RETURN letrero: MOVF apun,W ADDWF PCL,1 DT "enciende" end ;carga apuntador en W ;Salta W instrucciones adelante

Anlisis del cdigo En primer lugar configuramos los registros: El registro SPBRG es igual que en el ejemplo anterior de transmisin. Registro RCSTA SPEN 1 Bit 7 RX9 SREN CREN 1 ---FERR OERR RX9D Bit 0 20

ESPEN = 1, Habilita el puerto serie CREN = 1, Habilita la recepcin contnua Programa principal. Este programa recibe un caracter del puerto serie con la subrutina recibe, el dato recibido est en el registro dato. Las siguientes sentencias determinan si ya es fin de cadena recibida del puerto serie, con el carcter 0x0D:
MOVLW 0x0D SUBWF dato,W BTFSC STATUS,Z

Si no es fin de cadena, obtiene un caracter a comparar Si son iguales?,


CALL letrero SUBWF dato,W BTFSS STATUS,Z

Si los caracteres no son iguales sale del ciclo y si son iguales incrementa apuntador apun; repitiendo para el siguiente carcter. Si es fin de cadena, checa longitud de cadena recibida, es decir, fin de la cadena enciende; carga longitud de la palabra clave y compara con nmero de caracteres iguales (tamano de 8 caracteres),
longi MOVLW 0x08 SUBWF apun,W BTFSC STATUS,Z

Si coincide longitud de cadena, solo si recibe toda la cadena del puerto, enciende el Led , si no reinicia ciclo. Subrutinas. Son dos: recibe y letrero: recibe. Checa el buffer de recepcin con la bandera RCIF del registro PIR1, si no hay dato listo espera, caso contrario, si hay dato lo lee; almacenndole en el registro dato. letrero. Es idntico al ejemplo anterior de transmisin, con la nica diferencia que el mensaje es enciende. Ejemplo 3. Transmisin / Recepcin Simultnea El siguiente programa ilustra la capacidad full duplex que posee la USART del PIC que le permite realizar simultneamente la transmisin y recepcin de datos. La tarea que realiza el programa es muy simple, solamente hace el eco del carcter recibido, es decir, conforme recibe un carcter del puerto serie, lo regresa sin cambio por el mismo puerto. El proceso se detiene cuando el carcter recibido es un <Esc> o cdigo ASCII 1Bh (elegido arbitrariamente)
;* Este programa recibe un carcter por el puerto serie asncrono USART ;* y lo regresa tal cual por el mismo puerto, hasta recibir un <esc> ;* Se supone un oscilador a cristal Fosc=14.7456 Mhz ;************************************************************************ Include "p16f877.inc" dato EQU 0x20

21

org 0x0000 trans BSF STATUS,RP0 BCF TXSTA,BRGH MOVLW 0x17 MOVWF SPBRG BCF TXSTA,SYNC BSF TXSTA,TXEN BCF STATUS,RP0 BSF RCSTA,SPEN BSF RCSTA,CREN rep CALL recibe MOVLW 0x1B SUBWF dato,W BTFSC STATUS,Z GOTO fin CALL envia GOTO rep GOTO fin

;banco 1 ;pone bit BRGH=0 (velocidad baja) ;valor para 9600 Bauds (Fosc=14.7456 Mhz) ;configura 9600 Bauds ;limpia bit SYNC (modo asncrono) ;pone bit TXEN=1 (habilita transmisin) ;regresa al banco 0 ;pone bit SPEN=1 (habilita puerto serie) ;Habilita recepcin ;recibe dato ;carga cdigo ASCII de <escape> ;es igual? ; ;si es igual termina ;si n, retransmite el dato ;repite ;ciclo infinito

fin

;************************************************* ;Subrutina para enviar un dato por el puerto serie ;************************************************* envia BSF STATUS,RP0 ;banco 1 esp BTFSS TXSTA,TRMT ;checa si el buffer de transmisin GOTO esp ;si est ocupado espera BCF STATUS,RP0 ;regresa al banco 0 MOVF dato,W ;rescata dato a enviar MOVWF TXREG ;lo enva RETURN ;************************************************** ;subrutina de recepcin de un dato del puerto serie ;************************************************** recibe BTFSS PIR1,RCIF ;checa el buffer de recepcin GOTO recibe ;si no hay dato listo espera MOVF RCREG,W ;si hay dato, lo lee MOVWF dato ;lo almacena en dato RETURN end

Ejemplo 4 Ejemplo de aplicacin El ejemplo de aplicacin consiste en ver cmo recibir y transmitir datos por el PIC16F877, conectando el circuito al PC y el circuito provisto de alimentacin. En el LCD aparecer el cursor de destello arriba a la izquierda. A esto se lanza en ejecucin un programa cualquiera de emulacin terminal y se configura el puerto serial para que se conecte el circuito a 9600 baudios, 8 datos por bit, 1 bit de parada y ninguna paridad, asegurndose de que no se encuentre habilitado algn control de flujo de datos seriales en el hardware de xon/xoff. Tambin, al pulsar alguna tecla en el teclado del PC los caracteres digitales tambin se visualizan en el LCD del circuito. Es decir, este circuito visualiza en el display los caracteres ASCII transmitidos desde la PC por uno de los puertos serie, a travs de un emulador de terminal tipo Hyperterminal (Windows 95/98), Telix (MS DOS), o Minicon (Linux). Por ltimo, pulsando las teclas CTRL-L se puede limpiar el LCD y visualizar nuevas escrituras. 22

El circuito gestiona un LCD, al cual se agrega la RS232 que es el integrado MAX232, del conector DB9 para la conexin al puerto serie del PC y algunos componentes. El circuito descrito se presenta a continuacin:

;************************************************** ; ; LCDTERM.ASM ; ;************************************************** PROCESSOR 16F877 RADIX DEC INCLUDE "P16F877.INC" __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ORG 20H

;********************************************************************** ; FILE REGISTER ;********************************************************************** ;Register used by LCD subroutines tmpLcdRegister RES 2 ;Register used by msDelay subroutine msDelayCounter RES 2 ;Register used by RS232 subroutines dato RES 1 ;data register

23

;Cursor location xCurPos RES yCurPos RES putTempReg RES ;LCD Control lines LCD_RS equ LCD_E equ ;LCD data line bus LCD_DB4 equ LCD_DB5 equ LCD_DB6 equ LCD_DB7 equ

1 1 1 2 3 4 5 6 7 ;Register Select ;Enable ;LCD ;LCD ;LCD ;LCD data data data data line line line line DB4 DB5 DB6 DB7

;Reset Vector ;********************************************************************** ; RESET VECTOR ;********************************************************************** ; ORG 00H Start bsf STATUS,RP0 ;Swap to register bank 1 movlw movwf bcf bcf bcf bcf bcf bcf bcf 11111111B TRISB PORTB,LCD_DB4 PORTB,LCD_DB5 PORTB,LCD_DB6 PORTB,LCD_DB7 PORTB,LCD_E PORTB,LCD_RS STATUS,RP0 ;cambio a banco 0 ;Sets the whole PORTB as input ;Sets LCD data and control lines as ;output

;LCD inizialization call LcdInit ;Put terminal cursor on 0,0 position clrf xCurPos clrf yCurPos ;Star Send and Receive on RS232 call IniTrans MainLoop call CheckFormFeed movlw xorwf btfss goto clrf clrf call goto _CheckFormFeed movf call goto RxChar 12 dato,W STATUS,Z _CheckFormFeed xCurPos yCurPos LcdClear MainLoop dato,W putchar MainLoop ;read the byte on receiving...

24

;********************************************************************** ; Delay subroutine ; ; W = Requested delay time in ms (clock = 4MHz) ;********************************************************************** msDelay movwf msDelayCounter+1 clrf msDelayCounter+0 ; 1 ms (about) internal loop msDelayLoop nop decfsz msDelayCounter+0,F goto msDelayLoop nop decfsz goto return ;********************************************************************** ; Put a char to xCurPos, yCurPos position on LCD ; ; W = Char to show ; xCurPos = x position ; yCurPos = y position ; ; xCurPos and yCurPos will be increase automaticaly ;********************************************************************** putchar movwf putTempReg swapf iorwf call movf call incf movlw xorwf btfss goto clrf incf movlw xorwf btfss goto clrf moveLcdCursor swapf iorwf call return ;********************************************************************** ; Init LCD ; This subroutine must be called before each other lcd subroutine ;********************************************************************** yCurPos,W xCurPos,W LcdLocate putTempReg,W LcdSendData xCurPos,F 16 xCurPos,W STATUS,Z moveLcdCursor xCurPos yCurPos,F 2 yCurPos,W STATUS,Z moveLcdCursor yCurPos yCurPos,W xCurPos,W LcdLocate msDelayCounter+1,F msDelayLoop

25

LcdInit movlw call 30 msDelay ;Wait 30 ms

;**************** ; Reset sequence ;**************** bcf PORTB,LCD_RS ;Set LCD command mode

;Send a reset sequence to LCD bsf bsf bcf bcf bsf movlw call bcf movlw call bsf movlw call bcf movlw call bsf movlw call bcf movlw call bcf bsf bcf bcf bsf movlw call bcf movlw call PORTB,LCD_DB4 PORTB,LCD_DB5 PORTB,LCD_DB6 PORTB,LCD_DB7 PORTB,LCD_E 5 msDelay PORTB,LCD_E 1 msDelay PORTB,LCD_E 1 msDelay PORTB,LCD_E 1 msDelay PORTB,LCD_E 1 msDelay PORTB,LCD_E 1 msDelay PORTB,LCD_DB4 PORTB,LCD_DB5 PORTB,LCD_DB6 PORTB,LCD_DB7 PORTB,LCD_E 1 msDelay PORTB,LCD_E 1 msDelay ;Enables LCD ;Wait 1ms ;Disabled LCD ;Wait 1ms ;Enables LCD ;Wait 5 ms ;Disables LCD ;Wait 1ms ;Enables LCD ;Wait 1ms ;Disables LCD ;Wait 1ms ;Enables E ;Wait 1ms ;Disables E ;Wait 1ms

;Set 4 bit data bus length movlw call 28H; LcdSendCommand

;Entry mode set, increment, no shift movlw call 06H; LcdSendCommand

;Display ON, Curson ON, Blink OFF movlw call 0EH LcdSendCommand

;Clear display

26

call return

LcdClear

;********************************************************************** ; Clear LCD ;********************************************************************** LcdClear ;Clear display movlw call movlw call 01H LcdSendCommand 2 msDelay ;Wait 2 ms

;DD RAM address set 1st digit movlw call return ;********************************************************************** ; Locate cursor on LCD ; W = D7-D4 row, D3-D0 col ;********************************************************************** LcdLocate movwf tmpLcdRegister+0 movlw movwf movf andlw iorwf btfsc bsf movf call return ;********************************************************************** ; Send a data to LCD ;********************************************************************** LcdSendData bsf PORTB,LCD_RS call LcdSendByte return ;********************************************************************** ; Send a command to LCD ;********************************************************************** LcdSendCommand bcf PORTB,LCD_RS call LcdSendByte return ;********************************************************************** ; Send a byte to LCD by 4 bit data bus ;********************************************************************** LcdSendByte ;Save value to send 80H tmpLcdRegister+1 tmpLcdRegister+0,W 0FH tmpLcdRegister+1,F tmpLcdRegister+0,4 tmpLcdRegister+1,6 tmpLcdRegister+1,W LcdSendCommand 80H; LcdSendCommand

27

movwf

tmpLcdRegister

;Send highter four bits bcf bcf bcf bcf btfsc bsf btfsc bsf btfsc bsf btfsc bsf bsf movlw call bcf movlw call PORTB,LCD_DB4 PORTB,LCD_DB5 PORTB,LCD_DB6 PORTB,LCD_DB7 tmpLcdRegister,4 PORTB,LCD_DB4 tmpLcdRegister,5 PORTB,LCD_DB5 tmpLcdRegister,6 PORTB,LCD_DB6 tmpLcdRegister,7 PORTB,LCD_DB7 PORTB,LCD_E 1 msDelay PORTB,LCD_E 1 msDelay ;Enables LCD ;Wait 1ms ;Disabled LCD ;Wait 1ms

;Send lower four bits bcf bcf bcf bcf btfsc bsf btfsc bsf btfsc bsf btfsc bsf bsf movlw call bcf movlw call return ;************************************************************************** ; Star Send and Receive on RS232 ; (9600 baud,8 data bit, 1 stop bit, No parity) ; ;************************************************************************** IniTrans BCF STATUS,RP1 BSF STATUS,RP0 ;banco 1 BSF TXSTA,BRGH ;pone bit BRGH=1 (velocidad alta) MOVLW 0x19 ;valor para 9600 Bauds (Fosc=4 Mhz) MOVWF SPBRG ;configura 9600 Bauds BCF TXSTA,SYNC ;limpia bit SYNC (modo asncrono) BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisin) BCF STATUS,RP0 ;regresa al banco 0 BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie) BSF RCSTA,CREN ;Habilita recepcin PORTB,LCD_DB4 PORTB,LCD_DB5 PORTB,LCD_DB6 PORTB,LCD_DB7 tmpLcdRegister,0 PORTB,LCD_DB4 tmpLcdRegister,1 PORTB,LCD_DB5 tmpLcdRegister,2 PORTB,LCD_DB6 tmpLcdRegister,3 PORTB,LCD_DB7 PORTB,LCD_E 1 msDelay PORTB,LCD_E 1 msDelay ;Enables LCD ;Wait 1ms ;Disabled LCD ;Wait 1ms

28

return ;************************************************************************** ; Receive a character from RS232 ; (9600 baud,8 data bit, 1 stop bit, No parity) ; ; dato: Received character ;************************************************************************** RxChar recibe BTFSS PIR1,RCIF ;checa el buffer de recepcin GOTO recibe ;si no hay dato listo espera MOVF RCREG,W ;si hay dato, lo lee MOVWF dato ;lo almacena en dato return END

Anlisis del cdigo LCDTERM.ASM Realmente en esta aplicacin no viene an usada la lnea de transmisin en cunto que el miniterminal es ahora capaz slo para recibir caracteres. La subrutina de recepcin de caracteres por medio de RS232 es RxChar. Esta subrutina pone en prctica la recepcin de un byte en modo serial asncrono a 9600 bps, 8 bits de datos, 1 bit de parada y cualquier paridad Para recibir caracteres. Solo se debe llamar a la rutina RxChar y el dato es recibido en el registro dato:
call RxChar

Una vez que ley el byte proveniente del PC el programa de ejemplo verifica si el byte recibido es un carcter de mando o un carcter normal para visualizar en LCD. El nico carcter de control implementado por el miniterminal es la Form Feed (FF) correspondiente al cdigo ASCII 12 decimal. La transmisin de este carcter hacia una impresora determina el avance de una hoja de papel. En este caso limpia el contenido del LCD. La Form Feed puede transmitirse del simulador del terminal del PC pulsando la tecla CTRL seguido de la letra L. sta es la parte de cdigo que maneja la recepcin de un Form Feed:
CheckFormFeed movlw 12 xorwf dato,W btfss STATUS,Z goto _CheckFormFeed clrf xCurPos clrf yCurPos call LcdClear goto MainLoop _CheckFormFeed

en la prctica se verifica si el valor recibido por la subrutina RxChar es igual a 12. En caso afirmativo se restauran el registro xCurPos y yCurPos que mantienen los valor X,Y del carcter del cursor del 29

display LCD. En este momento se hace una llamada a la subrutina LcdClear que se ocupa de enviar el comando correcto al display LCD para desplegar su contenido. En el caso que no haya sido transmito un FF del PC, el carcter recibido se enva desnudo y crudo al display con el siguiente cdigo:
movf dato,W call putchar

y por consiguiente se toma se repite para recibir el prximo carcter, con la siguiente instruccin:
goto MainLoop

La subrutina putchar en prctica enva el valor contenido en el registro W al display LCD en la posicin en la que se encuentra el cursor del carcter (xCurPos y yCurPos), por consiguiente se ocupa de enviar al cursor una cabecera si se alcanza la lnea de la meta o para traer la primera lnea si se alcanza el display. En todos los casos los registros xCurPos y yCurPos se aplazan a la prxima posicin para que sea capaz de escribir el siguiente carcter enviado por el PC. Ejercicio 5 Otro ejemplo de aplicacin con la interfase RS232 En este caso, se realiza un circuito que a travs de la subrutina TxChar, tambin pueda transmitir datos. Se trata de un circuito con cuatro LEDs y cuatro switches, dotado de la interfaz RS232 para poder comandar los LEDs y leer desde la PC, el estado de los switches. El circuito a ser realizado se presenta a continuacin:

30

1. Protocolo de comunicacin con la PC El circuito est dotado de 4 LEDs denominados LED1, LED2, LED3, LED4 y cuatro pulsadores denominados SWITCH1, SWITCH2, SWITCH3, Y SWITCH4. A travs de un simple protocolo se puede decidir cul de los LEDs encender o leer el estado de cualquiera de los pulsadores. El protocolo consiste en una serie de cdigos de control que la PC puede transmitir al circuito por el puerto serie. La velocidad de transferencia es 9600 baud, 8 bit de datos, 1 stop bit, sin paridad. 2. Comandos de encendido de los LED Se puede encender un LED cada vez, enviando desde la PC los siguientes comandos: 00h 01h Enciende LED 1 Enciende LED 2 31

02h 03h

Enciende LED 3 Enciende LED4

3. Comandos para el apagado de los LED Se puede apagar los LEDs enviando desde la PC los siguientes comandos: 04h 05h 06h 07h Apaga LED 1 Apaga LED 2 Apaga LED 3 Apaga LED 4

4. Lectura del estado de los pulsadores Para leer el estado de los cuatro pulsadores basta enviar un nico comando: 08h Lectura del estado de los pulsadores

Cuando la PC recibe este comando lee el estado de los bits RB4, RB5, RB6 y RB7 y enva un nico cdigo al PC que refleja el estado de los cuatro pulsadores. De este cdigo, solo los bits 0, 1, 2, y 3 indican: BIT 0 BIT 1 BIT 2 BIT 3 SWITCH1 = 0 sin presionar, SWITCH1= 1 oprimido SWITCH2 = 0 sin presionar, SWITCH2= 1 oprimido SWITCH3 = 0 sin presionar, SWITCH3= 1 oprimido SWITCH4 = 0 sin presionar, SWITCH4= 1 oprimido

Por ejemplo, si es oprimido solo el pulsador 1, el cdigo de respuesta ser 01h (00000001 binario). Si resultan oprimidos el 2 y el 4, el cdigo ser 0Ah (00001010 binario) 5. Programa de prueba Para quienes no disponen del compilador MPASM, con el programa de prueba RS232IO.EXE de Microchip (o cualquier otro) permitir probar el circuito inmediatamente. El programa funciona en ambiente DOS o promt MS/DOS bajo Win 95/98. Supngase haber conectado el circuito al COM2, para encender el LED1, ser suficiente digitar:
RS232IO /COM2 /LED1=ON

Si ahora, se quiere apagar el LED 1 y encender el 4, se digita:


RS232IO /COM2 /LED1=OFF /LED4=ON

Si se quiere encender el LED3 sin modificar el estado de los otros, se hace: 32

RS232IO /COM2 /LED3=ON

Para leer el estado de los switches:


RS232IO /COM2 /SWITCH

Para leer el estado de los switches:


Switch Switch Switch Switch 1: 2: 3: 4: off off ---> Active off

Indicando que solamente el switch 3 est pulsado. El cdigo de este ejemplo est disponible en RS232IO.ASM y se muestra a continuacin:
;************************************************** ; ; RS232IO.ASM ; ;************************************************** PROCESSOR RADIX INCLUDE __CONFIG ORG 20H 16F877 DEC "P16F877.INC" _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

;********************************************************************** ; FILE REGISTER ;********************************************************************** ;Register used by msDelay subroutine msDelayCounter res 2 ;Register used by RS232 subroutines dato res 1 ;dato register ;I/O lines on PORTB LED1 equ LED2 equ LED3 equ LED4 equ SWITCH1 SWITCH2 SWITCH3 SWITCH4 equ equ equ equ 0 1 2 3 4 5 6 7 00h 01h 02h 03h 04h 05h 06h 07h 08h

;Command code from PC LED1_ON equ LED2_ON equ LED3_ON equ LED4_ON equ LED1_OFF LED2_OFF LED3_OFF LED4_OFF GET_SWITCH equ equ equ equ equ

33

;********************************************************************** ; RESET VECTOR ;********************************************************************** ; Start ORG bsf movlw movwf bcf bcf bcf bcf bcf 00H STATUS,RP0 11110000B TRISB STATUS,RP0 PORTB,LED1 PORTB,LED2 PORTB,LED3 PORTB,LED4 ;Swap to register bank 1 ;Sets the whole PORTB as input y output ;Swap to register bank 0 ;Turn off each leds

;Star Send and Receive on RS232 CALL IniTrans ;inicializa el puerto serie para transmisin MainLoop call movlw subwf RxChar 0x30 dato,1 ;read the byte on receiving... ;valor del ASCII de '0' ;cambia el dato de ASCII a nmero

;*********************** ; Check for PC commands ;*********************** ;*********************** ; LED1_ON ;*********************** Led1On movlw xorwf btfss goto bsf goto _Led1On ;*********************** ; LED2_ON ;*********************** Led2On movlw xorwf btfss goto bsf goto _Led2On ;*********************** ; LED3_ON ;*********************** Led3On movlw xorwf btfss goto LED3_ON dato,W STATUS,Z _Led3On LED2_ON dato,W STATUS,Z _Led2On PORTB,LED2 MainLoop LED1_ON dato,W STATUS,Z _Led1On PORTB,LED1 MainLoop

34

bsf goto _Led3On

PORTB,LED3 MainLoop

;*********************** ; LED4_ON ;*********************** Led4On movlw xorwf btfss goto bsf goto _Led4On ;*********************** ; LED1_OFF ;*********************** Led1Off movlw xorwf btfss goto bcf goto _Led1Off ;*********************** ; LED2_OFF ;*********************** Led2Off movlw xorwf btfss goto bcf goto _Led2Off ;*********************** ; LED3_OFF ;*********************** Led3Off movlw xorwf btfss goto bcf goto _Led3Off ;*********************** ; LED4_OFF ;*********************** Led4Off movlw LED4_OFF LED3_OFF dato,W STATUS,Z _Led3Off PORTB,LED3 MainLoop LED2_OFF dato,W STATUS,Z _Led2Off PORTB,LED2 MainLoop LED1_OFF dato,W STATUS,Z _Led1Off PORTB,LED1 MainLoop LED4_ON dato,W STATUS,Z _Led4On PORTB,LED4 MainLoop

35

xorwf btfss goto bcf goto _Led4Off

dato,W STATUS,Z _Led4Off PORTB,LED4 MainLoop

;*********************** ; GET_SWITCH ;*********************** GetSwitch movlw GET_SWITCH xorwf dato,W btfss STATUS,Z goto _GetSwitch swapf movwf movlw andwf call MOVLW CALL MOVLW CALL goto _GetSwitch goto MainLoop PORTB,W dato 0x0F dato,1 TxChar 0x0D envia 0x0A envia MainLoop ;Read the switch state and send ;mascara 00001111 ;enva el cdigo de switches ;carga carcter <CR> ;lo enva ;carga carcter <LF> ;lo enva

;**************************************************************** ;Subrutina para inicializar el puerto serie USART como transmisor ;a 9600 Bauds, considerando un cristal de reloj de 14.7456 MHZ ;**************************************************************** IniTrans: BCF STATUS,RP1 BSF STATUS,RP0 ;banco 1 BSF TXSTA,BRGH ;pone bit BRGH=1 (velocidad alta) MOVLW 0x19 ;valor para 9600 Bauds (Fosc=14.7456 Mhz) MOVWF SPBRG ;configura 9600 Bauds BCF TXSTA,SYNC ;limpia bit SYNC (modo asncrono) BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisin) BCF STATUS,RP0 ;regresa al banco 0 BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie) BSF RCSTA,CREN ;Habilita recepcin RETURN ;************************************************************************** ; Send a character from RS232 ; (9600 baud,8 data bit, 1 stop bit, No parity) ; Separado en los cdigos ASCII de sus dos nibbles hexadecimales ; dato: Send character ;************************************************************************** msnib EQU 0x24 lsnib EQU 0x25 TxChar: MOVF dato,W MOVWF msnib ;pone byte en msnib MOVWF lsnib ;y una copia en lsnib SWAPF msnib,1 ;intercambia nibbles en lsnib MOVLW 0x0F ;mscara para limpiar el nibble alto ANDWF msnib,1 ;limpia parte alta de msnib

36

ANDWF MOVF CALL CALL MOVF CALL CALL RETURN Asc

lsnib,1 msnib,W asc envia lsnib,W asc envia

;limpia parte alta de lsnib ;carga msnib en W ;obtiene cdigo ASCII equivalente ;lo enva por el puerto serie ;carga lsnib en W ;obtiene cdigo ASCII equivalente ;lo enva por el puerto serie

ADDWF PCL,1 ;Calcula el cdigo a retornar ;Saltando W instrucciones adelante DT "0123456789ABCDEF"

;*************************************************************** ;Subrutina para enviar el byte guardado en W por el puerto serie ;*************************************************************** envia BSF STATUS,RP0 ;banco 1 esp BTFSS TXSTA,TRMT ;checa si el buffer de transmisin GOTO esp ;si est ocupado espera BCF STATUS,RP0 ;regresa al banco 0 MOVWF TXREG ;enva dato guardado en W RETURN ;************************************************************************** ; Receive a character from RS232 ; (9600 baud,8 data bit, 1 stop bit, No parity) ; ; dato: Received character ;************************************************************************** RxChar recibe BTFSS PIR1,RCIF ;checa el buffer de recepcin GOTO recibe ;si no hay dato listo espera MOVF RCREG,W ;si hay dato, lo lee MOVWF dato ;lo almacena en dato return END

Anlisis del cdigo RS232IO.ASM Las subrutinas de transmisin y recepcin de caracteres por medio de RS232 son: TxChar y RxChar. Estas dos subrutinas ponen en prctica la transmisin y recepcin de un byte en modo serial asncrono a 9600 bps, 8 bits de datos, 1 bit de parada y cualquier paridad Para transmitir un carcter en la lnea TX. Basta ingresar en el registro W el valor para transmitir y efectuar una llamada a la subrutina TxChar. Suponiendo que para querer transmitir el carcter 'A' al PC nosotros debemos insertar el cdigo siguiente:
movlw movwf call 'A' dato TxChar

Para recibir caracteres. Solo se debe llamar a la rutina RxChar y el dato es recibido en el registro dato:
call RxChar

El programa funciona de acuerdo al enunciado. 37

1.3.2. Modo sncrono Este modo de trabajo tiene dos posibles formas de configuracin, como master y como esclavo. En el modo master la transmisin y recepcin no tienen lugar al mismo tiempo, cuando se transmite un dato, la recepcin es inhibida y viceversa. En la transmisin el registro de desplazamiento, TSR (Transmit Shift Register), obtiene los datos del registro de lectura/escritura TXREG, pero ste no se carga hasta que el ltimo bit de la anterior carga no haya sido transmitido; cuando esto suceda el TSR se vuelve a cargar con el nuevo dato del registro TXREG (si est disponible) ste se vaca y se genera una interrupcin (si est habilitada por el bit TXIE, PIE1<4>. La transmisin se habilita por el bit TXEN del registro TXSTA<5>, si se borra durante una transmisin, sta ser abortada y reseteado el transmisor. Para iniciar una transmisin es necesario seguir los siguientes pasos: 1. 2. 3. 4. 5. 6. 7. Inicializar el registro SPBRG con el valor apropiado calculado. Habilitar el puerto master asncrono colocando a uno los bits SYN, SPEN y CSRC. Si se desea emplear la interrupcin, habilitarla poniendo a uno el bit TXIE. Si se desea una transmisin de nueve bits, el noveno se cargar en el bit TX9. Habilitar la transmisin poniendo a uno el bit TXEN. Si se ha habilitado la transmisin de 9 bits, el noveno se cargar en el registro TX9D. La transmisin se iniciar al cargar los datos en el registro TXREG.

Para seleccionar el modo receptor master hay que poner a uno el bit SREN (RCSTA<5> o habilitar el CREN (RCSTA<4>). El dato es tomado de la patilla RC7/WDT por cada flanco de cada del reloj , si el bit SREN est a uno, slo se recibir una palabra, pero si se borra el bit CREN la recepcin ser continua. Despus del ltimo impulso de reloj, el dato recibido en el registro de desplazamiento RSR ser transferido al RCREG (si est vaco). Una vez haya terminado la recepcin se originar una interrupcin si sta est habilitada, RCIE (PIE1 <5>). Los pasos a seguir para iniciar la recepcin en modo master son las siguientes: 1. 2. 3. 4. 5. 6. Inicializar el registro SPBRG con el valor apropiado de baudios. Habilitar el puerto master asncrono colocando a uno los bits SYN, SPEN y CSRC. Asegurarse de que los bits CREN y SREN estn borrados. Si se desea emplear la interrupcin habilitarla poniendo a uno el bit RCIE. Si se desean nueve bits poner a uno el bit RX9. Si slo se desea una recepcin nica, poner a uno el bit SREN; para recepcin continua poner a uno el bit CREN. 7. El flag de interrupcin RCIF se pone a uno cuando la recepcin haya finalizado si est habilitada por el bit RCIE. 8. Leer el registro RCSTA y cargar el noveno bit (si est habilitado) y comprobar si ha ocurrido un error durante la recepcin. 9. Leer el octavo bit recibido y dar lectura al registro RCREG. 10. Si ha ocurrido un error borrarlo poniendo a cero el bit CREN.

Registros de Sincronizacin en modo master en transmisin


Direccin Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Valor en POR,BOR Valor en el resto de Reset

38

0Ch 18h 1Ah 8Ch 98h 99h

PIR1 RCSTA RCGEG PIE1 TXSTA SPGBRG

PSPIF(1) SPEN PSPIE CSRC

ADIF RX9 ADIE TX9

TXIF SSPIF CCP1IF CREN ADDEN FERR Registro Receptor USAR RCIE TXIE SSPIE CCP1IE TXEN SYNC --BRGH Registro generador de Baud Rate

RCIF SREN

TMREIF OERR TMR2IE TRMT

TMR1IF RX9D TMR1IE TX9D

0000 0000 0000 000X 0000 0000 0000 0000 0000 010

0000 0000 0000 000X 0000 0000 0000 0000 0000 010

Leyenda.

x = desconocido

u= sin cambios

- = Sin implementar, se lee 0

1.3.3. Modo esclavo sncrono Este modo de trabajo difiere del modo master, pues la seal de reloj de desplazamientos es proporcionada externamente por la patilla RC6/TX/CK en lugar de ser generada internamente, esto permite que se puedan transferir o recibir datos cuando el dispositivo est en el modo Sleep. Las operaciones de transmisin son idnticas al modo master, excepto en el caso del modo Sleep. Si se escriben dos palabras en el registro TXREG y despus se ejecuta la instruccin Sleep, ocurrir lo siguiente: 1. 2. 3. 4. La primera palabra ser inmediatamente transferida al registro TSR y transmitida. La segunda palabra permanecer en el registro TXREG. El bit TXIF no se pondr a uno. Cuando la primera palabra haya salido del registro TSR, la segunda palabra, que permanece en el registro TXREG, se enviar al TSR y el bit bandera TXIF subir a uno. 5. Si est habilitado el bit TXIF la interrupcin despertar al microcontrolador de Sleep y el programa saltar a la direccin del vector de interrupciones (0004 hex.).

Registros de Sincronizacin en modo master en recepcin


Direccin 0Ch 18h 1Ah 8Ch 98h 99h Nombre PIR1 RCSTA RCGEG PIE1 TXSTA SPGBRG Bit 7 PSPIF(1) SPEN PSPIE CSRC Bit 6 ADIF RX9 ADIE TX9 Bit 5 RCIF SREN Bit 4 Bit 3 Bit 2 Bit 1 TMREIF OERR TMR2IE TRMT Bit 0 TMR1IF RX9D TMR1IE TX9D Valor en POR,BOR 0000 0000 0000 000X 0000 0000 0000 0000 0000 010 Valor en el resto de Reset 0000 0000 0000 000X 0000 0000 0000 0000 0000 010

TXIF SSPIF CCP1IF CREN ADDEN FERR Registro Receptor USAR RCIE TXIE SSPIE CCP1IE TXEN SYNC --BRGH Registro generador de Baud Rate

Leyenda.

x = desconocido

u= sin cambios

- = Sin implementar, se lee 0

39

Вам также может понравиться