Vous êtes sur la page 1sur 24

CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

IMPLEMENTACIÓN DE UNA INTERFAZ DE COMUNICACIÓN


SERIAL VIRTUAL EN UN MICROCONTROLADOR PIC 16F84

Recibido: noviembre 18 de 2003 – Revisado: Noviembre 25 de 2003 – Aceptado: Diciembre 10 de


2003
1
WILDER RAMÍREZ DELGADO

Resumen

En el presente trabajo se muestra la manera de como agregar


posibilidades de comunicación serial a un microcontrolador
Pic16f84. Inicialmente se describen, para una comunicación serial
estándar, los intervalos de muestreo necesarios para obtener los
caracteres transmitidos o recibidos, basándose en este intervalo de
tiempo se configura la interrupción del timer 0 de micro para
ejecutar la rutina de supervisión periódicamente en asocio con todo
el código necesario para la implementación del protocolo RS232, el
único hardware adicional es una interfaz MAX 232 cuya función es
acondicionar los niveles de voltaje pero no toma ningún tipo de
papel activo dentro de la transmisión

Abstract

This work shows the way of adding possibilities of serial


communication to a microcontroller Pic16f84. At the begining,
sampling intervals are described for a standard serial
communication to obtain the transmitted and received characters.
Based on these intervals, the timer0 interruption of the
microcontroller is configured to execute the supervision routine
periodically with the code for implementing of protocol RS232, the
only additional hardware is an interface MAX232 whose function is
to prepare the voltage levels, but it does not take any type from
active function inside the transmission.

Introducción

1
Docente Facultad de Ingeniería, Universidad de Manizales. E-mail: wramirez@um.umanizales.edu.co

VENTANA INFORMÁTICA No. 11 – Universidad de Manizales, enero – junio / 2004 – pp 69-91


Universidad de Manizales, enero – junio / 2004

El intercambio de información entre dispositivos electrónicos es un aspecto


que día a día toma mayor trascendencia, ya que, entre otras cosas, permite
crear aplicaciones muy robustas con grandes prestaciones, basadas en
módulos independientes con funciones propias muy especializadas,
trabajando en conjunto. En los sistemas embebidos actuales se tienen
dispositivos con grandes prestaciones que pueden llegar, inclusive a permitir
supervisión y monitoreo de cualquier tipo de señal desde cualquier lugar del
mundo utilizando la red TCP/IP

Existen muchas maneras de clasificar las comunicaciones basada cada una


en diferentes aspectos, como son velocidades, tipos de medio, entre otros;
desde un punto de vista muy general se puede clasificar el intercambio de
información entre equipos, en dos tipos diferentes: Las comunicaciones
paralelas y las comunicaciones seriales. Teniendo en cuenta que la
información a transmitir normalmente está contenida en bytes o palabras,
cuando se establece una comunicación paralela entre dos equipos, se llevan
todos los bits de este byte o palabra al mismo tiempo, esto redunda en
transferencia de información a grandes velocidades pero, se tiene como
condición, que la interfaz física debe tener un medio de transferencia de
datos por cada bit de los datos a transmitir, normalmente se tienen interfaces
de 8 y 16 bits, esta característica de la transmisión paralela hace que sea
muy utilizada para intercambio de información entre equipos que estén muy
cerca (p. Ej. Impresora, scanner), pero hace muy difícil su implementación
cuando las distancias aumentan, tanto desde el punto de vista económico
debido a el número tan grande de conductores, como desde el punto de vista
físico al aumentar de manera directa efectos capacitivos y de interferencias
parásitas entre los diferentes conductores; otro aspecto a tener en cuenta es
que se deben agregar mas conductores al enlace para efectos de
sincronización incrementando aun más las limitantes mencionadas

Otra opción para intercambio de información son las interfaces seriales, en


las cuales la información es transmitida bit a bit sobre una sola línea de
comunicación, esta técnica es mucho más lenta que los enlaces paralelos,
pero tiene la gran ventaja que únicamente se necesitan dos medios de
comunicación, uno para enviar información (TX) y otro para recibir
información (RX), una de las ventajas de tener únicamente dos líneas,
además de la gran reducción de costos, es que para aumentar las distancias
simplemente se deben modificar las técnicas de transmisión, por ejemplo se
pueden utilizar módems o algún otro tipo de técnica para manejo de datos
logrando alcanzar mayores distancias, sin embargo en el fondo se tiene que
en la comunicación simplemente se está llevando de un extremo al otro un
bit, independiente de la manera en que sea transportado

