Transmisión de datos por Radio Frecuencia
Diseño de Sistemas Basados en Microcontrolador
Universidad de Las Palmas de Gran Canaria
2003 - 04
José Carlos Ruiz Luque Francisco García Rodríguez
CONTENIDOS
Introducción ... 3
Componentes ... 3
Desarrollo práctico ... 3
1 Placa Radio frecuencia XE1201 ... 4
1.1 Envío de un bit continúo ... 15
2 Protocolo de comunicaciones ... 20
2.1 Material ... 21
2.2 Algoritmo ... 21
3 Comunicación por radiofrecuencia ... 24
4 Indicaciones de uso rápido ... 25
5 Ampliaciones ... 26
6 Ficheros ... 27
Programa 1: Protocolo de comunicación ... 27
Programa 2: Programa principal ... 31
Introducción
En el desarrollo de la práctica se utilizará el transceptor XE 1201 para la comunicación entre varios equipos.
Se ha planteado el desarrollo de la práctica en forma piramidal, cuya base será la de configurar el transceptor y de la transmitir un bit siendo capaz de captar el bit por el receptor.
En cada nivel se irá aumentando la complejidad de la información necesitando para ello un protocolo de comunicación, como el rs-232, hasta llegar a trasmitir a la frecuencia de las placas.
Componentes
Para la comunicación de radio frecuencia:
• Dos placas RF(radio frecuencia) con el chip XE1201 empotrado
Para el control de la placa XE 1201:
• Dos pic 16f84
• Placa AC84
Desarrollo práctico
La elaboración de la práctica se ha orientado en una jerarquía de etapas. A continuación se expondrá un breve resumen de las mismas:
• Primera Etapa: “Envío de un bit continuo” alternado su valor entre 0 y 1 con el interruptor de la placa de desarrollo.
• Segunda etapa: Implementación del protocolo RS-232.
• Tercera etapa: Combinación de las dos etapas anteriores
Tras enunciar las etapas de realización de la práctica se profundizará en cada etapa en los recursos usados y en el código ensamblador del pic.
1 Placa Radio frecuencia XE1201
El XE1201A es un transceptor FSK half-duplex que opera en banda ISM1 (optimizada) de 433 Mhz y en banda de 300-500Mhz.
Aplica la modulación por desplazamiento de frecuencia de fase continua a 2 niveles (CPFSK). La conversión directa de la arquitectura del receptor permite al chip filtrar los canales.
El XE1201A incluye un sincronizador de bit que genera datos libres de interferencia y un reloj sincronizado a los datos facilitando a un microcontrolador adquirir los datos sin mucha complejidad. La alimentación de energía es de 3.5V y puede ser controlada por medio del bus o por los pins Vcc y Vss. El XE1201A usa el estándar I-ETS300-220.
Figura del XE1201A
1
Como ya dice la definición de ISM en ingles esta es una banda para el uso: industial, científico y médico, en la cual no es necesaria la posesión de una licencia para poder ser utilizada. Esta banda tiene varios rangos de frecuencias una que está en Europa en los 433 Mhz normalmente usada para los telemandos de garajes; otra en los 850 MHz para el uso de aplicaciones que necesitan una mayor ancho de banda como pueden ser periféricos de ordenadores (ratones, teclados, etc.) Y una alrededor de los 2,4 Ghz que puede ser usada ya par la realización de redes de ordenadores inalámbricas.
Los pins que son accesibles al exterior:
Resumen de los valores mínimos, máximos y tipos para algunos pins del chip:
Lógica de control a través de 3 cables
El transceptor puede se configurado en varios modos a través de la interfaz del bus 3 cables. Esta interfaz consiste de un registro desplazador, que recoge cada bit de dato en cada nuevo flanco de subida del SC (reloj serial).
El circuito interno incorporado chequea la validez de algunas entradas y cuenta el número de flanco de subida de la señal SC. El dato será transferido desde el registro desplazador al correspondiente registro de configuración, si sólo si el flanco de subida 16 ha sido detectado en el reloj serial (SC). Después del decimosexto flanco de subida, se debe activar la señal SE (habilitación serial).
La habilitación de la señal SE indica que ha terminado la configuración del registro.
En la figura siguiente se nuestra el tiempo mínimo necesario que el dato debe estar estable antes de un flanco de subida de SC en el bus serial.
La transmisión de la configuración a través de la interfaz del bus de 3 claves se empieza por el bit más significativo (MSB) hasta el bit menos significativo (LSB). Cada paquete de transmisión tiene la siguiente configuración:
Registros internos
Las características principales de transceptor son configuradas por medio de la interfaz bus de 3 cables y registros internos (A, B, C). Como la frecuencia de desmodulación, la habilitación del reloj, la frecuencia de dato, etc. puede ser programado. Los primeros 2 bits D15 y D14 determinan el acceso a los registros A, B o C a través de la siguiente tabla de verdad:
Los 3 registros son rellenado por los datos A13 a A0, B13 a B0 o C13 a C0 de acuerdo a los valores del los bits de 15 y 14.
El registro A
Este registro es usado para establecer el modo del transceptor (modo emisor, modo recepto y modo stand-by) y seleccionar la frecuencia de recepción.
Se accede al registro con lo siguiente valores de en los bit 15 y 14:
D15 = 0 D14 = 0 Formato de los datos:
Control de modo:
Cuando es 0, este bit permite el control de los 3 modos de funcionamiento del transceptor y la activación del chip para ser dirigido mediante los pin15 (RxTx) y el pin1 (EN). Cuando es 1, el control de los modos de funcionamiento y de activación son dirigidos mediante los bits A10 y A11. En este modo los pines 15 y el pin 1 no tienen efecto.
Modo de control con el pin15 y pin1:
En este modo el transceptor puede ser apagado, encendido y configurado en modo emisor o receptor como se explica en la siguiente tabla y figura:
Diagrama de tiempo para el control con los pines RxTx y EN
Control de reloj:
Este bit indica si activar o no el reloj interno del XE1201A. Cuando es 1, el reloj siempre esta corriendo en cualquier caso de los estados del chip activo (bit A11 cuando A13=1 o pin1 cuando A13=0). Cuando es 0, la actividad del reloj es determinada por el bit(A11).
Activar el chip:
Cuando es cero, todas las señales del XE1201A están desactivadas (excepto el reloj si el bit A12 esta a 1). Sin embargo el bus de 3 cables puede ser programado en modo
desactivado mientras Vdd este presente. Este bit remplaza el Chip Enable (pin1) when A13=1.
RXTX:
Modo receptor/emisor. Cuando es 1, el transceptor es configurado como receptor y en modo transmisor cuando vale 0. Este bit reemplaza el RxTx (pin15) cuando A13=1.
Sync off
Estos bits son usados en aplicaciones cuando el sincronizador no es necesario.
1)El receptor está en modo normal pero se ignora el demodulador. La salida I y Q están habilitadas en el pin 19 y pin18 respectivamente. El valor A9 a A6 debe ser:
2)El receptor está en modo normal pero el sincronizador de bit interno está parado. Los datos sin traza (en bruto) están disponibles en el pin19 (RXD). El CLKD (pin18) es insignificante. En este modo, el preámbulo no es requerido para el sincronizador de reloj del sincronizador de bit así que el tiempo mínimo de reavivar el receptor es accesible. Los valores de A9 a A6 deben ser configurados como en la tabla siguiente:
Frecuencia de recepción:
Estos bits son usado para configurar el sincronizador de bit a la frecuencia de dato de acuerdo a la siguiente fórmula:
Donde el valor de n es un decimal si signo de los bit A5(MSB) a A0.
Nota: Cuando el sincronizador de bit esta en bypassed, no es necesario programar la frecuencia del dato. Los datos
son remodulados consecuentemente a frecuencia de dato de entrada.
El registro B
Este registro es usado para ajustar la frecuencia central durante la transmisión. Se accede a través:
D15 = 0 D14 = 1 Formato de los datos:
Frecuencia de offset. Estos bits pueden ser usados para calibrar la frecuencia central de oscilación.
Bits de test. Estos bits son solo para proposito de test. Debe ser configurado a 0.
El registro C
Este registro es usado para la frecuencia de desmodulación, establece los valores de la amplificación, ajuste de potencia de la trasmisión y otras funciones auxiliares. Es accedido con:
D15 = 1
Potencia de salida en la transmisión. Puede ser ajustada con el pin13 y pin12
Dato invertido en bit. Las tramas de datos recibidas están invertidas si el bit está 1.
Bit de test. Estos bits deben estar siempre configurados a C10 = 1 y C9 = 0
Habilitar el amplificador de salida transmitido. Cuando es cero, esta desactiva esta función.
Bit de dato trasmitido (TXD). Este bit replaza el pin 17 (TXD) cuando el bit 13 del registro A es configurado a 1 y así permite una transmisión de dato mediante el bus 3 cable.
Desviación de frecuencia. Estos bits son usado para ajustar la desviación de frecuencia del modulador.
Al activar el transceptor los registros son inicializados con los siguientes valores:
• Control pins.
• El reloj parado.
• Frecuencia de recepción a 16 KHz DR= 16 bits/s.
• PA = -12dBm.
Sincronizador de bit en modo receptor
El desmodulador interno del XE1201A necesita un dato de 20 bits sincronizado para asegurar un correcto reloj sincronizado. El dato de sincronización debe ser una secuencia de 0 y 1 enviado alternativamente.
A continuación se ilustra con dos figura la recepción de datos con sincronizador de bit o bypassed.
bypassed
1.1 Envío de un bit continúo
En esta etapa se realizó la comprobación del cable elaborado para la comunicación por la interfaz bus de 3 cables, el control del modo de funcionamiento y de la activación de las placas a través de los interruptores.
Las características de configuración del transceptor se realizarán a través del bus 3 claves. Sólo se configura el registro A, los registros B y C se mantendrán con los valores iniciales de la placa, ya que controlan algunos parámetros que no controlamos.
El único registro que modificaremos será el A para comprobar la función del código ensamblador de controla la transmisión serie de configuración del transceptor. La configuración de los registros es la siguiente:
reg 13 12 11 10 9 8 7 6 5 4 3 2 1 0
A 0 1 0 0 0 0 0 0 1 1 0 0 0 0
B 0 0 0 0 0 0 0 0 0 0 0 0 0 0
C 0 1 0 1 0 1 0 0 1 0 0 0 0 0
Tabla 1
Después de encender y haber sido configurado por el microcontrolador, el transceptor está en el estado siguiente: modo de control a través de las líneas RxTx(pin15) y EN (pin1), el reloj activo, frecuencia de datos 1 kbits/s, potencia de salida -5dBm, atenuación de la potencia de entrada al circuito, y desviación de frecuencia a 125 kHz. Listo para receptor o emisor.
Tras hablar de lo que se va realizar, y la configuración de los registros se comentará el código necesario para esta etapa.
Primero se comentará la configuración de los puertos para la comunicación del pic con el transceptor y vicersa.
En esta etapa el puerto A se configurará con los 3 bit menos significativo (LSB) como entrada:
• PORTA0: es el que controla el estado de funcionamiento de la placa,
- 1: El transceptor activo.
- 0: El transceptor desactivado
• PORTA1: Se indica el modo de funcionamiento
- 1: modo transmisor.
• PORTA2: el valor que disponga este puerto se
tendrá en cuenta cuando el modo de funcionamiento de la placa RF está en transmisor. El valor del puerto se transmitirá para el receptor. Los
valores que puede tomar este puerto son obvios al hacer un bit (0 o 1).
La ristra de configuración del puerto A es en binario “0 0111” y en hexadecimal “07”
La configuración del puerto B es meramente para la comunicación entre el pic y el transceptor. En la tabla se indica los pins del cable de conexión de la interfaz de la placa RF con el puerto B del pic:
Nombre de la linea Pin Interfaz placa Pin del puerto B Estado del pin puerto b TXD 1 0 Salida RxTx 10 1 Salida EN 8 2 Salida DE 6 3 Salida RXD 5 4 Entrada SC 4 5 Salida CLKD 3 6 Entrada SD 2 7 Salida
De la anterior tabla se extrae la ristra binaria “0101 0000” para la configuración del puerto, o en hexadecimal, 50h.
Al saber la configuración de los puertos se ilustra a continuación dicha configuración en el ensamblador del pic.
Se puede observar en el código que se ha puesto una inicialización al puerto B, cuyo valor en binario es “0000 1010”. El significado de la ristra, INI, es que las lineas “RxTx” y “De” esta activada.
El registro TRANS es un registro de 2 bytes que nos servirá para almacenar la configuración de los registros que se transmitirá por la interfaz del bus serie de 3 cables (3-wire serial bus). Se usa este registro de 16 en contra de uno de 8 bit para no producir retraso en la transmisión por el puerto serie.
Las etiquetas “Asup” y “Ainf” representa la configuración de registro de estado A que se comentó anteriormente (tabla 1).
La etiqueta “CONT” representa la dirección del registro CONT que se comenta posteriormente su funcionamiento en el código.
A continuación se muestra el código que prepara el registro TRANS con los valores correspondientes para la transmisión a la placa RF. La transmisión se realizará con
;; SIMBOLOS E EQU 3 SC EQU 5 SD EQU 7 BIT3 EQU 3 CLKD EQU 6 TXD EQU 0 RXD EQU 4 RxTx EQU 1 EN EQU 2 CONFA EQU 07h
CONFB EQU 50h ; Configuración del puerto B
ASup EQU 10h ; Mitad superior del registro A de xemics AInf EQU 30h ; Mitad inferior del registro A de xemics ;estado inicial del puerto B
INI EQU 0Ah
;Registros Generales utilizados TRANS EQU 0Ch ;tamaño 2 CONT EQU 0Eh
org 0 goto inicio
org 5
; configuramos el puerto B, interfaz con la placaRF BSF STATUS,RP0 MOVLW CONFB MOVWF TRISB MOVLW CONFA MOVWF TRISA BCF STATUS,RP0 ; inicializamos el puerto B MOVLW INI MOVWF PORTB
la función “transmitir” que se hablará de ella más delante de esta memoria.
En el código de utiliza un modo de direccionamiento indirecto para establecer los valores de TRANS.
Siguiendo el código original viene el bucle principal del programa que interactúa con el usuario, indicado el usuario el funcionamiento, modo de funcionamiento y cuando está o no habilitado el transceptor.
Lo más relevante del código es cuando el transceptor se encuentra en modo receptor no se mira el valor del puerto PORTA2, debido a que no va ser transmitido.
A continuación es expone el código de la función transmitir que se quedo antes sin hablar de ella:
; transmitimos el registro A MOVLW TRANS MOVWF FSR MOVLW ASup MOVWF INDF INCF FSR, F MOVLW AInf MOVWF INDF CALL transmitir Begin
BTFSC PORTA, 0 ; Se habilita o no el circuito? GOTO UNO
BCF PORTB, EN ; inhibe el circuito GOTO SIG2
UNO
BSF PORTB, EN ; se habilita el circuito SIG
BTFSS PORTA,1 ; Se configura en el modo de ejecución GOTO TRANSIM BSF PORTB, RxTx GOTO SIG2 TRANSIM BCF PORTB, RxTx BTFSC PORTA, 2 GOTO UNO1 BCF PORTB, TXD GOTO SIG2 UNO1 BSF PORTB, TXD SIG2 GOTO begin
Como sabemos ya en este punto la configuración del transceptor se realiza a través de los registros A, B, C y se transmite por le bus serial de 3 cables (3-wire serial bus). Las líneas que se involucran en este bus son SC (reloj serial), SD (dato serial), DE (dato habilitado) de la interfaz de la placa RF.
Se usa de nuevo un modo de direccionamiento indirecto para tener acceso a los valores que se van a transmitir.
Lo primero que realiza la función es estable DE a nivel bajo indicando al transceptor que estamos en un ciclo de configuración y resetea el valor del contador “CONT” a cero.
La transmisión se comienza por el byte más significativo (MSB) y por el MSb (bit más significativo).
Tras enviar los 8 bits que es controlado por el contador “CONT” se transmite el segundo byte del registro A. Al terminar la transmisión del último byte se activa la señal DE para confirmar al transceptor que la configuración del registro A se ha terminado.
transmitir MOVLW TRANS MOVWF FSR
BCF PORTB,E ; Duerme el dispositivo
CLRF CONT ; Reinicia contador
B1
BCF PORTB,SC ; Conmutar a bajo el reloj
RLF INDF,F ; Rotar a izquierda TRANS
BCF PORTB,SD ; Poner señal de envío a cero
BTFSC STATUS,C ; ¿ Enviar un 1 ?
BSF PORTB,SD ; Pone señal de envío a uno
BSF PORTB,SC ; Conmutar a alto el reloj
INCF CONT,1 ; Contar rotaciones realizadas
BTFSS CONT,BIT3 ; ¿ Se ha rotado 8 veces ?
GOTO B1 ; No, volver a empezar
CLRF CONT ; Si, reiniciar contador
INCF FSR,F ; Siguiente byte
B2 BCF PORTB,SC RLF INDF,F BCF PORTB,SD BTFSC STATUS,C BSF PORTB,SD BSF PORTB,SC INCF CONT,1 BTFSS CONT,BIT3 GOTO B2
BSF PORTB,E ; Configuración terminada
NOP
BCF PORTB,SC BCF PORTB,SD RETURN
2 Protocolo de comunicaciones
Antes de comunicar cualquier dato entre las placas se hace necesario crear un protocolo de transmisión que además deberá ser probado inicialmente con dos PICS conectados físicamente para descartar posibles problemas en el manejo de las placas y centrarnos únicamente en el algoritmo.
Se ha escogido el protocolo RS232 por ser el más familiar al haber trabajado con él previamente. Al tratarse de una primera versión y en este caso inicial, se modificó para que fuese lo bastante lento como para poder observar visualmente su funcionamiento y la transmisión en curso.
Linea = Linea comunicación Cont = Contador
Nótese que el programa no empieza antes de 12 marcos de bits, esta espera tan larga la utilizaremos para asegurar que no se empieza a procesar en medio de la transmisión de un byte.
2.1 Material
Las pruebas del protocolo se realizan conectando con un cable alguno de los conectores del puerto A de dos PICS, dejando enteramente libre el B para poder mostrar con los leds el estado de la transmisión. En el receptor, además, se emplea el display led de 7 segmentos incorporado en las tarjetas de entrenamiento para mostrar la codificación del número enviado.
Los dos primeros switchs controlan el funcionamiento de las placas. El RA0 decide si el circuito está activado y el RA1 en qué modo lo hacen.
0 Transmisor 1 Receptor
2.2 Algoritmo
La implementación del programa hace uso de interrupciones para controlar el tiempo que ha de tardar un marco de bit. Como éstos duran 833 milisegundos y necesitamos desbordar varias veces el timer calculando múltiplos de 64 milisegundos, podemos resumir los valores que necesita tomar el contador según la parte del programa. Desbordamientos:
01 - Espera start bit = 64 ms
19 - Leer primer BIT = 833 + 833/2 ms 13 - Lectura de bits = 833 ms
RSI MOVWF Temp ; Guardamos W
DECFSZ Contador,1 ; Decrementa contador. Contador = 0? GOTO SEGUIR ; Si contador != 0 ir a Seguir MOVLW 01h ; Continuar cede el paso
MOVWF Continuar
SEGUIR MOVLW V_TIMER0
MOVWF TIMER0 ; Recarga TMR0
BCF INTCON,TOIF ; Borra bandera de interrupción BSF INTCON,TOIE ; Rehabilita interrupción RTIE
MOVFW Temp ; Restaura W
RETFIE ; Repone GIE y Retorna
La interrupción lo único que hace una vez lanzada, es decrementar un contador que fija cuántas veces ha de desbordarse el timer antes de poner a uno el bit de Continuar, con lo cual la función retardar conocerá el tiempo que ha de retrasarse según el valor que le demos a dicho contador.
De hecho, como esta es la única parte del programa donde interesa conservar interrupciones, la propia subrutina se encarga de activar las interrupciones antes de entrar y desactivarlas al salir.
Para llamarla, lo único que se necesita es que se le pase en el registro W el tiempo que ha de esperar en múltiplos de 64 milisegundos.
La lectura de datos se realiza desde una función específica que realiza todas las tareas necesarias para captar el bit.
Como queremos tener un duplicado del byte enviado, se insertan los bits uno a uno en un registro empezando por la izquierda. Según sea un uno o un cero, se coloca en el bit de desbordamiento de STATUS para que la función de rotación lo coloque al final de la variable.
RETARDAR
movwf Contador ; Tiempo espera (x64ms)
clrf Continuar
BANCO1
movlw b'00000111'
movwf OPCION
BANCO0
movlw V_TIMER0 ; Desbordar cada 64 ms
movwf TIMER0 movlw b'10100000'
movwf INTCON ; Activa GIE y TOIE
LOOP1 btfss Continuar,0 ; Esperar señal de continuar
goto LOOP1
movlw 00h
movwf INTCON ; Activa GIE y TOIE TMR0
LEER btfsc LINEA_IN ; Mirar la LINEA_IN
goto LEER1 ; Poner un 1
bcf STATUS,0 ; Poner un 0
rrf Dato,1 ; Rotamos y lo cargamos
return
LEER1: bsf STATUS,0 ; Ponemos bit en STATUS,0
rrf Dato, 1 ; Rotamos sin cambiar W
incf C_Paridad,1 ; Incrementar contador de paridad
El algoritmo inicial del receptor es la implementación directa del diagrama puesto al principio de esta sección.
En cuando al emisor, sigue la secuencia expuesta en esta página.
Durante la creación del protocolo, tanto emisor como receptor fueron desarrollados por etapas.
En la primera se eludieron los bits de paridad. El emisor enviaba un byte programado y el receptor al recogerlo, limpiaba el puerto B y volcaba el byte reconocido. Luego se añadió el control de errores con un bit de paridad y se enviaron varios bytes en cadena. El objetivo era
observar posibles problemas al recibir una
transmisión contínua de bytes, la recepción correcta del resto de datos cuando se encendía el receptor en medio de una transmisión y la detección de errores cuando desconectábamos durante un tiempo el cable de datos para simular una alteración de la señal.
Linea = Linea comunicación Cont = Contador
3 Comunicación por radiofrecuencia
Después de depurar el protocolo de comunicación, se procede a unir el código de configuración de las placas y el de la transmisión, así, donde antes teníamos una unión física con los cables entre los pics, ahora tenemos las terminales RxD y TxD de las placas transceptoras.
Se conectan las placas siguiendo los pasos de la sección 4 sobre uso rápido. Luego se repiten los pasos de comprobación que se realizaron cuando la conexión era física.
Una vez solucionados todos los inconvenientes surgidos, se decide ampliar la funcionalidad de las placas utilizando el teclado alfanumérico, para que espere en un bucle la pulsación de una tecla que decidirá el byte a enviar. Como se devuelve el código decimal, se necesita construir una tabla que los traduzca al display de 7 segmentos que se utilizará para mostrar los datos.
Como consecuencia del uso completo del puerto B, no se puede mostrar indefinidamente el byte recibido por el display, así que se recurre a la función RETARDAR del protocolo para mostrarlo un corto tiempo mientras se deshabilita el receptor.
CODIGONUMERO
MOVLW high CODIGONUMERO
MOVWF PCLATH
MOVF POS, W
ADDWF PCL, 1
retlw 3Fh ; código del 0
retlw 06h ; código del 1
retlw 5Bh ; código del 2
retlw 4Fh ; código del 3
retlw 66h ; código del 4
retlw 6Dh ; código del 5
retlw 7Dh ; código del 6
retlw 07h ; código del 7
retlw 7Fh ; código del 8
retlw 67h ; código del 9
RETLW 77h ; A RETLW 7Ch ; B RETLW 39h ; C RETLW 5Eh ; D RETLW 79h ; E RETLW 71h ; F
4 Indicaciones de uso rápido
Estos son los pasos a seguir para empezar a usar inmediatamente las placas con los programas incluidos.
1. Cargar el proyecto incluído en final.hex o compilarlo de las fuentes para cargarlo en dos placas de laboratorio con el pic 16F84.
2. Conectar al zócalo de ampliación un conector adaptado para introducir los cables necesarios del conector de la placa. Suministrar a las tarjetas transceptoras una tensión de 3,5 voltios y unir sus tierras con la de las placas. Por último se debe asegurar que se conectan adecuadamente las líneas por donde se transmiten los datos. Inicialmente la línea de recepción está incluida en el zócalo, pero la trasmisora se conecta a la pata TxD de las placas.
3. En la placa destinada a ser la receptora, conmutar los dos primeros switchs del puerto a (RA0 y RA1) a uno, y en la transmisora conmutar el primero a uno y el segundo a 0. El primero indica que se desea activar las placas y el segundo el modo bajo el que funcionarán.
4 Pulsar en el teclado alfanumérico una tecla, a continuación se transmitirá por radiofrecuencia en un plazo de 13,3 segundos el byte pulsado. En el display de 7 segmentos de la receptora justo antes de mostrarse el byte, se activará el punto para a continuación, exhibirse durante 1,5 segundos la tecla pulsada.
Nótese que como el protocolo de comunicaciones se incluye en forma de librería, éste puede mejorarse siendo los cambios transparentes para el programa principal siempre y cuando se respeten las funciones exportadas en el include.
El proyecto ocupa la mayor parte de los puertos, de hecho ocupa todo el puerto B salvo el RB4 y del A solamente coge el RA4. Sin embargo, cuando no transmite, se puede poner en suspensión la placa y mientras tanto, todo el puerto B queda libre.
Si se necesitase cambiar las líneas por donde se comunican los datos, existe una macro para que esto pueda realizarse sin problemas.
5 Ampliaciones
Se proponen diversos proyectos para los que se pueden utilizar estas placas.
1. Interfaz entre periféricos del ordenador como ratones, teclados o placas de adquisición de datos. Como las señales son digitales, se pueden usar directamente las patas emisoras y receptoras de las placas, además, la comunicación puede ser en dos sentidos.
2. Control y/o monitorización de dispositivos remotos.
3. Implementación de protocolos específicos para comunicaciones inalámbricas, con control de errores y verificación de tramas.
4. El protocolo actual no aprovecha el reloj para leer los datos enviados, ni cambia dinámicamente de función para el control de errores.
6 Ficheros
Programa 1: Protocolo de comunicación
Esta es la implementación de la versión simple del protocolo RS232 adaptada ya para ser usado como una librería usando memoria dinámica. ;; PROTOCOLO RS232 simple
;;
;; Programa que lee el bit que llega por una LINEA y lo procesa según ;; las normas RS232. Trabaja con un periodo de 833ms. Espera start bit ;; escaneando cada 64ms
;;
;; Transmisor:: El retardar va después de escribir en la línea ;; Receptor:: El retardar va antes de leer la línea
;;
;; José Carlos Ruiz Luque ;; Francisco García Rodríguez ;;
;; NOTAS
;; El programa principal ha de controlar que los puertos esten ;; configurados correctamente como entrada o salida
;; Cálculos para el contador ;;
;; 832ms = 256x13x (TMR0 = 256 - 250,30048) ;;
;; Cuenta para esperar Sync = 100 #include "p16f84.inc"
;; Macros
#define LINEA_OUT PORTB,0
#define LINEA_IN PORTB,4
#define V_TMR0 06h
#define BANCO1 bsf STATUS,RP0
#define BANCO0 bcf STATUS,RP0
GLOBAL Dato, Eviar, TRANSMITIR, ESTADO, RECIBIR, RSI, Contador, Continuar, RETARDAR
udata ;; VARIABLES
Contador res 1 ; Estado del circuito Temp res 1 ;
Continuar res 1 ; Numero leído Veces res 1 ; Variable para RSI Eviar res 1 ; BYTE enviado
C_Paridad res 1 ; Contador de paridad
Dato res 1 ; BYTE recibido
Recepcion res 1 ; Indica si hubo un error
ESTADO res 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; RETARDAR
;;
;; Recoge en W el tiempo que pone en espera el micro en múltiplos de ;; 64 milisegundos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RETARDAR
movwf Contador ; Tiempo espera (x64ms) clrf Continuar ;; Preparar interrupciones BANCO1 movlw b'00000111' movwf OPTION_REG BANCO0
movlw V_TMR0 ; Desbordar cada 64 ms movwf TMR0
movlw b'10100000'
movwf INTCON ; Activa GIE y TOIE TMR0 LOOP1
btfss Continuar,0 ; Esperar señal de continuar goto LOOP1
;; Deshabilitar interrupciones movlw 00h
movwf INTCON ; Desactiva GIE y TOIE TMR0 return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Leer :: Lee el dato de la linea y lo pone al final de Dato después ;; de desplazarlo.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LEER
btfsc LINEA_IN ; Mirar la LINEA_IN goto LEER1 ; Poner un 1
bcf STATUS,0 ; Poner un 0
rrf Dato,1 ; Rotamos y lo cargamos return
LEER1:
bsf STATUS,0 ; Ponemos bit en STATUS,0 rrf Dato, 1 ; Rotamos sin cambiar W
incf C_Paridad,1 ; Incrementar contador de paridad return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; TRANSMITIR :: Transmite el byte contenido en la variable Eviar ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TRANSMITIR
clrf C_Paridad bsf LINEA_OUT
movlw 0E1h ; Esperar 833x15 ms call RETARDAR
;; Start bit
bcf LINEA_OUT
movlw 0Dh ; Esperar 833 ms call RETARDAR
movlw 08h
movwf Veces
LOOP_BYTE ;; Envío del byte
btfss Eviar,0 ; Enviar 1 ó 0?
goto ENVIA_0 ; 0
bsf LINEA_OUT ; 1
incf C_Paridad,f ; Incrementar contador de paridad
goto RESTAR ENVIA_0 bcf LINEA_OUT RESTAR rrf Eviar,1 movlw 0Dh ; Esperar 833 ms call RETARDAR decfsz Veces,f goto LOOP_BYTE ;; Bit de paridad btfss C_Paridad,0 ; ¿Paridad?
goto T_PAR ; PAR
bsf LINEA_OUT ; IMPAR goto T_FIN T_PAR bcf LINEA_OUT T_FIN movlw 0Dh ; Esperar 833 ms call RETARDAR MOVLW 06h MOVWF Eviar return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; RECIBIR :: Recoge el byte enviado por LINEA_IN y lo guarda en Dato ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RECIBIR
movlw 9Dh ; Veces que debería desbordarse
movwf Veces
clrf C_Paridad ; Resetear bit de paridad
EST01 ;; Estado 01 -- Espera start bit
movlw 01h ; Esperar 64 ms
call RETARDAR
decfsz Veces,1 ; Decrementa Veces
goto A01 ; Aún no es 0
incf Veces,1 ; Ya es 0
A01 btfsc LINEA_IN ; ¿Linea ha pasado a 0?
goto EST01 ; Aún no
decfsz Veces,1 ; Si, ¿Ha durado lo suficiente?
goto RECIBIR ; No
EST02 ;; Estado 02 -- Saltar start bit y leer primer dato
call RETARDAR
call LEER
movlw 07h ; Ahora tomaremos otros 7 bits
movwf Veces
EST03 ;; Estado 03 -- Leer 7 bits restantes
movlw 0Dh ; Para esperar 833 ms (13d)
call RETARDAR
call LEER
decfsz Veces,1 ; ¿Leído un byte?
goto EST03 ; No
bsf PORTB,7
;; Estado 04 -- Leer bit de paridad
movlw 0Dh ; Para esperar 833 ms (13d)
call RETARDAR
;; Comprobar bits de paridad btfsc LINEA_IN
goto IMPAR ; Linea = 1 PAR btfss C_Paridad,0 ; Linea = 0
goto BIEN goto MAL IMPAR Btfsc C_Paridad,0 goto BIEN MAL movlw 00h goto OK BIEN movlw 01h OK movwf ESTADO return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Rutina de Servicio a la Interrupción. Estados:
;;
;; 01 - Espera start bit 64 ms
;; 19 - Leer primer BIT 833 + 833/2 ms ;; 13 - Lectura de bits 833 ms
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RSI MOVWF Temp ; Guardamos W
DECFSZ Contador,1 ; Decrementa. ¿Contador = 0? GOTO SEGUIR ; Si contador != 0 ir a Seguir
MOVLW 01h ; Continuar cede el paso
MOVWF Continuar
SEGUIR
MOVLW V_TMR0
MOVWF TMR0 ; Recarga TMR0
BCF INTCON,T0IF ; Borra bandera de interrupción BSF INTCON,T0IE ; Rehabilita interrupción RTIE
MOVFW Temp ; Restaura W
RETFIE ; Repone GIE y Retorna
Programa 2: Programa principal
Este es el programa principal con el que se configuran las placas y se envían todos los caracteres introducidos por el teclado.
;; PROTOCOLO RS232 simple ;;
;; Programa que lee el bit que llega por una LINEA y lo procesa según ;; las normas RS232. Trabaja con un periodo de 833ms. Espera start bit ;; escaneando cada 64ms
;;
;; José Carlos Ruiz Luque ;; Francisco García Rodríguez #include <P16F84.INC>
#include <ts2.inc> #include <tecla.inc> ;; Macros de atajo
#DEFINE ENABLEPLACA BSF PORTA,4
#DEFINE DISABLEPLACA BCF PORTA,4
#DEFINE BANCO1 BSF STATUS,RP0
#DEFINE BANCO0 BCF STATUS,RP0
;; SIMBOLOS para configurar las placas
E EQU 3 ; Validar dato
SC EQU 5 ; Reloj serial
SD EQU 7 ; Línea transmisión serial
BIT3 EQU 3 ;
CLKD EQU 6 ; Reloj
TXD EQU 0 ; Salida de datos
RXD EQU 4 ; Entrada de datos
RxTx EQU 1 ; Modo transmisor/receptor
EN EQU 2 ; Habilitar placa
;; Configuraciones para los registros de las placas
CONFA EQU 03h
CONFB EQU 50h ; Configuración del puerto
ASup EQU 10h ; Mitad superior del registro A de xemics
AInf EQU 30h ; Mitad inferior del registro A de xemics
INI EQU 08h ; Configuración inicial del puerto B
udata
;; Registros Generales utilizados
TRANS RES 2 ; Configuracion de 16 bits de la placa
CONT RES 1 ; Contador para los 8 bits
BACK RES 1 ; Guarda la configuracion del puerto B
HF code 0 goto INICIO Inter code 4 goto RSI CodPrin code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; CODIGONUMERO
;;
;; Convierte un un número binario a su correspondiente codificación ;; en el display de 7 segmentos. Utiliza W como variable de entrada y ;; salida
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CODIGONUMERO
MOVLW high CODIGONUMERO
MOVWF PCLATH
MOVF POS, W
ADDWF PCL, 1
retlw 3Fh ; código del 0
retlw 06h ; código del 1
retlw 5Bh ; código del 2
retlw 4Fh ; código del 3
retlw 66h ; código del 4
retlw 6Dh ; código del 5
retlw 7Dh ; código del 6
retlw 07h ; código del 7
retlw 7Fh ; código del 8
retlw 67h ; código del 9
RETLW 77h ; A RETLW 7Ch ; B RETLW 39h ; C RETLW 5Eh ; D RETLW 79h ; E RETLW 71h ; F ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ESCRIBIR ;;
;; Vuelca el byte recibido en el display de 7 segmentos y espera 1,5 s ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ESCRIBIR
BANCO1 ; Guarda la configuración del puerto B
movfw TRISB movwf BACK clrf TRISB BANCO0 movfw Dato movwf PORTB movlw 17h call RETARDAR BANCO1 movfw BACK movwf TRISB BANCO0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INICIO
;; Configuramos el puerto B, interfaz con la placa RF BANCO1 MOVLW CONFB MOVWF TRISB MOVLW CONFA MOVWF TRISA BANCO0 ;; Inicializamos el puerto B MOVLW INI MOVWF PORTB DISABLEPLACA ;; Transmitimos el registro A MOVLW TRANS MOVWF FSR MOVLW ASup MOVWF INDF INCF FSR, F MOVLW AInf MOVWF INDF CALL transmitirConf BEGIN ;; Se habilita o no el circuito BTFSC PORTA, 0 GOTO UNO
DISAB LEPLACA ; inhibe el circuito
GOTO BEGIN
UNO ;; Se configura en el modo de ejecución del transceptor SIG
BTFSS PORTA,1
GOTO TRANSIM
bsf PORTB, RxTx ; Funcionamiento Receptor
ENABLEPLACA ; se habilita el circuito
call RECIBIR call ESCRIBIR GOTO BEGIN TRANSIM Escanear call Key_Scan movlw 80h SUBWF Tecla, w btfss STATUS, 0
goto TCOD ; Ha leido algo
btfsc STATUS, 2 goto E scanear TCOD call Cods_Tecla call CODIGONUMERO movwf Eviar bsf OPTION_REG, NOT_RBPU
BANCO1 MOVLW CONFB MOVWF TRISB MOVLW CONFA MOVWF TRISA BANCO0 MOVLW INI MOVWF PORTB
bcf PORTB, RxTx ; Se configura como emisor ENABLEPLACA ; Se Activa la placa
call TRANSMITIR ; Se transmite el Dato DISAB LEPLACA ; Se desactiva la placa bcf PORTB, TXD
GOTO BEGIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; CONFIGURACION :: Transmitir en serie configuración de las placas ;;
;; Envía mitad superior y luego inferior del registro de ;; configuración de las placas a un ritmo de 5us cada
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; transmitirConf
MOVLW TRANS MOVWF FSR
BCF PORTB,E ; Comienza la configuración de la placa CLRF CONT ; Reinicia contador
B1
BCF PORTB,SC ; Conmutar a bajo el reloj RLF INDF,F ; Rotar a izquierda TRANS BCF PORTB,SD ; Poner señal de envío a cero BTFSC STATUS,C ; ¿ Enviar un 1 ?
BSF PORTB,SD ; Pone señal de envío a uno BSF PORTB,SC ; Conmutar a alto el reloj INCF CONT,1 ; Contar rotaciones realizadas BTFSS CONT,BIT3 ; ¿ Se ha rotado 8 veces ?
GOTO B1 ; No, volver a empezar
CLRF CONT ; Si, reiniciar contador INCF FSR,F ; Siguiente byte
B2 BCF PORTB,SC RLF INDF,F BCF PORTB,SD BTFSC STATUS,C BSF PORTB,SD BSF PORTB,SC INCF CONT,1 BTFSS CONT,BIT3 GOTO B2
BSF PORTB,E ; Configuración terminada NOP
BCF PORTB,SC BCF PORTB,SD RETURN
7 Bibliografía
E. Martín Cuenca “Microcontroladores PIC” Ed: Paraninfo, 1998