Transmision de datos por radiofrcuencia
description
Transcript of Transmision de datos por radiofrcuencia
1
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
2
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
7 Bibliografía.......................................... 35
3
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.
4
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.
5
Detalles de la descripción de los pines:
6
Los pins que son accesibles al exterior:
Configuración de los pines de la placa RF:
7
Resumen de los valores mínimos, máximos y tipos para
algunos pins del chip:
8
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:
9
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:
10
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
11
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
12
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
D14 = 0
13
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.
• Fdev = +/- 125kHz.
14
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
sincronizador de bit
15
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.
- 0: modo receptor.
16
• 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.
17
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
18
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
19
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
20
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
21
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
END
22
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
return
23
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
ContPar = Contador de paridad
24
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
25
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.
26
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.
27
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 ts2 code
28
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 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
29
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 movlw 14h ; Esperar 833+833/2 ms (20d)
30
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 END
31
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
32
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
33
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
34
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 END
35
7 Bibliografía
E. Martín Cuenca “Microcontroladores PIC”
Ed: Paraninfo, 1998