Debido a esto las transmisiones seriales han tenido gran aceptación entre los
fabricantes de sistemas electrónicos, razón por la cual se vio la necesidad de

2
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

crear un estándar que unificara este tipo de protocolo, este estándar fue
desarrollado y publicado por la Electronic Industries Association EIA y se
denominó como la recomendación RS-232C, fue diseñada inicialmente para
realizar conexiones entre terminales y módems, aunque hoy en día sea
utilizada en multitud de aplicaciones, es común encontrar equipos
electrónicos que incluyen interfaces seriales bajo este estándar. Debido a
esto es importante al desarrollar software para aplicaciones embebidas, tener
en cuenta que se hace casi indispensable tener previstas las opciones de
comunicación con otros dispositivos, ya sean de diseño propio o de terceros,

Estándar RS-232c

Existen dos tipos de comunicación serial, la asincrónica y la sincrónica, estos


términos se refieren a la existencia o no de una línea adicional que lleve
señales que sincronicen todo el sistema, cuando la línea existe, se habla de
comunicaciones Sincrónicas; cuando no existe línea alguna y se tiene solo la
línea de datos, se habla de comunicaciones Asíncronas, es muy importante
tener en cuenta que así no exista un camino específico de pulsos de
sincronía, de todas maneras existen señales que ayudan a coordinar el
intercambio de información entre los dispositivos. Para el caso del presente
trabajo se centra en los sistemas asincrónicos, buscando dar una descripción
clara acerca del funcionamiento y las reglas que rigen este tipo de protocolo
de comunicaciones.

La sincronización de los datos en una transmisión serial asíncrona, se logra


teniendo el ancho de cada bit, como un valor constante, el receptor solo debe
leer los bits entrantes a intervalos fijos de tiempo, y con esto obtendrá la
información adecuada, la línea de transmisión normalmente debe encontrase
un valor de voltaje alto (IDLE). Cuando se inicia la transmisión se debe enviar
un bit inicial (en realidad se envía un 0), llamado el bit de arranque o
StarBit, después de recibir este bit se procede a la recepción del resto de bits
de la palabra entrante, al cabo de dicha operación el transmisor envía 1 o 2
Bits de Parada o Stop bits, que le indican la finalización de la transmisión del
byte, y prepara el sistema para la recepción del próximo carácter. En la figura
1 se observa la estructura de un byte transfiriéndose serialmente

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 3


Universidad de Manizales, enero – junio / 2004

Figura 1. Comunicación Serial, Ejemplo de Transmisión

Se tienen entonces los primeros parámetros que se deben tener en cuenta al


configurar un enlace serial, el primer valor importante es el ancho de cada
bit, este valor se obtiene al fijar la velocidad de transmisión, son valores
normales 1200 bps, 2400 bps, 9600 bps, etc. Suponiendo una velocidad de
2400 bps se tiene que la duración de cada pulso es de:

1
≅ 416 µSeg
2400

Otros dos parámetro importantes son el número de bits de datos


(normalmente se habla de valores de 7 u 8 bits) y el número de bits de
parada (1 o 2), se tienen otros valores que pueden configurarse como son
bits de paridad y control de flujo, entre otros, que brindan cierto tipo de
corrección de errores, pero que no son obligatorios.

MAX232

Cuando se habla de dispositivos ubicados muy cerca, es posible manejar


señales con niveles de voltaje reducido, normalmente se manejan niveles de
voltaje TTL, sin embargo cuando las distancias aumentan estos voltajes
sufren atenuaciones considerables, para solucionar este problema la norma
RS-232 fija valores de voltaje más grandes que tienen menos problemas de
atenuación y alcanzan distancias considerablemente mayores, para RS-232
se tiene que:

1. En el transmisor un 1 lógico es un valor de voltajes comprendido entre


-15 y -5 voltios
2. En el transmisor un 0 lógico es un valor de voltajes comprendido entre
+5 y +15 voltios
3. En el receptor un 1 lógico es un valor de voltajes comprendido entre -
25 y -3 voltios
4. En el receptor un 0 lógico es un valor de voltajes comprendido entre

4
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

+3 y +25 voltios

En la figura 2 se observan los diferentes valores de voltajes para este


estándar

Figura 2. Niveles de voltaje RS-232

Se observa que para implementar enlaces seriales se debe contar con


