Download Transmisión de datos por Radio Frecuencia

Document related concepts
no text concepts found
Transcript
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
1
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
2
Introducción
En el
transceptor
equipos.
desarrollo de
XE 1201 para
la
la
práctica se
comunicación
utilizará el
entre varios
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.
3
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 300500Mhz.
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.
4
Detalles de la descripción de los pines:
5
Los pins que son accesibles al exterior:
Configuración de los pines de la placa RF:
6
Resumen de los valores
algunos pins del chip:
mínimos,
7
máximos
y
tipos
para
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:
8
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
en los bit 15 y 14:
D15 = 0
D14 = 0
Formato de los datos:
9
valores de
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
10
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
sincronizador no es necesario.
aplicaciones
cuando
el
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
11
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
12
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
inicializados con los siguientes valores:
•
•
•
•
•
Control pins.
El reloj parado.
Frecuencia de recepción
PA = -12dBm.
Fdev = +/- 125kHz.
a 16 KHz
13
registros
DR= 16 bits/s.
son
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
14
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
A
B
C
13
0
0
0
12
1
0
1
11
0
0
0
10
0
0
1
9
0
0
0
8
0
0
1
7
0
0
0
6
0
0
0
5
1
0
1
4
1
0
0
3
0
0
0
2
0
0
0
1
0
0
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
configuración de los registros se
necesario para esta etapa.
va realizar, y la
comentará el código
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.
15
•
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
TXD
RxTx
EN
DE
RXD
SC
CLKD
SD
Pin Interfaz
placa
Pin del
puerto B
1
10
8
6
5
4
3
2
0
1
2
3
4
5
6
7
Estado
del pin
puerto b
Salida
Salida
Salida
Salida
Entrada
Salida
Entrada
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.
16
;; 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
CONFB
ASup
AInf
EQU
EQU
EQU
EQU
07h
50h
10h
30h
; Configuración del puerto B
; Mitad superior del registro A de xemics
; 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
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”
configuración de registro de estado A
anteriormente (tabla 1).
La etiqueta “CONT” representa
registro
CONT
que
se
comenta
funcionamiento en el código.
representa
la
que se comentó
la dirección
posteriormente
del
su
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
17
la función “transmitir” que se hablará de ella más delante
de esta memoria.
; transmitimos el registro A
MOVLW TRANS
MOVWF FSR
MOVLW ASup
MOVWF INDF
INCF FSR, F
MOVLW AInf
MOVWF INDF
CALL transmitir
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.
Begin
UNO
SIG
BTFSC PORTA, 0
GOTO UNO
BCF PORTB, EN
GOTO SIG2
; Se habilita o no el circuito?
BSF PORTB, EN
; se habilita el circuito
BTFSS PORTA,1
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
; inhibe el circuito
; Se configura en el modo de ejecución
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
transmitir que se quedo antes sin hablar de ella:
18
función
transmitir
MOVLW TRANS
MOVWF FSR
BCF PORTB,E
CLRF CONT
B1
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 B1
CLRF CONT
INCF FSR,F
; Duerme el dispositivo
; Reinicia contador
; Conmutar a bajo el reloj
; Rotar a izquierda TRANS
; Poner señal de envío a cero
; ¿ Enviar un 1 ?
; Pone señal de envío a uno
; Conmutar a alto el reloj
; Contar rotaciones realizadas
; ¿ Se ha rotado 8 veces ?
;
No, volver a empezar
;
Si, reiniciar contador
; 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
NOP
BCF PORTB,SC
BCF PORTB,SD
RETURN
; Configuración terminada
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.
19
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
20
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
1
Transmisor
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 =
19 - Leer primer BIT =
13 - Lectura de bits =
RSI
MOVWF
DECFSZ
GOTO
MOVLW
MOVWF
Temp
Contador,1
SEGUIR
01h
Continuar
SEGUIR
MOVLW
MOVWF
BCF
BSF
MOVFW
RETFIE
V_TIMER0
TIMER0
INTCON,TOIF
INTCON,TOIE
Temp
64 ms
833 + 833/2 ms
833 ms
;
;
;
;
Guardamos W
Decrementa contador. Contador = 0?
Si contador != 0 ir a Seguir
Continuar cede el paso
;
;
;
;
;
Recarga TMR0
Borra bandera de interrupción
Rehabilita interrupción RTIE
Restaura W
Repone GIE y Retorna
END
21
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.
RETARDAR
movwf
clrf
BANCO1
movlw
movwf
BANCO0
movlw
movwf
movlw
movwf
LOOP1
Contador
Continuar
; Tiempo espera (x64ms)
b'00000111'
OPCION
V_TIMER0
TIMER0
b'10100000'
INTCON
; Desbordar cada 64 ms
btfss
goto
Continuar,0
LOOP1
; Esperar señal de continuar
movlw
movwf
00h
INTCON
; Activa GIE y TOIE
; Activa GIE y TOIE TMR0
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.
LEER
btfsc
goto
bcf
rrf
return
LEER1: bsf
rrf
incf
return
LINEA_IN
LEER1
STATUS,0
Dato,1
; Mirar la LINEA_IN
;
Poner un 1
;
Poner un 0
; Rotamos y lo cargamos
STATUS,0
Dato, 1
C_Paridad,1
; Ponemos bit en STATUS,0
; Rotamos sin cambiar W
; Incrementar contador de paridad
22
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
23
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.
CODIGONUMERO
MOVLW
MOVWF
MOVF
ADDWF
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
high CODIGONUMERO
PCLATH
POS, W
PCL, 1
3Fh
06h
5Bh
4Fh
66h
6Dh
7Dh
07h
7Fh
67h
;
;
;
;
;
;
;
;
;
;
código
código
código
código
código
código
código
código
código
código
77h
7Ch
39h
5Eh
79h
71h
;
;
;
;
;
;
del
del
del
del
del
del
del
del
del
del
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
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.
24
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.
25
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.
26
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::
Receptor::
El retardar va después de escribir en la línea
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
#define
#define
#define
#define
LINEA_OUT
LINEA_IN
V_TMR0
BANCO1
BANCO0
PORTB,0
PORTB,4
06h
bsf
STATUS,RP0
bcf
STATUS,RP0
GLOBAL Dato, Eviar, TRANSMITIR, ESTADO, RECIBIR, RSI, Contador,
Continuar, RETARDAR
udata
;; VARIABLES
Contador
res
Temp
res
Continuar
res
Veces
res
Eviar
res
C_Paridad
res
Dato
res
Recepcion
res
ESTADO
res
ts2
1
1
1
1
1
1
1
1
1
;
;
;
;
;
;
;
;
Estado del circuito
Numero leído
Variable para RSI
BYTE enviado
Contador de paridad
BYTE recibido
Indica si hubo un error
code
27
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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
movwf
movlw
movwf
V_TMR0
TMR0
b'10100000'
INTCON
; Desbordar cada 64 ms
btfss
goto
Continuar,0
LOOP1
; Esperar señal de continuar
; Activa GIE y TOIE TMR0
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
rrf
incf
return
STATUS,0
Dato, 1
C_Paridad,1
; Ponemos bit en STATUS,0
; Rotamos sin cambiar W
; Incrementar contador de paridad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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
call
RETARDAR
; Esperar 833 ms
28
movlw
movwf
08h
Veces
LOOP_BYTE
btfss
goto
bsf
incf
goto
;; Envío del byte
Eviar,0
; Enviar 1 ó 0?
ENVIA_0
;
0
LINEA_OUT
;
1
C_Paridad,f
; Incrementar contador de paridad
RESTAR
ENVIA_0
bcf
LINEA_OUT
RESTAR
rrf
movlw
call
decfsz
goto
Eviar,1
0Dh
RETARDAR
Veces,f
LOOP_BYTE
;; Bit de paridad
btfss
C_Paridad,0
goto
T_PAR
bsf
LINEA_OUT
goto
T_FIN
; Esperar 833 ms
; ¿Paridad?
; PAR
; IMPAR
T_PAR
T_FIN
bcf
LINEA_OUT
movlw
call
0Dh
RETARDAR
MOVLW
MOVWF
06h
Eviar
; Esperar 833 ms
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)
29
call
call
movlw
movwf
RETARDAR
LEER
07h
Veces
; Ahora tomaremos otros 7 bits
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
PAR
;; Comprobar bits de paridad
btfsc
LINEA_IN
goto
IMPAR
; Linea = 1
btfss
C_Paridad,0
; Linea = 0
goto
BIEN
goto
MAL
IMPAR
Btfsc
goto
C_Paridad,0
BIEN
MAL
movlw
goto
00h
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
DECFSZ
GOTO
MOVLW
MOVWF
SEGUIR
MOVLW
MOVWF
BCF
BSF
MOVFW
RETFIE
Temp
Contador,1
SEGUIR
01h
Continuar
V_TMR0
TMR0
INTCON,T0IF
INTCON,T0IE
Temp
;
;
;
;
Guardamos W
Decrementa. ¿Contador = 0?
Si contador != 0 ir a Seguir
Continuar cede el paso
;
;
;
;
;
Recarga TMR0
Borra bandera de interrupción
Rehabilita interrupción RTIE
Restaura W
Repone GIE y Retorna
END
30
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
#DEFINE
DISABLEPLACA
#DEFINE
BANCO1
#DEFINE
BANCO0
;; SIMBOLOS
E
SC
SD
BIT3
CLKD
TXD
RXD
RxTx
EN
BSF
BCF
BSF
BCF
PORTA,4
PORTA,4
STATUS,RP0
STATUS,RP0
para configurar las placas
EQU
3
; Validar dato
EQU
5
; Reloj serial
EQU
7
; Línea transmisión serial
EQU
3
;
EQU
6
; Reloj
EQU
0
; Salida de datos
EQU
4
; Entrada de datos
EQU
1
; Modo transmisor/receptor
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
Inter
CodPrin
code
goto
code
goto
code
0
INICIO
4
RSI
31
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
3Fh
06h
5Bh
4Fh
66h
6Dh
7Dh
07h
7Fh
67h
;
;
;
;
;
;
;
;
;
;
código
código
código
código
código
código
código
código
código
código
del
del
del
del
del
del
del
del
del
del
0
1
2
3
4
5
6
7
8
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
movwf
movlw
call
Dato
PORTB
17h
RETARDAR
BANCO1
movfw
BACK
movwf
TRISB
BANCO0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32
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
SIG
;;
Se configura en el modo de ejecución del transceptor
BTFSS
GOTO
PORTA,1
TRANSIM
bsf
PORTB, RxTx
ENABLEPLACA
; Funcionamiento Receptor
; se habilita el circuito
call RECIBIR
call ESCRIBIR
GOTO BEGIN
TRANSIM
Escanear
call
movlw
SUBWF
btfss
goto
btfsc
goto E
Key_Scan
80h
Tecla, w
STATUS, 0
TCOD
STATUS, 2
scanear
; Ha leido algo
TCOD
call
call
movwf
bsf
Cods_Tecla
CODIGONUMERO
Eviar
OPTION_REG, NOT_RBPU
33
BANCO1
MOVLW
MOVWF
MOVLW
MOVWF
BANCO0
MOVLW
MOVWF
CONFB
TRISB
CONFA
TRISA
INI
PORTB
bcf
PORTB, RxTx
ENABLEPLACA
call TRANSMITIR
DISAB
LEPLACA
bcf
PORTB, TXD
GOTO
BEGIN
;
;
;
;
Se
Se
Se
Se
configura
Activa la
transmite
desactiva
como emisor
placa
el Dato
la placa
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
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
RLF
BCF
BTFSC
BSF
BSF
INCF
BTFSS
GOTO
CLRF
INCF
PORTB,SC
INDF,F
PORTB,SD
STATUS,C
PORTB,SD
PORTB,SC
CONT,1
CONT,BIT3
B1
CONT
FSR,F
;
;
;
;
;
;
;
;
;
;
;
Conmutar a bajo el reloj
Rotar a izquierda TRANS
Poner señal de envío a cero
¿ Enviar un 1 ?
Pone señal de envío a uno
Conmutar a alto el reloj
Contar rotaciones realizadas
¿ Se ha rotado 8 veces ?
No, volver a empezar
Si, reiniciar contador
Siguiente byte
BCF
RLF
BCF
BTFSC
BSF
BSF
INCF
BTFSS
GOTO
BSF
NOP
BCF
BCF
RETURN
PORTB,SC
INDF,F
PORTB,SD
STATUS,C
PORTB,SD
PORTB,SC
CONT,1
CONT,BIT3
B2
PORTB,E
; Configuración terminada
B2
PORTB,SC
PORTB,SD
END
34
7 Bibliografía
E. Martín Cuenca “Microcontroladores PIC”
Ed: Paraninfo, 1998
35