Top Banner
1 El Puerto Serie USART
52

Puerto Serie USART

Sep 03, 2015

Download

Documents

AL EX

Puerto Serie USART para microcontrolador pic16f877a
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 1

    El Puerto Serie USART

  • 2

    4. El Puerto Serie USART

    4.1. Introduccin

    Los sistemas microprogramables basados en CPU internamente estn diseados para la transferencia de datos en buses o lneas de 8 bits o mltiplos de 8. As el bus de datos est optimizado para el tratamiento de datos en paralelo lo cual es mucho ms rpido que el tratamiento serie.

    Si la velocidad de transferencia de datos en paralelo es mucho ms rpida, Porqu se utiliza la transmisin de datos serie?. Algunas respuestas se dan a continuacin:

    1. Para realizar la comunicacin de datos en paralelo se requiere gran cantidad de hilos conductores, pues debe ser establecido un hilo para cada bit de datos, adems de las seales de control. Esto encarece notablemente la comunicacin en funcin de la distancia. La comunicacin serie requiere 2, 3 4 hilos.

    2. Una entrada salida/serie puede ser transmitida a travs de pares de cobre, cable coaxial, fibra ptica, va radio o va satlite, lo que proporciona comunicacin con equipos remotos (redes locales) o muy remotos (Internet a travs de las redes telefnicas y de datos).

    3. La comunicacin en paralelo no posee el alto grado de estandarizacin que ha alcanzado la comunicacin serie, lo que permite la intercominicacin entre equipos, por ejemplo mediante RS232, USB o FireWire.

    Por lo tanto, una manera de conectar dos dispositivos es mediante comunicaciones serie. En ellas los bits de datos se transmiten "en serie" (uno de tras de otro) y cada dispositivo realiza su propio reloj. Previamente se ha acordado que ambos dispositivos transmitirn datos a la misma velocidad.

    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, tales como: lneas telefnicas, terminales remotas, unidades de dispositivos magnticos, ratn, teclados, etc.

    En general existen dos tipos de comunicacin de informacin: en paralelo y en Serie, que se detallan a continuacin:

    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. En la siguiente figura se muestra como se

  • 3

    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.

    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. 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.

    4.2. Modos de transmisin de datos serie

    Existen dos modos bsicos para realizar la transmisin de datos serie: asncrono y sncrono, que se detallan a continuacin:

    1. Las transmisiones asncronas. Son aquellas en que los bits que constituyen el cdigo de un caracter se emiten con la ayuda de impulsos suplementarios que permiten mantener en sincronismo los dos extremos.

  • 4

    2. Las transmisiones sncronas. Los caracteres se transmiten consecutivamente, no existiendo ni bit de inicio ni bit de parada entre los caracteres, estando dividida la corriente de caracteres en bloques, envindose una secuencia de sincronizacin al inicio de cada bloque.

    En este captulo solo se ver la transmisin asncrona.

    4.3. 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 se considera 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.

    Por lo tanto, cuando se transmite informacin a travs de una lnea serie es necesario utilizar un sistema de codificacin que permita resolver los siguientes problemas:

    1. Sincronizacin de bits: El receptor necesita saber donde comienza y donde termina cada bit en la seal recibida para efectuar el muestreo de la misma en el centro del intervalo de cada smbolo (bit para seales binarias).

    2. Sincronizacin del caracter: La informacin serie se transmite por definicin bit a bit, pero la misma tiene sentido en palabras o bytes.

    3. Sincronizacin del mensaje: Es necesario conocer el inicio y fin de una cadena de caracteres por parte del receptor para, por ejemplo, detectar algn error en la comunicacin de un mensaje. Este tipo de sincronizacin no es necesario analizarla en la comunicacin serie de un microcontrolador, porque el control de la transmisin serie depende del programador.

    4.3.1. Sincronizacin de bits

    Una manera de resolver el problema de que la informacin puede interpretarse de diversas maneras, 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).

  • 5

    3. Lograr mediante alguna estrategia que los relojes de transmisin y de recepcin se mantengan en fase continuamente.

    A continuacin se detallan estos mtodos:

    1. 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 se puede ver, 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.

    2. Codificacin auto reloj

    Existen 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:

    PE. Codificacin de fase. FSC. Codificacin por cambio de frecuencia FM. Modulacin de frecuencia. MFM y M2FM. Modulacin de frecuencia modificada.

  • 6

    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.

    3. Los relojes de transmisin y de recepcin se mantienen en fase

    Consiste en que los relojes de transmisin y de recepcin se mantengan en fase continuamente, con sus respectivos relojes, es decir, sin necesidad de tener una seal de reloj en una lnea adicional o por la misma lnea de datos de informacin. El formato que se ajusta es el NRZ, porque la celda contiene un 1 o 0 de acuerdo al nivel de la seal (constante) en la celda.

    Por lo tanto, cuando se establece la comunicacin es necesario implementar una base de tiempo que controle la velocidad. En un microcontrolador, se utilizara la base de tiempos del reloj del sistema, mediante la divisin de la base de reloj del sistema. Por ejemplo mediante un contador temporizador programable.

    4.3.2. 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.

    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.

    4.4. La transmisin serie asncrona

    Cuando se opera en modo asncrono no existe una lnea de reloj comn que establezca la duracin de un bit y el caracter puede ser enviado en cualquier momento. Esto conlleva que cada dispositivo tiene su propio reloj y que previamente se ha acordado que ambos dispositivos transmitirn datos a la misma velocidad.

    No obstante, en un sistema digital, un reloj es normalmente utilizado para sincronizar la transferencia de datos entre las diferentes partes del sistema. El reloj definir el inicio y fin de cada unidad de informacin as como la velocidad de transmisin. Si no existe reloj comn, algn modo debe ser utilizado para sincronizar el mensaje.

    El tiempo por bit en una lnea en que se transfiere la informacin a 2400 bps es de unos 416 microsegundos (1 seg/2400). Una frecuencia de muestreo de 2400 veces por segundo nos permitir muestrear el principio o el final del bit. En ambos casos detectaremos el bit, sin embargo, no es extrao que la seal cambie ligeramente, y permanezca la lnea con una duracin un poco ms larga o ms corta de lo normal. Por todo ello, una frecuencia de muestreo lenta no sera capaz de detectar el cambio de estado de la seal a su debido tiempo, y esto dara lugar a que la estacin terminal no recibiera los bits correctamente.

  • 7

    Para entender mejor la transmisin serie asncrona, es necesario analizar los siguientes conceptos:

    1. Bit de inicio y bit de parada

    En la transmisin asncrona un carcter a transmitir es encuadrado con un indicador de inicio y fin de carcter, de la misma forma que se separa una palabra con una letra mayscula y un espacio en una oracin. La forma estndar de encuadrar un carcter es a travs de un bit de inicio y un bit de parada.

    Durante el intervalo de tiempo en que no son transferidos caracteres, el canal debe poseer un "1" lgico. Al bit de parada se le asigna tambin un "1". Al bit de inicio del carcter a transmitir se le asigna un "0". Por todo lo anterior, un cambio de nivel de "1" a "0" lgico le indicar al receptor que un nuevo carcter ser transmitido. La siguiente figura muestra el formato de transmisin asncrona.

    2. Reglas de transmisin asncrona

    La transmisin asncrona para la norma RS232, es especificada por RS404 de EIA (Electronic Industries Association), y define las caractersticas del mtodo asncrono para transmisin en serie, de acuerdo a las siguientes reglas:

    a. Cuando no se envan datos por la lnea, sta se mantiene en estado alto (1). b. Cuando se desea transmitir un carcter, se enva primero un bit de inicio que pone la lnea a

    estado bajo (0) durante el tiempo de un bit. c. Durante la transmisin, si la lnea est a nivel bajo, se enva un 0, y si est a nivel alto se enva

    un 1. d. A continuacin se envan todos los bits del mensaje a transmitir con los intervalos que marca el

    reloj de transmisin. Por convenio se transmiten entre 5 y 8 bits, al ritmo marcado por el reloj de transmisin.

    e. Se enva primero el bit menos significativo, siendo el ms significativo el ltimo en enviarse. f. A continuacin del ltimo bit del mensaje se enva el bit (o los bits) del final que hace que la

    lnea se ponga a 1 por lo menos durante el tiempo mnimo de un bit. Estos bits pueden ser un bit de paridad para detectar errores y el bit o bits de stop, que indican el fin de la transmisin de un carcter.

    Los datos codificados por esta regla, pueden ser recibidos siguiendo los pasos siguientes:

    a. Esperar la transicin 1 a 0 en la seal recibida. b. Activar el reloj con una frecuencia igual a la del transmisor. c. Muestrear la seal recibida al ritmo de ese reloj para formar el mensaje. d. Leer un bit ms de la lnea y comprobar si es 1 para confirmar que no ha habido error en la

    sincronizacin.

  • 8

    3. Velocidad de transmisin

    La velocidad de transmisin de datos es expresada en bits por segundo o baudios. El baudio es un concepto ms general que bit por segundo. El primero queda definido como el nmero de estados de la seal por segundo, si slo existe dos estados (que pueden ser representados por un bit, que identifica dos unidades de informacin) entonces baudio es equivalente a bit por segundo. Baudio y bit por segundo se diferencian cuando es necesario ms de un bit para representar ms de dos estados de la seal.

    La velocidad de transmisin queda limitada por el ancho de banda, potencia de seal y ruido en el conductor de seal. La velocidad de transmisin queda bsicamente establecida por el reloj. Su misin es examinar o muestrear continuamente la lnea para detectar la presencia o ausencia de los niveles de seal ya predefinidos. El reloj sincroniza adems todos los componentes internos.

    En la transmisin asncrona por cada caracter se enva al menos 1 bit de inicio y 1 bit de parada as como opcionalmente 1 bit de paridad. Esta es la razn de que los baudios no se correspondan con el nmero de bits de datos que son transmitidos. En la siguiente figura se muestra el formato bsico de transmisin asincrnica:

    Ejemplo:

    Determinar cuntos bits de datos y caracteres son transmitidos de manera asncrona en 1 segundo si se transmite a una velocidad de 2400 baudios con 1 bit de inicio, 2 bits de parada, 1 bit de paridad y 6 bits de datos por caracter:

    Para transmitir un caracter se necesitar:

    1 bit inicio + 6 bits datos + 1 bit paridad + 2 bits parada =10 bits.

    Como la velocidad de transmisin es 2400 baudios y cada caracter consume 10 bits, se transmitirn 240 caracteres por segundo (2400/10). Como cada caracter posee 6 bits de datos sern transmitidos 240 * 6 = 1440 bits de datos por segundo.

    4.5. Lneas o canales de comunicacin serie

    Se pueden establecer canales para la comunicacin serie de acuerdo a tres tcnicas, siempre tomando al microcontrolador como referencia (transmisor) y al perifrico como destino (receptor):

    a. Simplex b. Semi duplex (Half duplex) c. Totalmente duplex (Full duplex)

  • 9

    a. Simplex: En ella la comunicacin serie usa una direccin y una lnea de comunicacin. Siempre existir un transmisor y un receptor, no ambos.

    La ventaja de este sistema consiste en que es necesario slo un enlace a dos hilos.

    La desventaja radica en que el extremo receptor no tiene ninguna forma de avisar al extremo transmisor sobre su estado y sobre la calidad de la informacin que se recibe. Esta es la razn por la cual, generalmente, no se utiliza.

    b. Semi duplex: La comunicacin serie se establece a travs de una sola lnea, pero en ambos sentidos. En un momento el transmisor enviar informacin y en otro recibir, por lo que no se puede transferir informacin en ambos sentidos de forma simultnea.

    Este modo permite la transmisin desde el extremo receptor de la informacin, sobre el estado de dicho receptor y sobre la calidad de la informacin recibida por lo que permite as la realizacin de procedimientos de deteccin y correccin de errores.

    c. Full duplex: Se utilizan dos lneas (una transmisora y otra receptora) y se transfiere informacin en ambos sentidos. La ventaja de este mtodo es que se puede transmitir y recibir informacin de manera simultnea.

    La mayora de los dispositivos especializados para la comunicacin pueden transferir informacin tanto en full duplex como en half duplex (el modo simplex es un caso especial dentro de half duplex).

    4.6. La USART del PIC16F877

    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 full dplex con dispositivos perifricos tales como terminales de C R T o computadoras personales, o bien para comunicacin sncrona half duplex que puede comunicar con otros microcontroladores, con dispositivos perifricos tales como convertidores A/D o D/A, circuitos integrados o memorias EEPROM con comunicacin serie, etc.

    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)

    Poniendo a "1" bit SPEN (RCSTA ), y los bits TRISC , 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.

  • 10

    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) 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, como se muestra en la siguiente figura:

    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.

    Para conectar el PIC con el mundo externo se debe dotar al PIC de una interfase RS232, por ejemplo para conectar el PIC al puerto serie del PC.

    4.6.1. La Norma RS232

    El puerto serie RS-232C, es la forma ms comnmente usada para realizar transmisiones de datos entre ordenadores. El RS-232C es un estndar que constituye la tercera revisin de la antigua norma RS-232, propuesta por la EIA (Asociacin de Industrias Electrnicas), realizndose posteriormente una versin internacional por el CCITT, conocida como V.24. Las diferencias entre ambas son mnimas, por lo que a veces se habla indistintamente de V.24 y de RS-232C (incluso sin el sufijo "C"), refirindose siempre al mismo estndar.

    El RS-232C consiste en un conector tipo DB-25 de 25 pines, aunque es normal encontrar la versin de 9 pines DB-9, mas barato e incluso ms extendido para cierto tipo de perifricos (como el ratn serie del PC). En cualquier caso, los PCs no suelen emplear ms de 9 pines en el conector DB-25. Las seales con las que trabaja este puerto serie son digitales, de +12V (0 lgico) y -12V (1 lgico), para la entrada y salida de datos, y a la inversa en las seales de control. El estado de reposo en la entrada y salida de datos es -12V. Dependiendo de la velocidad de transmisin empleada, es posible tener cables de hasta 15 metros.

    Cada pin puede ser de entrada o de salida, teniendo una funcin especfica cada uno de ellos, como se muestran en la siguiente figura:

  • 11

    Las seales TXD, DTR y RTS son de salida, mientras que RXD, DSR, CTS y DCD son de entrada. La masa de referencia para todas las seales es SG (Tierra de Seal). Finalmente, existen otras seales como RI (Indicador de Llamada), y otras poco comunes que no se explican en este artculo por rebasar el alcance del mismo.

    Numero de Pin Seal Descripcin E/S En DB-25 En DB-9

    1 1 - Masa chasis - 2 3 TxD Transmit Data (Transmitir Datos) S 3 2 RxD Receive Data (Recibir Datos) E 4 7 RTS Request To Send (Solicitud de Envo) S 5 8 CTS Clear To Send (Libre para Envo) E 6 6 DSR Data Set Ready (Equipo de Datos Listo) E 7 5 SG Signal Ground - 8 1 CD/DCD (Data) Carrier Detect (Deteccin de Portadora) E 15 - TxC(*) Transmit Clock S 17 - RxC(*) Receive Clock E 20 4 DTR Data Terminal Ready (Terminal de Datos Listo) S 22 9 RI Ring Indicator E 24 - RTxC(*) Transmit/Receive Clock S

    (*) = Normalmente no conectados en el DB-25

    Conector DB 25 Conector DB 9

  • 12

    En los PCs hay conectores DB9 macho, de 9 pines, por el que se conectan los dispositivos al puerto serie. Los conectores hembra que se enchufan tienen una colocacin de pines diferente, de manera que se conectan el pin 1 del macho con el pin 1 del hembra, el pin2 con el 2, etc...

    En resumen. La Norma RS-232 fue definida para conectar un ordenador a un modem. Adems de transmitirse los datos de una forma serie asncrona son necesarias una serie de seales adicionales, que se definen en la norma. Las tensiones empleadas estn comprendidas entre +15/-15 voltios.

    Adems, 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). 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 cre para conectar terminales de datos 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 PCs cercanos o el PC a un circuito, se debe tener en cuenta lo siguiente:

    Entre dos PCs cercanos, 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.

    Entre 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.

  • 13

    4.6.2. La comunicacin serial asincrnica usando RS232

    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 especificaciones 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 cuanto 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 a la vez para luego enviarlos en secuencia en la misma lnea elctrica.

    La comunicacin serial usando RS232: entre un par de PCs, entre el circuito con PIC y otro circuito, y entre el PC y el circuito con PIC; se detalla a continuacin:

    1. La comunicacin serial usando RS232 entre un par de PCs

    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 (conectores DB9 macho) 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,

  • 14

    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 bit de parada (STOP BIT); 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.

    2. La comunicacin serial usando RS232 entre el circuito con PIC y otro circuito

    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:

  • 15

    3. La comunicacin serial usando RS232 entre el PC y el circuito con PIC

    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 se necesita una adaptacin de niveles, como se muestra en la siguiente figura:

    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 RC7 del puerto C del PIC, que en este caso es la lnea de recepcin.

    En el pin RC7/RX/DT del PIC tiene por lo tanto la siguiente correspondencia de la seal con la lnea TXD del PC:

  • 16

    De igual forma en el pin RC6/TX/CK 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.

    El MAX232 permite adaptar los niveles RS232 y TTL, permitiendo conectar un PC con un microcontrolador. Slo es necesario este chip y 4 condensadores electrolticos de 22 microfaradios, de acuerdo a la siguiente figura:

    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.

    4. 7. Mdulos fundamentales de la USART

    El mdulo Asncrono de la USART consta de 3 mdulos fundamentales:

    1. El generador de frecuencia de transmisin (Baud Rate) 2. El transmisor asncrono 3. El receptor asncrono.

    A continuacin se detallan cada mdulo:

    4. 7.1. 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 su funcin consiste en determinar la frecuencia de transmisin de la comunicacin serie, la cual se calcula de acuerdo a la siguiente tabla:

  • 17

    SYNC BRGH=0 (baja velocidad) BRGH=1 (Alta velocidad) 0 (modo asncrono) Baud rate=Fosc/(64(X+1)) Baud rate=Fosc/(16(X+1)) 1 (modo sncrono) Baud rate=Fosc/(4(X+1)) -

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

    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 en comunicacin serie asincrnica para las siguientes condiciones:

    - FOSC = 16 MHZ - Velocidad de transmisin deseada = 9600 baudios - BRGH = 0, Baja velocidad - SYNC = 0, Comunicacin asincrnica

  • 18

    Al apreciarse en este ejemplo, el error no tiene ninguna importancia como para la mayora de las aplicaciones.

    Otro Ejemplo:

    Clculo de la proporcin del error de velocidad de transmisin en comunicacin serie asincrnica para las siguientes condiciones:

    - FOSC = 4 MHZ - Velocidad de transmisin deseada = 9600 baudios - BRGH = 0, Baja velocidad de transmisin - SYNC = 0, Comunicacin asincrnica

    De la frmula:

    Baud rate = Fosc / (64(X+1))

    9,6x103 = 4x106 / (64 (X+1 )) X = 4x106 / 9,6x103 x 64 - 1 X = 5,51D 6D X = 6H = SPBRG

    La velocidad de transmisin real ser:

    Baud rate = Fosc / (64(X+1)) = 4x106 / (64 (6+1 )) = 8928

    error = (8928 - 9600 ) / 9600 = 6,99 %

    En este caso el error es bastante alto, por lo que se puede realizar los clculos empleando el ndice (BRGH=1) y sustituyendo la constante 64 por 16 y comprobar si el error se reduce. Como se ve a continuacin:

    De la frmula:

    Baud rate = Fosc / (16(X+1))

    9,6x103 = 4x106 / (16 (X+1 )) X = 4x106 / 9,6x103 x 16 - 1 X = 25D X = 19H = SPBRG

    La velocidad de transmisin real ser:

    Baud rate = Fosc / (16(X+1)) = 4x106 / (16 (25+1 )) = 9615,385

    error = (9615,385 - 9600 ) / 9600 = 0,16 %

    Ahora el error no tiene ninguna importancia, porque es menor al 1%.

  • 19

    Registros asociados al Generador de Baud Rate

    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

    98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 010 0000 010 18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000X 0000 000X 99h SPGBRG Registro generador de Baud Rate

    Leyenda. x = desconocido u= sin cambios - = Sin implementar, se lee 0

    4.7.2. 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), el cual muestra el estado del registro 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, lo que TRMT no lo puede hacer, TRMT est pensado para ser consultado por poleo (sin usar interrupciones).

    Diagrama de bloques del transmisor de la USART

    Para habilitar el mdulo de transmisin es necesario poner en alto el bit TXEN

  • 20

    (TXSTA), 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), 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 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R/W-0 R/W-0 CSRC TX9 TXEN SYNC ---- BRGH TRMT TX9D Bit 7 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 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.

  • 21

    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. 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).

    4.7.3. 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) 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 accesible 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). 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 una 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). 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.

  • 22

    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. 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.

    Registro de estado y Control RCSTA (Receptor)

    R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R/W-0 R/W-0 SPEN RX9 SREN CREN ---- FERR OERR RX9D Bit 7 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

    bit 5: 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

  • 23

    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 opcionalmente al bit BRGH.

    2. Habilitar el puerto serie asncrono limpiando el bit SYNC y poniendo el bit SPEN. 3. Si se van a usar interrupciones, poner el bit RCIE (PIE). 4. Si se desea recepcin de datos de 9 bits se deber poner el bit RX9 (RCSTA). 5. Habilitar la recepcin poniendo el bit CREN (RCSTA) 6. 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.

    Para ilustrar estos procedimientos se presenta a continuacin algunos ejemplos de transmisin y recepcin de datos en modo asncrono, a travs de la USART.

  • 24

    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).

    En la siguiente figura se muestra la comunicacin entre la PC y el PIC:

    1. Diagrama de Flujo:

    Diagrama de flujo del Programa Principal:

  • 25

    INICIO

    dato$

    SI

    NO

    envia

    apun0

    letrero

    datoW

    apunapun + 1

    El diagrama de flujo de la Subrutina envia:

    El diagrama de flujo de la Subrutina letrero:

  • 26

    2. Cdigo en Assembler:

    ;* 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=4Mhz ;************************************************************************

    Include "p16f877.inc"

    org 0x20 apun RES 1 dato RES 1

    org 0x00 trans BSF STATUS,RP0 ;banco 1

    BSF TXSTA,BRGH ;pone bit BRGH=1 (velocidad alta) MOVLW 0x19 ;valor para 9600 Bauds (Fosc=4Mhz) 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)

    rep CLRF apun ;inicializa apuntador

    cic2 CALL letrero ;obtiene el siguiente carcter apuntado en W MOVWF dato ;lo guarda en dato SUBLW "$" ;Compara con el signo "$" BTFSC STATUS,Z ;

  • 27

    GOTO rep ;si es, reinicia CALL envia ;si no es "$" enva el dato INCF apun,1 ;apunta al siguiente carcter GOTO cic2 ;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

    ;************************************************* ;Subrutina para obtener el dato a transmitir

    ;************************************************* letrero:

    MOVF apun,W ;carga apuntador en W ADDWF PCL,1 ;Salta W instrucciones adelante DT "HOLA MUNDO 4 Mhz",0x0D,0x0A,"$" end

    Anlisis del cdigo

    En primer lugar configuramos los registros:

    Registro TXSTA

    CSRC TX9 TXEN SYNC ---- BRGH TRMT TX9D 1 0 1

    Bit 7 Bit 0

    TXEN = 1, Habilita la transicin SYNC = 0, Comunicacin asincrnica BRGH = 1, velocidad alta de transmisin

    Registro SPBRG = 0x19

    0 0 0 1 1 0 0 1 Bit 7 Bit 0

    De la frmula:

    Baud rate = Fosc / (16(X+1)) 9,6x103 = 4x106 / (16 (X+1 )) X = 4x106 / 9,6x103 x 16 - 1 X = 25D X = 19H = SPBRG

    Registro RCSTA

    SPEN RX9 SREN CREN ---- FERR OERR RX9D 1

    Bit 7 Bit 0

    SPEN = 1, Habilita el puerto serie

    Programa principal. Toma cada carcter del mensaje y enva al puerto serie, repitiendo

  • 28

    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 0 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

    H

    O

    L A

    M

    U

    N

    D O

    4

    M

    H

    Z 0x0D Retorno de carro

    0x0A Cambio de lnea

    $ Fin de mensaje

    Porque la sentencia:

    DT "HOLA MUNDO 4 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.

    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 (elegido arbitrariamente) cuyo cdigo ASCII es un 0Dh.

  • 29

    Los datos pueden ser enviados mediante el puerto serie RS232 de una PC usando un software de comunicacin como el 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.

    El circuito para la comunicacin entre la PC y el PIC, es el mismo que el del Ejemplo 1.

    1. Diagrama de Flujo:

    Diagrama de flujo del Programa Principal:

    INICIO

    dato0x0D

    SI

    NO

    letrero

    RC00

    recibe

    RCO1

    apunapun + 1

    apun0

    dato=Wletrero

    SI

    NO

    dato0x0DNO

    recibe

    SI

    apun8NO

    SI

    RC00

  • 30

    El diagrama de flujo de la Subrutina recibe:

    recibe

    datoRCREG

    RCIF=1

    FIN

    SI

    NO

    Diagrama de flujo de la Subrutina letrero:

    2. Cdigo en Assembler:

    ;* Este programa recibe datos a travs del puerto serie asncrono USART ;* La cadena de caracteres recibidos deber terminar con un carcter ;* Si la cadena recibida es "enciende" se encender un led conectado a RC0 ;* si no, se apagar. Se supone un oscilador Fosc=4Mhz ;************************************************************************

    Include "p16f877.inc"

    tamano EQU 0x08

  • 31

    org 0x20 apun RES 1 dato RES 1

    org 0x00 trans BSF STATUS,RP0 ;banco 1

    BCF TRISC,0 ;pone RC0 como salida BSF TXSTA,BRGH ;pone bit BRGH=1 (velocidad alta) MOVLW 0x19 ; valor para 9600 Bauds (Fosc=4Mhz) 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

    BCF PORTC,0 ;pone 0 en la salida RC0

    ciclo CLRF apun ;inicializa apuntador

    sig CALL recibe ;recibe un caracter del puerto serie, ;(dato recibido est en el registro dato)

    MOVLW 0x0D ;carga caracter de fin de cadena SUBWF dato,W ;compara BTFSC STATUS,Z ;ya es fin de cadena?

    GOTO longi ;si es, checa longitud de cadena recibida ;(Fin de la cadena enciende)

    CALL letrero ;si no es, obtiene un caracter a comparar SUBWF dato,W ;son iguales? BTFSS STATUS,Z ;(caracteres iguales)

    ;si los caracteres son iguales o no GOTO noes ;si no son iguales sale del ciclo INCF apun,1 ;si son iguales incrementa apuntador GOTO sig ;repite para el siguiente carcter

    longi MOVLW tamano ;carga longitud de la palabra clave SUBWF apun,W ;compara con nmero de caracteres iguales BTFSC STATUS,Z ;(tamano de 8 caracteres) GOTO On ;si coincide Enciende led GOTO Off ;si no Apaga led

    On BSF PORTC,0 ;Enciende Led GOTO ciclo ;reinicia ciclo

    Off BCF PORTC,0 ;Apaga led GOTO ciclo ;reinicia ciclo

    ;recibe toda la cadena del puerto a pesar que sea diferente noes CALL recibe ;recibe un caracter del puerto serie

    MOVLW 0x0D ;carga caracter de fin de cadena SUBWF dato,W ;compara BTFSC STATUS,Z ;ya es fin de cadena?

    GOTO apaga ;si es, apaga led GOTO noes ;si no es, repite para el resto de caracteres diferentes

    apaga BCF PORTC,0 ;apaga el Led GOTO ciclo ;regresa a esperar nueva cadena

    ;************************************************** ;subrutina de recepcin de un dato del puerto serie ;************************************************** recibe BTFSS PIR1,RCIF ;checa el buffer de recepcin

  • 32

    GOTO recibe ;si no hay dato listo espera MOVF RCREG,W ;si hay dato, lo lee MOVWF dato ;lo almacena en dato RETURN

    ;************************************************** ;subrutina letrero "enciende" de recepcin

    ;************************************************** letrero:

    MOVF apun,W ;carga apuntador en W ADDWF PCL,1 ;Salta W instrucciones adelante DT "enciende" end

    Anlisis del cdigo

    En primer lugar configuramos los registros:

    El registro SPBRG es igual que en el ejemplo anterior de transmisin.

    Registro TXSTA

    CSRC TX9 TXEN SYNC ---- BRGH TRMT TX9D 0

    Bit 7 Bit 0

    SYNC = 0, Comunicacin asincrnica

    Registro RCSTA

    SPEN RX9 SREN CREN ---- FERR OERR RX9D 1 1

    Bit 7 Bit 0

    ESPEN = 1, Habilita el puerto serie CREN = 1, Habilita la recepcin continua

    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 el apuntador apun; repitiendo para el siguiente carcter.

    Si es fin de cadena, chequea 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),

  • 33

    longi MOVLW 0x08 ; tamano 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.

    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.

    Subrutinas. Son dos: recibe y letrero:

    recibe. Chequea 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 idntica 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 o cdigo ASCII 08h (elegido arbitrariamente).

    El circuito para la comunicacin entre la PC y el PIC, es el mismo que el del Ejemplo 1.

    1. Diagrama de Flujo:

    Diagrama de flujo del Programa Principal:

  • 34

    INICIO

    dato0x08

    SI

    NO

    envia

    recibe

    FIN

    El diagrama de flujo de la Subrutina envia es la misma que en el Ejercicio 1.

    Diagrama de flujo de la Subrutina recibe es la misma que en el Ejercicio 2.

    2. Cdigo en Assembler:

    ;* Este programa recibe un carcter por el puerto serie asncrono USART ;* y lo regresa tal cual por el mismo puerto, hasta recibir un ;* Se supone un oscilador a cristal Fosc=4Mhz ;************************************************************************

    include "p16f877.inc"

    org 0x20 dato RES 1

    org 0x00 trans 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

    rep CALL recibe ;recibe dato MOVLW 0x08 ;carga cdigo ASCII de retroceso SUBWF dato,W ;es igual? BTFSC STATUS,Z ; GOTO fin ;si es igual termina CALL envia ;si n, retransmite el dato GOTO rep ;repite

    fin GOTO fin ;ciclo infinito

    ;************************************************* ;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

  • 35

    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. La frecuencia del cristal es de 4 MHz.

    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.

    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:

  • 36

    ;************************************************** ; ; 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 TmpLcdRegister1 RES 1 TmpLcdRegister2 RES 1

    ;Register used by msDelay subroutine MsDelayCounter1 RES 1 MsDelayCounter2 RES 1

    ;Register used by RS232 subroutines dato RES 1 ;data register

    ;Cursor location xCurPos RES 1 yCurPos RES 1

  • 37

    putTempReg RES 1

    ;LCD Control lines LCD_RS equ 2 ;Register Select LCD_E equ 3 ;Enable

    ;LCD data line bus LCD_DB4 equ 4 ;LCD data line DB4 LCD_DB5 equ 5 ;LCD data line DB5 LCD_DB6 equ 6 ;LCD data line DB6 LCD_DB7 equ 7 ;LCD data line DB7

    ;Reset Vector ;********************************************************************** ; RESET VECTOR ;********************************************************************** ORG 00H Start bsf STATUS,RP0 ;Swap to register bank 1

    movlw 11111111B ;Sets the whole PORTB as input movwf TRISB

    bcf PORTB,LCD_DB4 ;Sets LCD data and control lines as ;output bcf PORTB,LCD_DB5 bcf PORTB,LCD_DB6 bcf PORTB,LCD_DB7 bcf PORTB,LCD_E bcf PORTB,LCD_RS

    bcf STATUS,RP0 ;cambio a banco 0

    ;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 RxChar ;read the byte on receiving...

    CheckFormFeed movlw 12 xorwf dato,W btfss STATUS,Z goto _CheckFormFeed

    clrf xCurPos clrf yCurPos call LcdClear goto MainLoop _CheckFormFeed

    movf dato,W call putchar

    goto MainLoop

    ;********************************************************************** ; Delay subroutine ; ; W = Requested delay time in ms (clock = 4MHz)

  • 38

    ;********************************************************************** msDelay movwf MsDelayCounter2 clrf MsDelayCounter1

    ; 1 ms (about) internal loop msDelayLoop nop decfsz MsDelayCounter1,F goto msDelayLoop nop

    decfsz MsDelayCounter2,F goto msDelayLoop

    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 yCurPos,W iorwf xCurPos,W call LcdLocate

    movf putTempReg,W call LcdSendData

    incf xCurPos,F movlw 16 xorwf xCurPos,W btfss STATUS,Z goto moveLcdCursor

    clrf xCurPos

    incf yCurPos,F movlw 2 xorwf yCurPos,W btfss STATUS,Z goto moveLcdCursor

    clrf yCurPos

    moveLcdCursor swapf yCurPos,W iorwf xCurPos,W call LcdLocate

    return

    ;********************************************************************** ; Init LCD ; This subroutine must be called before each other lcd subroutine ;********************************************************************** LcdInit movlw 30 ;Wait 30 ms call msDelay

  • 39

    ;**************** ; Reset sequence ;****************

    bcf PORTB,LCD_RS ;Set LCD command mode

    ;Send a reset sequence to LCD

    bsf PORTB,LCD_DB4 bsf PORTB,LCD_DB5 bcf PORTB,LCD_DB6 bcf PORTB,LCD_DB7

    bsf PORTB,LCD_E ;Enables LCD movlw 5 ;Wait 5 ms call msDelay bcf PORTB,LCD_E ;Disables LCD movlw 1 ;Wait 1ms call msDelay

    bsf PORTB,LCD_E ;Enables LCD movlw 1 ;Wait 1ms call msDelay bcf PORTB,LCD_E ;Disables LCD movlw 1 ;Wait 1ms call msDelay

    bsf PORTB,LCD_E ;Enables E movlw 1 ;Wait 1ms call msDelay bcf PORTB,LCD_E ;Disables E movlw 1 ;Wait 1ms call msDelay

    bcf PORTB,LCD_DB4 bsf PORTB,LCD_DB5 bcf PORTB,LCD_DB6 bcf PORTB,LCD_DB7

    bsf PORTB,LCD_E ;Enables LCD movlw 1 ;Wait 1ms call msDelay bcf PORTB,LCD_E ;Disabled LCD movlw 1 ;Wait 1ms call msDelay

    ;Set 4 bit data bus length

    movlw 28H; call LcdSendCommand

    ;Entry mode set, increment, no shift

    movlw 06H; call LcdSendCommand

    ;Display ON, Curson ON, Blink OFF

    movlw 0EH call LcdSendCommand

    ;Clear display

    call LcdClear

    return

  • 40

    ;********************************************************************** ; Clear LCD ;********************************************************************** LcdClear ;Clear display

    movlw 01H call LcdSendCommand

    movlw 2 ;Wait 2 ms call msDelay

    ;DD RAM address set 1st digit

    movlw 80H; call LcdSendCommand

    return

    ;********************************************************************** ; Locate cursor on LCD ; W = D7-D4 row, D3-D0 col ;********************************************************************** LcdLocate movwf TmpLcdRegister1

    movlw 80H movwf TmpLcdRegister2

    movf TmpLcdRegister1,W andlw 0FH iorwf TmpLcdRegister2,F

    btfsc TmpLcdRegister1,4 bsf TmpLcdRegister2,6

    movf TmpLcdRegister2,W call LcdSendCommand

    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

    movwf TmpLcdRegister1

    ;Send highter four bits

  • 41

    bcf PORTB,LCD_DB4 bcf PORTB,LCD_DB5 bcf PORTB,LCD_DB6 bcf PORTB,LCD_DB7

    btfsc TmpLcdRegister1,4 bsf PORTB,LCD_DB4 btfsc TmpLcdRegister1,5 bsf PORTB,LCD_DB5 btfsc TmpLcdRegister1,6 bsf PORTB,LCD_DB6 btfsc TmpLcdRegister1,7 bsf PORTB,LCD_DB7

    bsf PORTB,LCD_E ;Enables LCD movlw 1 ;Wait 1ms call msDelay bcf PORTB,LCD_E ;Disabled LCD movlw 1 ;Wait 1ms call msDelay

    ;Send lower four bits

    bcf PORTB,LCD_DB4 bcf PORTB,LCD_DB5 bcf PORTB,LCD_DB6 bcf PORTB,LCD_DB7

    btfsc TmpLcdRegister1,0 bsf PORTB,LCD_DB4 btfsc TmpLcdRegister1,1 bsf PORTB,LCD_DB5 btfsc TmpLcdRegister1,2 bsf PORTB,LCD_DB6 btfsc TmpLcdRegister1,3 bsf PORTB,LCD_DB7

    bsf PORTB,LCD_E ;Enables LCD movlw 1 ;Wait 1ms call msDelay bcf PORTB,LCD_E ;Disabled LCD movlw 1 ;Wait 1ms call msDelay

    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

    return

    ;************************************************************************** ; Receive a character from RS232

  • 42

    ; (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 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.

  • 43

    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. La frecuencia del cristal es de 4 MHz.

    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:

  • 44

    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 Enciende LED 1 01h Enciende LED 2

  • 45

    02h Enciende LED 3 03h Enciende LED4

    3. Comandos para el apagado de los LED

    Se puede apagar los LEDs enviando desde la PC los siguientes comandos:

    04h Apaga LED 1 05h Apaga LED 2 06h Apaga LED 3 07h 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 SWITCH1 = 0 sin presionar, SWITCH1= 1 oprimido BIT 1 SWITCH2 = 0 sin presionar, SWITCH2= 1 oprimido BIT 2 SWITCH3 = 0 sin presionar, SWITCH3= 1 oprimido BIT 3 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:

  • 46

    RS232IO /COM2 /LED3=ON

    Para leer el estado de los switches:

    RS232IO /COM2 /SWITCH

    Para leer el estado de los switches:

    Switch 1: off Switch 2: off Switch 3: ---> Active Switch 4: 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 16F877 RADIX DEC INCLUDE "P16F877.INC" __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

    ORG 20H

    ;********************************************************************** ; FILE REGISTER ;**********************************************************************

    ;Register used by msDelay subroutine MsDelayCounter1 res 1 MsDelayCounter2 res 1

    ;Register used by RS232 subroutines dato res 1 ;dato register

    ;I/O lines on PORTB LED1 equ 0 LED2 equ 1 LED3 equ 2 LED4 equ 3

    SWITCH1 equ 4 SWITCH2 equ 5 SWITCH3 equ 6 SWITCH4 equ 7

    ;Command code from PC LED1_ON equ 00h LED2_ON equ 01h LED3_ON equ 02h LED4_ON equ 03h

    LED1_OFF equ 04h LED2_OFF equ 05h LED3_OFF equ 06h LED4_OFF equ 07h

  • 47

    GET_SWITCH equ 08h

    ;********************************************************************** ; RESET VECTOR ;**********************************************************************

    ORG 00H Start bsf STATUS,RP0 ;Swap to register bank 1

    movlw 11110000B ;Sets the whole PORTB as input y output movwf TRISB

    bcf STATUS,RP0 ;Swap to register bank 0

    bcf PORTB,LED1 ;Turn off each leds bcf PORTB,LED2 bcf PORTB,LED3 bcf PORTB,LED4

    ;Star Send and Receive on RS232 CALL IniTrans ;inicializa el puerto serie para transmisin

    MainLoop call RxChar ;read the byte on receiving... movlw 0x30 ;valor del ASCII de '0' subwf dato,1 ;cambia el dato de ASCII a nmero

    ;*********************** ; Check for PC commands ;***********************

    ;*********************** ; LED1_ON ;*********************** Led1On movlw LED1_ON xorwf dato,W btfss STATUS,Z goto _Led1On

    bsf PORTB,LED1

    goto MainLoop _Led1On

    ;*********************** ; LED2_ON ;*********************** Led2On movlw LED2_ON xorwf dato,W btfss STATUS,Z goto _Led2On

    bsf PORTB,LED2

    goto MainLoop _Led2On

    ;*********************** ; LED3_ON ;*********************** Led3On movlw LED3_ON xorwf dato,W

  • 48

    btfss STATUS,Z goto _Led3On

    bsf PORTB,LED3

    goto MainLoop _Led3On

    ;*********************** ; LED4_ON ;*********************** Led4On movlw LED4_ON xorwf dato,W btfss STATUS,Z goto _Led4On

    bsf PORTB,LED4

    goto MainLoop _Led4On

    ;*********************** ; LED1_OFF ;*********************** Led1Off movlw LED1_OFF xorwf dato,W btfss STATUS,Z goto _Led1Off

    bcf PORTB,LED1

    goto MainLoop _Led1Off

    ;*********************** ; LED2_OFF ;*********************** Led2Off movlw LED2_OFF xorwf dato,W btfss STATUS,Z goto _Led2Off

    bcf PORTB,LED2

    goto MainLoop _Led2Off

    ;*********************** ; LED3_OFF ;*********************** Led3Off movlw LED3_OFF xorwf dato,W btfss STATUS,Z goto _Led3Off

    bcf PORTB,LED3

    goto MainLoop _Led3Off

    ;*********************** ; LED4_OFF ;***********************

  • 49

    Led4Off movlw LED4_OFF xorwf dato,W btfss STATUS,Z goto _Led4Off

    bcf PORTB,LED4

    goto MainLoop _Led4Off

    ;*********************** ; GET_SWITCH ;*********************** GetSwitch movlw GET_SWITCH xorwf dato,W btfss STATUS,Z goto _GetSwitch

    swapf PORTB,W ;Read the switch state and send movwf dato

    movlw 0x0F ;mascara 00001111 andwf dato,1 call TxChar ;enva el cdigo de switches MOVLW 0x0D ;carga carcter CALL envia ;lo enva MOVLW 0x0A ;carga carcter CALL envia ;lo enva

    goto MainLoop

    _GetSwitch

    goto MainLoop

    ;**************************************************************** ;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

  • 50

    MOVLW 0x0F ;mscara para limpiar el nibble alto ANDWF msnib,1 ;limpia parte alta de msnib ANDWF lsnib,1 ;limpia parte alta de lsnib MOVF msnib,W ;carga msnib en W CALL asc ;obtiene cdigo ASCII equivalente CALL envia ;lo enva por el puerto serie MOVF lsnib,W ;carga lsnib en W CALL asc ;obtiene cdigo ASCII equivalente CALL envia ;lo enva por el puerto serie

    RETURN

    asc 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 'A' movwf dato call TxChar

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

    call RxChar

  • 51

    El programa funciona de acuerdo al enunciado.

    4.8. 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. La transmisin se habilita por el bit TXEN del registro TXSTA, si se borra durante una transmisin, sta ser abortada y reseteado el transmisor.

    Para iniciar una transmisin es necesario seguir los siguientes pasos:

    1. Inicializar el registro SPBRG con el valor apropiado calculado. 2. Habilitar el puerto master asncrono colocando a uno los bits SYN, SPEN y CSRC. 3. Si se desea emplear la interrupcin, habilitarla poniendo a uno el bit TXIE. 4. Si se desea una transmisin de nueve bits, el noveno se cargar en el bit TX9. 5. Habilitar la transmisin poniendo a uno el bit TXEN. 6. Si se ha habilitado la transmisin de 9 bits, el noveno se cargar en el registro TX9D. 7. 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 o habilitar el CREN (RCSTA). 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 ).

    Los pasos a seguir para iniciar la recepcin en modo master son las siguientes:

    1. Inicializar el registro SPBRG con el valor apropiado de baudios. 2. Habilitar el puerto master asncrono colocando a uno los bits SYN, SPEN y CSRC. 3. Asegurarse de que los bits CREN y SREN estn borrados. 4. Si se desea emplear la interrupcin habilitarla poniendo a uno el bit RCIE. 5. Si se desean nueve bits poner a uno el bit RX9. 6. 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.

  • 52

    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

    0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMREIF TMR1IF 0000 0000 0000 0000 18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000X 0000 000X 1Ah RCGEG Registro Receptor USAR 0000 0000 0000 0000 8Ch PIE1