fuentes de alimentación duales, que brinden los niveles de voltaje negativos
que se necesitan, como se mencionó anteriormente RS-232 se diseño
inicialmente para enlazar PC’s y módems, en estos equipos los voltajes
negativos son necesarios para el funcionamiento de diferentes dispositivos
internos, y se utilizaban además para el enlace de comunicaciones sin
problemas, sin embargo cuando se diseñan aplicaciones embebidas el factor
espacio es vital y la implementación de circuitos que generen los voltajes
exigidos por la norma se hace bastante complicada, para solucionar este
problema aparecen circuitos que permiten hacer la conversión de voltajes
TTL a voltajes RS232 teniendo como única fuente de alimentación los 5
voltios que alimentan todo el circuito, un ejemplo de este tipo de dispositivos
son los chip MAX232 fabricado por MAXIM, el funcionamiento interno de este
circuito no es objetivo del presente trabajo, pero a manera general el
MAX232 está compuesto por un elevador de voltaje el cual se encarga de
multiplicar los niveles TTL (0-5) obtener los voltajes RS232 (+/- 12),
basándose en un par de condensadores externos

Una aplicación típica es mostrada en la figura 3, se conecta un dispositivo


emisor (en este caso un microcontrolador) con un dispositivo receptor (un
computador). Es importante tener en cuenta que utilizando la configuración
adecuada del protocolo es posible tener comunicación bidireccional.

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 5


Universidad de Manizales, enero – junio / 2004

Figura 3. Circuito de comunicación entre Microcontrolador y PC

Desarrollo de la Aplicación

El presente software permite la comunicación de dispositivos con el


Microcontrolador 16f84 utilizando el protocolo de comunicación serial RS232,
es importante anotar que este microcontrolador no tiene internamente
ningún componente de hardware (UART) que le permita tener estas
características de comunicación, debido a esto es necesario desarrollar el
software que permita establecer la comunicación serial, asíncrona con 8 bit
de datos, sin paridad; es por esta razón que este software esta basado en el
manejo de la interrupción del TMR0 la cual es generada 3 veces en el
intervalo correspondiente a cada bit durante la transmisión, podemos definir
el periodo de disparo del TMR0 como

1
T= V
Nb

Donde
T= periodo de disparo del TMR0
V= velocidad de transmisión en baudios
Nb = Número de muestreos de cada bit
Para V=2400 bps se tiene T=1/2400/3 = 138 µs (si se toman tres muestras
por bit)

Se debe entonces configurar el TMR0 para interrumpirse cada 138 µs, para
realizar variaciones de la velocidad de transmisión es posible cambiar el valor
T o modificar el valor del cristal de oscilación externo del PIC, (para el
funcionamiento propuesto se maneja un cristal de 4 Mhz) si duplica el valor
del cristal (8Mhz) se duplica la taza de transmisión (4800 Mhz), para el
desarrollo del presente prototipo se implementó una taza de transmisión de
2400 baudios (cristal 4Mhz) por consideraciones de estabilidad y consumo
de potencia

6
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

Como se mencionó anteriormente, cuando se tienen comunicaciones


asíncronas, se manejan pulsos de señal con intervalos de duración
constantes, debido a esto la función básica del software es la lectura del
puerto de recepción a intervalos constantes y exactos de tiempo.
Teniendo en cuenta lo anterior, existen varias maneras de realizar el enlace,
la primera y la mas obvia es configurar un microcontrolador que contenga
Uart lo cual no es el objetivo de este trabajo; una segunda manera es
utilizando rutinas de retardo y realizar escaneos sobre los puertos, este tipo
de estrategia presenta una gran simplicidad de implementación, pero se tiene
la desventaja de no manejar altos niveles de exactitud. Una tercera manera
de realizar la comunicación es utilizando rutinas de interrupción generadas
desde un timer del microcontrolador, en estas rutinas se encuentran todas
las funciones necesarias para cumplir con las exigencias del protocolo, esta
tercera forma de realizar el enlace fue la seleccionada para el desarrollo del
presente montaje, debido a que, desde el punto de vista didáctico pretende
aclarar conceptos teóricos que van desde la misma implementación del
protocolo hasta manejo de conceptos en lo referente a timers y
microcontroladores; también es importante aclarar que en algunas secciones
del programa se sacrificó en cierta medida la eficiencia de código en
búsqueda de la facilidad de comprensión del mismo.

Uart.asm

Para obtener estos intervalos de 138 µs es necesario llevar al timer el


número de ciclos que debe manejar para esto se debe tener en cuenta que.

NroCiclos = 256+T1+T2-F

Donde
NroCiclos: Valor necesario para interrumpirse cada 138µs
T1= 2, Ciclos, durante los cuales el timer es deshabilitado al estar
reiniciándose
T2= 7, Valor del timer al momento de la recarga
F= 138µs, frecuencia deseada

Entonces

NroCiclos = 256+2+7-138=127

Se tiene entonces que configurando el timer con un valor de 127, se generan


interrupciones constantes cada 138 µs

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 7


Universidad de Manizales, enero – junio / 2004

El funcionamiento básico del programa se centra en dos rutinas y un registro


de control, las rutinas son el MAIN o programa principal y la rutina de la
Interrupción o INTERRUPT, el registro de control es Palabra232, estos tres
componentes trabajan de manera coordenada en el manejo de la
transmisión, la recepción y los indicadores de funcionamiento
El registro Palabra232 maneja 4 bits que indican 4 funciones básicas, estos
bits se observan en la Figura 4

Figura 4. Palabra232

Donde:
Iniciotrans: Es el bit que indica que se puede dar inicio a la transmisión
MemobitAnt: Utilizado para tener la información del último bit recibido
Transmitiendo: Le indica a la rutina de la interrupción que se está llevando a
cabo una
Transmisión
CaracterListo: Indica al programa que ya se recibió un carácter valido

Estos bits se unificaron en un solo registro, pero pudieron también haberse


trabajado desde registros individuales pasibilidad que no afecta en gran
medida el desempeño del sistema pero no es muy eficiente desde el punto
de vista del manejo de recursos. Cada bit es modificado en las diferentes
subrutinas, indicándole a cada una de las otras el estado actual de la
comunicación y permitiéndole a las rutinas principales (MAIN, INTERRUPT)
la selección de la subrutina adecuada.

La rutina principal MAIN, así como los procesos de inicialización del


microcontrolador, se muestran en la Figura 5, esta rutina básicamente
realiza dos funciones: detectar que ya se haya recibido un carácter valido
para dar la respuesta programada y manejar un led externo que oscila
indicando el funcionamiento del sistema

8
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

Figura 5. Rutinas MAIN e inicio

Las subrutinas principales de MAIN son PreparaResp y EnviaResp, en la


primera el usuario define cual es el dato que va a transmitir, en este caso y
para fines de prueba del sistema, se envía el carácter recibido en
mayúscula, en esta rutina se podría manejar cualquier tipo de necesidad
especifica del usuario, una vez listo el carácter a transmitir se verifica que no
exista una transmisión en proceso y se configura el bit iniciotrans del registro
Palabra232 para dar inicio a la transmisión, ver figura 6.

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 9


Universidad de Manizales, enero – junio / 2004

Figura 6. Subrutinas de MAIN

La rutina INTERRUPT, es realizada cada 130µs independiente del MAIN, en


enlace entre estas dos rutinas se realiza desde el registro Palabra232 de allí
la importancia de este registro, esta rutina básicamente esta conformada por
4 etapas (ver figura 7) las cuales son:

1) Rutinas de Backup y Reinicio


2) Muestreo
3) Transmisión
4) Recepción

Las rutinas de Backup y recarga buscan almacenar los valores de los


registros de sistema (W, STATUS, PCLATH) durante la atención a la
interrupción, para después ser reubicados y garantizar el adecuado
funcionamiento del programa en general; los datos son almacenados en la
subrutina GuardaVector y son restaurados en la subrutina RecuperaVector al
final de la rutina INTERRUPT.

La rutina de muestreo busca garantizar que los datos recibidos no sean


productos de ruidos en el canal de comunicación, por tal razón cada vez que
se tiene la necesidad de capturar un bit se toman 3 muestras sucesivas,
descartando de esa manera posibles oscilaciones de la línea.

Una vez terminado el proceso de muestreo se debe detectar si se está


transmitiendo, si se debe iniciar la transmisión o si se va a realizar la
recepción; esta decisión se toma en la rutina transmisión, analizando el
estado de los bits Iniciotrans y transmitiendo del Registro Palabra232.

El proceso de transmisión esta conformado por 3 subrutinas estas son


IniciaTransmision, EnviarBit y FinTransmision en la figura 7 se observa la
estructura de estas tres subrutinas. El proceso se dispara en la subrutina
IniciaTransmision donde en primera instancia se inicializa la variable
ContadorTx con el valor 10, este valor se debe a que son 8 bits de datos 1 bit
de inicio y un bit de parada, a continuación se inicializa la bandera
Transmitiendo para indicarle al resto de subrutinas que se dio inicio a la
transmisión, a continuación y debido a que la interrupción esta configurada
para activarse cada 138 µs, es decir un tercio del periodo de cada bit, (esto
para tomar tres muestras de cada dato recibido) se maneja la variable
TempoTx, la cual permite esperar 3 interrupciones para enviar el siguiente
bit. Todo el proceso se ejecuta hasta que se envían los 10 bits, a
continuación se limpia la bandera transmisión y finaliza el proceso de envío
de datos.

10
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 11


Universidad de Manizales, enero – junio / 2004

Figura 7. INTERRUPT
La sección de recepción está conformada por 7 subrutinas las cuales son
1. DeteccionInicio
2. BitInicioOk
3. IniciaRecepcion
4. Espera
5. RecibirBit
6. DetectaUltimoBit
7. StopBitOk

12
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

Figura 8. Rutinas de Recepción

La subrutina BitInicioOk se ejecuta 138 µs después para verificar que


todavía esté presente el StartBit, si no está presente es porque existió un
falso disparo y se procede a reiniciar el proceso de recepción llevando el

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 13


Universidad de Manizales, enero – junio / 2004

valor de EstadoRx a cero, en caso de que aun este presente el StartBit se


procede a iniciar el proceso de recepción a través de la rutina
IniciaRecepcion, cuya función es preparar todo para recibir 8 bits a través de
la variable CuentaByte, luego incrementa EstadoRx y finaliza la interrupción,
observe que desde que dio inicio el proceso de recepción se han utilizado
dos ciclos, es necesario utilizar un tercer retardo, dado por la rutina Espera
con la cual se completan los tres ciclos, en la figura 9 se observan estas
subrutinas.

Figura 9. Subrutinas de Recepción I

Las rutinas recibirBit y DetectaUltimoBit (ver figura 10) se encargan de recibir


el bit que llega y analizar si se tiene un bit intermedio o es el último bit, si se
da el primer caso se retorna a las rutinas anteriores para seguir capturando
más bits. Si se tiene que es el último bit se espera una interrupción más para
detectar el bit de parada utilizando la rutina StopBitOk, en esta se verifica
que no exista un falso fin, si todo está correcto se recupera el carácter
recibido y se almacena en las posiciones de memoria correspondientes,
además se esto a través del registro Palabra232 se indica que ya se tiene un
carácter listo llevando a uno el valor de la bandera correspondiente

Es importante aclarar que las 7 rutinas mencionadas se ejecutan de de


manera independiente en cada interrupción y siguiendo el orden dado por
EstadoRx, en cada interrupción se ejecutan dos rutinas mas:

14
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

END_INTERRUPT y RecuperaVector, la primera almacena los valores de


banderas para la próxima interrupción y actualiza el valor para el led
indicador, la rutina RecuperaVector restaura los valores almacenados en
GuardaVector. Estos valores son analizados por la rutina MAIN donde se
toma la decisión sobre la respuesta que debe ser generada desde el
Microcontrolador, el listado completo con todas las subrutinas se muestra a
continuación, este fue compilado utilizando las herramientas del Mplab.

Figura 10. Subrutinas de Recepción II

Listado del Programa

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 15


Universidad de Manizales, enero – junio / 2004

; Implementación de una UART virtual


; Wilder Ramírez D.
; Universidad de Manizales
; wramirez@um.umanizales.edu.co

LIST P=16F84
INCLUDE "P16F84.INC" ; Librería estándar de declaraciones para
16F64
; Configuración Inicial: Code Protection=off
; WathDog: no, Power On Timer=yes, Oscilador: cristal

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;*****************************
;* DECLARACION DE CONSTANTES *
;*****************************

DEFINET equ d'127' ; dato necesario para un intervalo de


muestreo de 138us

;**********************************************
;* DECLARACION DE BANDERAS PROPOSITO GENERAL *
;**********************************************

SalidaBits equ 0x00 ; Bit a través del cual se efectúa la transmisión


EntradaBits equ 0x00 ; Bit a través del cual se efectúa la recepción.
Activo equ 0x05 ; una señal que permita verificar que el sistema
esta funcionando
; es este caso se tiene un led conectado

;**************************************************
;* DECLARACION DE BANDERAS PARA EL PROTOCOLO 232 *
;**************************************************

InicioTrans equ 0x00 ; bandera que indica que se empieza a transmitir.


MemoBitAnt equ 0x01 ; Guarda el ultimo BIT recibido
Transmitiendo equ 0x02 ; indica que hay una transmisión en proceso
CaracterListo equ 0x03 ; se recibió ya un carácter valido

;*****************************
;* DECLARACION DE REGISTROS *
;*****************************

16
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

Wtemp equ 0x0c ; Copia del aculumador


STATUStemp equ 0x0D ; Copia del registro STATUS
PCLATHTemp equ 0x0E ; Copia de los datos del PCLATH
Palabra232 equ 0x0F ; Aquí se reúnen todas las banderas del protocolo
DatosTx equ 0x11 ; Configuración y estado de la TX
ContadorTx equ 0x12 ; Coordina la detección del ultimo bit
TempoTx equ 0x13 ; Contador de los tres muestreos
UltimoCar equ 0x14 ; Ultimo carácter recibido
DatosRx equ 0x15 ; Configuración y estado de la Rx
CuentaByte equ 0x16 ; Lleva la cuenta de los 8 bits que llegan
EstadoRx equ 0x17 ; Controla el estado de la recepción
Promedio equ 0x18 ; Ayuda a prevenir falsos bits
Microseg equ 0x19 ; Cuenta los intervalos de 138useg (muestreo)
Milis equ 0x20 ; Cuenta los intervalos de 0.01 sec (Indicador)

;***********************************
;* DECLARACION DE otros REGISTROS *
;***********************************

RespuestaMicro equ 0x21 ; carácter a transmitir

;***********************************
;* INICIO CODIGO *
;***********************************

ORG 0x0000 ; Primera operación:


goto PIC_POWER_ON ; salto a la rutina de arranque

;*****************************
;* INTERRUPCION *
;*****************************

ORG 0x0004 ; Posmem de las rutinas de interrupción

INTERRUPT

;--------------------------------------------------
;Se salvan los valores de los registros del sistema
;--------------------------------------------------
GuardaVector
movwf Wtemp
swapf STATUS, W
movwf STATUStemp
movf PCLATH, W
movwf PCLATHTemp

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 17


Universidad de Manizales, enero – junio / 2004

;--------------------------------------------------
;Se reinicia el conteo
;--------------------------------------------------
movlw DEFINET ; Recargar el TMR0 para otros
movwf TMR0 ; 138 microsegundos
bcf INTCON, T0IF ; Borrar banderas de interrupción
;----------------------------------------------------------------
;Tomar tres muestras de los datos de entrada para descartar oscilación
;----------------------------------------------------------------
MuestreaBit
clrf Promedio
btfsc PORTB, EntradaBits
incf Promedio, F
btfsc PORTB, EntradaBits
incf Promedio, F
btfsc PORTB, EntradaBits
incf Promedio, F ; En esta bandera se almacena el promedio
de
; los datos de entrada
;----------------------------------------------------------------
; Rutinas de transmisión
;----------------------------------------------------------------
transmisión
btfsc Palabra232, InicioTrans ; Si la bandera es verdadera
goto IniciaTransmision ; inicie la transmison
btfss Palabra232, Transmitiendo ; si no se está en proceso de
goto recepción ; transmisión ir a recepción.
decfsz TempoTx, F ; Transmisión en proceso, si no estan
goto recepción ; las tres muestras, ir a recepción
; si ya estan enviar el siguiente bit
;----------------------------------------------------------------
;enviar el siguiente bit
;----------------------------------------------------------------
EnviarBit
movf DatosTx, W ; Lleva el valor de DatoTx,0 a SalidaBits,
xorwf PORTA, W
andlw b'00000001'
xorwf PORTA, F
bsf STATUS, C ; C=1, al rotar DatosRx ingresa como el
rrf DatosTx, F ; Bit de parada
movlw 0x03 ; Se envia un bit cada tres llamados
movwf TempoTx ; a la interrupción
decfsz ContadorTx, F ; ya se enviaron los 10 bits?
goto recepción ; no, ir a recepción; si, finalizar TX

18
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

FinTransmision
bcf Palabra232, Transmitiendo ; fin de la transmisión
goto recepción ; ir a recibir otro bit
;----------------------------------------------------------------
;Transmitir un dato
;----------------------------------------------------------------
IniciaTransmision
movlw d'10' ; se tienen que enviar diez bits:
movwf ContadorTx ; 8 bits + 1 stop bit + 1 bit para separación
bsf Palabra232, Transmitiendo ; Activar transmisión
bcf Palabra232, InicioTrans ; desactivar Iniciar transmisión
movlw 0x03 ; hay que contar tres interrupciones
movwf TempoTx
bcf PORTA, SalidaBits ; Enviar start bit
;----------------------------------------------------------------
;Rutinas de recepción
;----------------------------------------------------------------
recepción
clrf PCLATH ; Segun el valor que traiga el registro
movf EstadoRx, W ; EstadoRx de las otras rutinas se
selecciona
addwf PCL, F ; la rutina actual
goto DeteccionInicio ; EstadoRx=0, Verfificar si hay Start
Bit
goto BitInicioOk ; EstadoRx=1, Comprobar que no sea falso
start
goto Iniciarecepcion ; EstadoRx=2, Empieza a capturar el
Byte
goto Espera ; EstadoRx=3, Espera la próxima INT
goto RecibirBit ; EstadoRx=4, Capturar el bit que sigue
goto DetectaUltimoBit ; EstadoRx=5, Ver si ya es el bit 7
goto Espera ; EstadoRx=6, Espera la próxima INT
goto StopBitOk ; EstadoRx=7, Recupera el byte completo

DeteccionInicio
btfss Palabra232, MemoBitAnt ; la linea estaba en 1?
goto END_INTERRUPT ; no, entonces no es Start Bit
btfsc Promedio, 1 ; si, pero, el dato actual es 0?
goto END_INTERRUPT ; no, falso arranque, esperar a otra
INT
incf EstadoRx, F ; si, entonces si es el Start bit, comenzar
goto END_INTERRUPT ; recepción, esperar el próximo ciclo

BitInicioOk
incf EstadoRx, F ; entró otro bit? no, entonces fue un

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 19


Universidad de Manizales, enero – junio / 2004

btfsc Promedio, 1 ; falso arranque, empezar de nuevo


clrf EstadoRx ; si, empezar recepción
goto END_INTERRUPT

Iniciarecepcion
movlw 0x08 ; hay que capturar un byte
movwf CuentaByte
incf EstadoRx, F ; EstadoRx = 3
goto END_INTERRUPT

Espera
incf EstadoRx, F ; esperar otro ciclo
goto END_INTERRUPT

RecibirBit
rrf Promedio, F
rrf Promedio, F
rrf DatosRx, F ; se captura el bit actual
incf EstadoRx, F ; ir a "DetectaUltimoBit" a ver
; si es el ultimo
goto END_INTERRUPT

DetectaUltimoBit
movlw 0x06 ; sin es el ultimo espera la ultima vez
decfsz CuentaByte, F ; cuantos bits van?
movlw 0x03 ; todavía faltan bits ir a leer otro
movwf EstadoRx
goto END_INTERRUPT

StopBitOk
clrf EstadoRx ; Inicializar registro para otra lectura
btfss Promedio, 1
goto FalsoFin
bsf Palabra232, CaracterListo ; Indica que se tiene el
carácter
movf DatosRx, W ; Salvar
movwf UltimoCar
goto END_INTERRUPT

FalsoFin
clrf EstadoRx ; empezar de nuevo
;----------------------------------------------------------------
;Fin de Rutinas de recepción
;----------------------------------------------------------------
END_INTERRUPT

20
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

bcf Palabra232, MemoBitAnt ; salvar valores de las banderas


btfsc Promedio, 1 ; para la próxima interrupción
bsf Palabra232, MemoBitAnt ;
decfsz Microseg, F ; registros utilizados para el led
goto RecuperaVector ; indicador
movlw d'72' ; se decrementa durante 72 INT
movwf Microseg ; aproximadamente 10 milisegundos
incf Milis, F

RecuperaVector
movf PCLATHTemp, W ; Recupera los registros
movwf PCLATH
swapf STATUStemp, W
movwf STATUS
swapf Wtemp, F
swapf Wtemp, W
RETFIE

;*****************************
;* FIN DE INTERRUPCION *
;*****************************

;*****************************
;* INICIALIZAR REGISTROS *
;*****************************

PIC_POWER_ON
clrwdt ; No se usa el watch dog timer
clrf INTCON ; ni el resto de las interrupciones
bsf STATUS, RP0 ; configurar los puertos
movlw b'00000000'
movwf TRISA
movlw b'00000001'
movwf TRISB
movlw b'00001000' ; Configurar las interrupciones
movwf OPTION_REG
bcf STATUS, RP0
clrf PORTB
movlw b'00000001' ; La linea de comunicaiones debe
movwf PORTA ; permanecer en 1
;---------------------------------------------------
; Borrar todas las posiciones de memoria
;---------------------------------------------------
movlw 0x0C ; hay que borrar 50 posiciones

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 21


Universidad de Manizales, enero – junio / 2004

movwf FSR ; partiendo desde 0x0c

BorraMem
clrf INDF
incf FSR, F
movlw 0x50 ; Ciclo repetido 50 veces
subwf FSR, W
btfss STATUS, C
goto BorraMem
;---------------------------------------------------
; Habilitar el TMR0
;---------------------------------------------------
clrf TMR0
bsf INTCON, T0IE ; Solo se habilita el TMR0
bsf INTCON, GIE

;*****************************
;* RUTINA PRINCIPAL *
;*****************************

MAIN
clrf Milis

EsperaLedActivo
btfsc Palabra232, CaracterListo ; ya se tiene el carácter?
call PreparaResp ; responder
movlw d'50'
subwf Milis, W ; si ya pasaron 500 milisegundos
btfss STATUS, C ; cambiar el estado de led piloto
goto EsperaLedActivo ; si no esperar (la variable Milis
call CambiaPiloto ; se actualiza en las INT
goto MAIN

;*****************************
;* FIN DE RUTINA PRINCIPAL *
;*****************************

;---------------------------------------------------
; Parpadeo del led piloto
;---------------------------------------------------
CambiaPiloto
movlw b'00100000' ; Invertir el estado del
xorwf PORTB, F ; Led
Return
;---------------------------------------------------

22
CENTRO DE INVESTIGACIONES Y DESARROLLO – FACULTAD DE INGENIERÍA

; Definir el dato que se va a responder


;---------------------------------------------------
PreparaResp
bcf UltimoCar,5 ;Convertir mayúscula
bcf Palabra232, CaracterListo
call EnviaResp
Return
;---------------------------------------------------
; Enviar la respuesta
;---------------------------------------------------
EnviaResp
btfsc Palabra232, Transmitiendo ; esperar hasta que se
detenga
goto EnviaResp ; una posible transmisión
movwf DatosTx ; Llevar al dato a transmitir
; al registro DatosTx
bsf Palabra232, InicioTrans ; inicia transmisión
Return
END
;***********************************
;* FIN CODIGO *
;***********************************

Perspectivas de Desarrollo

El circuito descrito anteriormente presenta una manera simple de realizar


intercambio de información entre diferentes elementos y un microcontrolador
16F84, característica muy importante y que debe ser tenida en cuenta en el
momento de diseñar e implementar aplicaciones embebidas o cualquier otro
tipo de aplicación
Este tipo de comunicación es apenas el paso inicial en el desarrollo de
aplicaciones que tengan posibilidades de comunicación más poderosas, si se
quieren diseñar aplicaciones con características de comunicación mucho
más robustas debe tenerse en cuenta, que como consecuencia de las
tendencias actuales en el manejo de la información, esta ya no es un
componente estrictamente local si no que debe tenerse la posibilidad de ser
accedida desde cualquier lugar, característica no debe ser ajena a las
aplicaciones embebidas, las cuales deben encaminarse hacia la
interconectividad a un nivel más alto

Protocolos como PPP y TCP/IP permiten la interconexión hacia redes de


mucho mayor tamaño, algunos elementos en el mercado permiten adicionar
en aplicaciones basadas en microprocesadores y microcontroladores, la
utilización de estos elementos o la implementación directa de algunas

Implementación de una interfaz … - Ramírez Delgado Wilder (2003) – pp 69-91 23


Universidad de Manizales, enero – junio / 2004

características de estos protocolos permitirán diseñar aplicaciones que irían


desde simple supervisión y monitoreo hasta sistemas muchos más robustas
como procesamiento distribuido, la implementación de estos protocolos y su
aplicación práctica está actualmente en curso y será presentado a la
comunidad académica a través de este medio más adelante.

Bibliografía

BENTHAM, Jeremy. TCP/IP Lean, Web Servers For Embedded Systems,


2002, CMP Books

DUQUE Edison, Curso Avanzado de microcontroladores pic, 1998, ed.


CEKIT

HINTZ, Kenneth y TABAK, Daniel. Microcontrollers. Architecture,


implementation & Programming. Singapur, 1992, McGraw Hill.

LAVARELLO, Alejandro. Proyectos con Microcontroladores, Uruguay, e-mail:


alejol@montevideo.com.uy

www.maxim.com

www.microchip.com

24

Vous aimerez peut-être aussi