treball de fi de carrera

Anuncio
TREBALL DE FI DE CARRERA
TÍTOL: Sensores inalámbricos de bajo consumo
AUTOR: Marc Ralita Álvarez
DIRECTOR: Francesc Sánchez Robert
DATA: 25 de febrer de 2005
Títol: Sensores inalámbricos de bajo consumo
Autor: Marc Ralita Álvarez
Director: Francesc Sánchez Robert
Data: 25 de febrer de 2005
Resum
El objetivo de este trabajo es realizar el diseño de un sistema emisor-receptor
capaz de transmitir los datos proporcionados por un sensor (cualquier tipo de
sensor) hacia una estación receptora. El diseño se basa en un
microcontrolador de la casa Microchip (rfPIC12F675). Este es el encargado de
tratar la información que genera el sensor de forma apropiada para poder
enviarla hacia el emisor y poderla gestionar posteriormente. Hay que destacar
que el microcontrolador utilizado dispone de diversas opciones de
programación que le permiten hacer una buena gestión de consumo.
El trabajo se divide principalmente en dos puntos. En el primer punto se hace
un estudio de los diferentes bloques que componen el sistema así como de las
especificaciones del microcontrolador que se va a utilizar y las funciones que
deberá realizar.
En el segundo punto ya se aborda exclusivamente el diseño del software
mediante el rfPIC12F675. Primero se hacen una serie de pruebas para
aprender el manejo del microcontrolador y a continuación se describe el
desarrollo del programa final.
En este trabajo se ha hecho básicamente el estudio del software de
comunicación emisor-receptor. Una ampliación del trabajo consistiría en la
captación, por medio del puerto USB, de los datos recibidos y mostrarlos en un
entorno gráfico tipo Visual C++. Este es el tema sobre el que trata el tercer
punto.
Title: Low consumption wireless sensors
Author: Marc Ralita Alvarez
Director: Francesc Sánchez Robert
Date: February, 25th 2005
Overview
The aim of this work is to achieve the design of a transceiver system able to
transmit the data supplied by a sensor (any kind of sensor) towards a receiver
station. The design is based in a microcontroller from the company Microchip
(rfPIC12F675).This microcontroller takes charge of processing the information
provided by the sensor in a suitable way to be able to send it to the transmitter,
and to manage it subsequently.
It has to be highlighted that the microcontroller owns several choices of
programming that allows a good management of the consumption.
The work consists of two points mainly:
-the first one is a study of the various blocks that makes up the system, as well
as the specifications of the microcontroller that is going to be used and the
functions that it will carry out.
-the second one is exclusively to get down to the design of the software
through the rfPIC12F675.First of all, it takes place some trials in order to learn
the running of the microcontroller and afterwards it is described the
development of the ultimate program.
This work has basically executed the study of the transceiver communication’s
software. An extension of the work will consist, by USB port, of a capture of the
data received and show them in a graphics environment type Visual C++. This
is the subject of the third point.
ÍNDICE
1. INTRODUCCIÓN Y ESPECIFICACIONES
1.1. Introducción…………………………………….………………………............................1
1.2. Especificaciones………………………………………………..........................…………2
1.2.1. Diagrama de bloques…………………………………........................……………2
1.2.1.1. Emisor…………………………………………....................…………2
1.2.1.2. Receptor……………………………………...................…………….3
1.2.2. Especificaciones microcontrolador…....……………..........................................4
1.2.3. Comunicación emisor-receptor……………………............................................7
1.2.3.1. Emisor............................................................................................7
1.2.3.2. Receptor.........................................................................................9
2. DISEÑO DE TRANSMISOR Y RECEPTOR
2.1. Funcionamiento del PIC12F675.................. ..…………………………......................11
2.1.1 Acceso a los puertos del microcontrolador.....................................................11
2.1.2. Detección pulsador.........................................................................................12
2.1.3. Interrupciones.................................................................................................13
2.1.4. Función SLEEP..............................................................................................16
2.2. Diseño del transmisor con rfPIC12F675……………………………….......................20
2.2.1. Hardware…………………………………………………………....................….20
2.2.2. Software……………………………………………………….....................….….22
2.2.2.1. Configuración registros .......................................................................22
2.2.2.2. Diagrama de estados...........................................................................26
2.3. Diseño del receptor……………………………………………………….......................27
2.3.1. Hardware……………………………………………………………......................27
2.3.2. Software…………………………………………………………….......................29
2.3.2.1. Configuración registros........................................................................29
2.3.2.2. Diagrama de estados...........................................................................30
3. FUTURAS LÍNEAS DE INVESTIGACIÓN……………………….................……..35
4. CONCLUSIONES Y BIBLIOGRAFÍA………………................………………….…36
4.1. Conclusiones.............................................................................................................36
4.2. Bibliografía.................................................................................................................37
ANEXO 1……………………………………....................………………………………….…....39
ANEXO 2……………………………………………………………………........................…….42
ANEXO 3………………………………………………………………....................……...….….49
1. INTRODUCCIÓN Y ESPECIFICACIONES
1
1. INTRODUCCIÓN Y ESPECIFICACIONES
1.1. Introducción
El objetivo de este trabajo es hacer el diseño de un sistema que sea capaz de
realizar medidas inalámbricas mediante uno o diversos sensores,
independientemente de la magnitud medida: temperatura, humedad, presión,
distancia, etc.
En un sistema en que el generador de datos se encuentra a cierta distancia del
receptor de datos, la división de los diferentes bloques sería: sensor, emisor y
receptor. En este estudio se ha simplificado el bloque sensor escogiendo un
sensor comercial cualquiera y suponiendo que este, para el sistema final, es
simplemente una señal analógica que varía en función de la magnitud medida.
En el ANEXO 1 se realiza un pequeño estudio de un sensor de temperatura
aunque no se ha implementado realmente por el motivo explicado
anteriormente.
El segundo bloque, el bloque emisor, es el que se encarga de convertir la señal
analógica procedente del sensor en una señal digital y enviarla al tercer bloque,
el receptor.
El receptor ha de recibir la señal del emisor y mostrar el valor enviado por el
sensor de la forma convenida previamente.
Para implementar todas las operaciones que han de realizar tanto emisor como
receptor, la mejor manera es hacerlo mediante un microcontrolador
programable ya que este permite grabar en su memoria interna todas las
operaciones que se hayan de realizar ya sean matemáticas o de control. De
esta manera se hace relativamente fácil el diseño de protocolos de
comunicación y de aplicaciones de control de puertos.
A partir de aquí se realiza el estudio en profundidad de los diferentes bloques
que componen el sistema, a excepción, como se ha comentado anteriormente,
del bloque sensor.
2
SENSORES INALÁMBRICOS DE BAJO CONSUMO
1.2. Especificaciones
1.2.1. Diagrama de bloques
1.2.1.1. Emisor
Este sistema estará formado por 3 bloques básicos: sensor, emisor y receptor.
Pero hace falta entrar en más detalles para obtener la configuración final del
sistema y poder así elegir los componentes que lo compondrán.
En primer lugar hay que desglosar las partes de que está compuesto el sistema
emisor. Una primera aproximación podría ser la siguiente:
Sensor
Conversor
A/D
Microcontrolador
Transmisor RF
Fig. 1.1 Diagrama de bloques emisor
Según el tipo de sensor escogido este dará a su salida una señal analógica o
digital. En el caso de salida analógica, para que el microcontrolador pueda
procesar esa señal es necesaria una conversión de analógico a digital, ya que
los microcontroladores trabajan en el “mundo” digital y no son capaces de
procesar señales analógicas. Si por el contrario el sensor ya da una salida
digital, ya no es necesario realizar este paso intermedio y se puede conectar
directamente el sensor al microcontrolador, siempre y cuando cumpla con las
tensiones máximas que acepta el microcontrolador.
Hay muchos tipos de conversores Analógico-Digital, la diferencia entre uno y
otro está básicamente en la velocidad de conversión y en la resolución que
pueden ofrecer. La elección final dependerá de las necesidades de cada
aplicación. En este caso en concreto hay que buscar un compromiso entre
conversor y microcontrolador ya que en función del número de puertos de
entrada del procesador se tendrá que limitar la resolución del A/D, o por el
contrario habrá que buscar un procesador con más puertos de entrada para
satisfacer las necesidades de resolución del A/D.
El siguiente bloque a analizar es el microcontrolador. El microcontrolador es el
corazón del sistema. Es el encargado de procesar los datos procedentes del
conversor A/D y realizar con estos las operaciones necesarias, (operaciones
matemáticas, codificación, etc.) para poder ser enviados al bloque transmisor.
El microcontrolador ha de analizar los datos que le entrega el conversor A/D,
codificarlos según el tipo de codificación escogido y entregarle la trama de bits
1. INTRODUCCIÓN Y ESPECIFICACIONES
3
generada al bloque emisor. Si se realiza una buena codificación, en recepción
será más difícil que lleguen errores causados por interferencias en el canal, en
este caso el aire.
El último bloque es el transmisor de Radio Frecuencia (RF). Este bloque se
encarga de recibir los datos codificados por el microcontrolador y modularlos
para poder ser enviados hacia el receptor. Existen muchas técnicas de
modulación. La elección de una u otra va en función del uso al que esté
destinado el radio enlace, las interferencias que puedan haber en el canal, etc.
También es cierto que cuanto más complicada sea la técnica de modulación
más complicado será el modulador, por este motivo será necesaria una buena
planificación para conocer todos los detalles del radio enlace. En el caso un
sensor inalámbrico el flujo de datos a transmitir no es muy elevado, por eso con
una modulación simple (ASK, FSK) ya habrá bastante.
1.2.1.2 Receptor
Los bloques que forman el sistema receptor se podrían dividir en los siguientes:
Receptor RF
Microcontrolador
Visualización resultado
(Display, PC, etc.)
Fig. 1.2 Diagrama de bloques receptor
El primer bloque del sistema receptor, el receptor de Radio Frecuencia (RF), es
el encargado de realizar la demodulación de los datos recibidos del emisor.
Una vez realizada la demodulación entrega al microcontrolador una ristra de
bits que este tendrá que analizar y tratar para poder visualizar correctamente el
dato enviado desde el emisor.
El microcontrolador, que puede ser igual o distinto que el del emisor, tiene que
conocer el formato de los datos que va a recibir para poder decodificarlos y
poder extraer la información correctamente. En el caso en que en el emisor se
programe una codificación con redundancia, en recepción se tendría que
programar un código capaz de detectar errores de canal y corregirlos mediante
la redundancia. Una vez extraída la información recibida se puede guardar en
la memoria interna del microcontrolador, si tiene, para su posterior utilización, o
simplemente se puede sacar por los puertos de salida del microcontrolador
para su visualización en el siguiente bloque.
El último bloque, la visualización del resultado, depende de la manera en que
se quieran gestionar los datos recibidos. En el caso de los sensores
4
SENSORES INALÁMBRICOS DE BAJO CONSUMO
inalámbricos se podría hacer de dos maneras diferentes: La primera sería
simplemente poniendo un display BCD de 7 segmentos y visualizar los datos
binarios que salen del microcontrolador. La segunda manera es utilizando un
ordenador para la visualización. Utilizando algún programa visual como por
ejemplo Visual Basic o Visual C++ se puede crear un entorno más ameno que
no un simple display y se consigue que la aplicación sea un poco más
interactiva para el usuario con lo cual el proyecto final gana valor añadido,
pudiendo incluso hacer gráficas estadísticas de los valores recibidos del
emisor.
1.2.2. Especificaciones microcontrolador
Una vez estudiadas las necesidades del proyecto es hora seleccionar los
componentes que se van a utilizar para desarrollarlo.
Hay muchas marcas que fabrican microcontroladores y cada una tiene muchos
modelos disponibles. Cada uno es más útil para una aplicación que para otra,
por eso hay que hacer una buena selección.
La característica principal del sistema que se está diseñando es que ha de
tener el menor consumo posible. Es por este motivo que se ha de buscar la
máxima integración de componentes posible. Comparando entre los diferentes
fabricantes, Microchip tiene una gama de microcontroladores que dispone de la
integración de componentes necesaria para este proyecto.
El mencionado microcontrolador es el rfPIC12F675, este incorpora en un solo
chip de muy reducidas dimensiones el conversor A/D y el circuito emisor de RF
necesarios para realizar el sistema emisor. El rfPIC12F675 es una variante del
PIC12F675, lo único que los diferencia es que el primero incorpora el circuito
de RF y el segundo no, por lo demás son exactamente iguales.
Las características básicas de este microcontrolador son las siguientes:
•
Dispone de varios tipos de memoria según su utilización:
- 1024 x 14 palabras de memoria FLASH como memoria de programa
- 128 x 8 bytes de memoria EEPROM para guardar datos
- 64 x 8 bytes de memoria SRAM para los registros de propósito general
•
•
•
•
•
Oscilador interno de 4MHz. Cada instrucción dura 4 periodos de oscilación,
con lo cual una instrucción (1 ciclo) dura 1µs.
Dispone de 6 entradas/salidas la dirección de las cuales es programable.
1 comparador analógico interno con 16 posibles niveles internos de
referencia.
1 conversor analógico/digital interno de 10 bits de resolución y 4 canales de
entrada multiplexables.
1 timer de 8 bits y otro de 16 con preescaler de 8 y 3 bits respectivamente.
1. INTRODUCCIÓN Y ESPECIFICACIONES
•
•
•
•
•
•
5
(el preescaler permite que el timer no se incremente a cada ciclo de
procesador sino cada n ciclos, siendo n el valor del preescaler)
Función SLEEP para un mayor ahorro de energía.
Watchdog (perro guardián) para evitar bucles infinitos.
Transmisor UHF ASK/FSK en la banda libre. Margen de funcionamiento
entre 380-450MHz
Data rate: 0 – 40kbps
Potencia de salida de +10dBm a -70dBm con 4 pasos intermedios.
Alcance estimado 100m.
Los consumos de este chip son los siguientes:
•
•
•
•
•
14mA en transmisión a 434MHz y +6dBm
4mA en transmisión a 434MHz y -15dBm
0.6µA en modo sleep y con el perro guardián activado (Watchdog).
0.1µA en standby.
Tensión de alimentación entre 2.0 y 5.5v
Los pins de este microcontrolador son los mostrados a continuación:
Fig. 1.3 Pins rfPIC12F675
Para más detalles (mapa de memoria, registros, etc.) ver ANEXO 2.
La programación del microcontrolador se realiza mediante lenguaje de bajo
nivel, es decir, ensamblador. Es posible también, realizar el programa en un
código de programación de alto nivel, por ejemplo C, aunque al final tendrá que
traducirse a ensamblador mediante algún compilador ya que el código final que
se graba en el chip ha de ser obligatoriamente ensamblador. El juego de
instrucciones del microcontrolador esta disponible en el anexo 2 fig. 2.4.
Para realizar el diseño de este software se ha escogido un Kit de desarrollo que
proporciona la misma casa Microchip. El Kit se llama Pickit1 (fig. 1.4) y se
suministra con una placa de desarrollo de proyectos que incluye una matriz de
leds para visualizar los resultados, un pulsador y un potenciómetro para hacer
pruebas de funcionamiento de puertos. Una característica muy importante de
esta placa es que se conexiona al ordenador mediante un puerto USB, con lo
6
SENSORES INALÁMBRICOS DE BAJO CONSUMO
cual no es necesaria una fuente de alimentación externa. También se
suministra con el Kit un juego emisor-receptor sintonizados a 433 MHz para
poder hacer pruebas de programación del conjunto.
La programación del chip es muy sencilla. Al ser una memoria Flash la
programación se puede realizar desde el mismo Kit de desarrollo. Por lo tanto
no hace falta cambiar el chip de zócalo cada vez que se quiere cambiar algo
del programa. La placa de desarrollo tiene un zócalo en el que se pincha la
placa del emisor. Este zócalo, por lo tanto, sirve para programar el chip y para
realizar las pruebas del programa.
Fig. 1.4 PicKit1
Una vez comentadas las principales características del emisor pasemos a
comentar el receptor. Como se ha comentado, en el Pickit1 se proporciona una
placa emisora y otra receptora. Esta placa receptora se basa en el receptor
rfRXD0420, también de la casa Microchip. Se trata de un receptor UHF capaz
de demodular señales ASK, FSK y FM. No dispone de ningún microcontrolador,
por lo tanto es necesario procesar la señal recibida de alguna forma para poder
decodificarla y manejarla de la forma deseada. Esta operación se puede hacer
con el mismo microcontrolador que se utiliza para el transmisor pero, en este
caso, sin la parte de RF. Por lo tanto se puede coger el microcontrolador
PIC12F675 para recibir los datos procedentes del demodulador.
Para el diseño final se hará con el PIC mencionado, pero para las pruebas
sobre el Kit se ha hecho con el PIC16F676 porque en el mismo Kit los pins del
receptor y PIC están conectados de tal forma que con el PIC12F675 la
recepción de datos no queda conectada cosa que con el PIC16F676 ya no
pasa y los datos recibidos van directamente a un puerto de entrada.
Este nuevo PIC es exactamente igual que el anterior pero con la diferencia que
tiene más puertos de entrada/salida. En cuestión de registros de configuración,
etc. no cambia nada excepto por los nuevos puertos.
1. INTRODUCCIÓN Y ESPECIFICACIONES
7
1.2.3. Comunicación emisor-receptor
1.2.3.1. Emisor
A continuación se describen las funciones que deberá realizar el software del
emisor.
El protocolo de comunicación utilizado en el sistema emisor-receptor se basa
en la fig. 1.5. Primero de todo se envía una trama de sincronismo para prevenir
al receptor de que se va a iniciar una transmisión de datos. Esta transmisión
puede ser válida o no, pero la tiene que leer de todos modos. Más adelante ya
usará otros mecanismos para saber si es para él o no. La trama de sincronismo
consta de una serie de pulsos iguales y de duración determinada. Mediante
esta trama se filtran posibles impulsos aleatorios de ruido que se puedan
recibir. De esta forma no se producen interferencias en el principio de trama de
datos.
Después de enviar la trama de sincronismo se hace una pausa para que el
receptor sepa que lo que se enviará a continuación serán los datos de
información.
Por último, cuando el emisor acaba de enviar los datos, deja un tiempo de
guarda en el que no transmite nada.
Fig. 1.5 Protocolo de comunicación
La duración de todos los pulsos, tanto de sincronismo como de datos, es la
misma. La elección de este tiempo se ha hecho según el siguiente criterio:
Como se ve en la fig. 1.6 cuando hay un cambio de nivel alto a nivel bajo este
cambio no es inmediato sino que se hace progresivamente. Pasados 200µs es
cuando se puede considerar que ya ha cambiado a nivel bajo.
8
SENSORES INALÁMBRICOS DE BAJO CONSUMO
Fig. 1.6 Transitorios de un pulso
Este pequeño transitorio hay que tenerlo en cuenta a la hora de decidir como
va a ser la señal que se va a generar. Por eso, y por facilitar la programación,
se ha decidido que cada pulso generado en el programa emisor tendrá una
duración de 512µs, tanto en estado alto como en estado bajo. Esta duración
facilita la programación porque el timer del microcontrolador con preescaler a
1:2 genera overflow exactamente a 512µs. Así cuando se detecta overflow se
continua con la ejecución normal del programa.
La trama de sincronismo se ha hecho que dure 16 pulsos, es decir 16.38ms. La
duración de esta trama depende de lo mucho o poco que se quiera filtrar las
interferencias. Se ha escogido 16 por ser un término medio. Si se hace durar
más, estará más protegido pero a la vez se incrementa el tiempo de
transmisión. Para una transmisión como la que se realiza aquí no afectará
demasiado, aunque si que lo haría en el caso de enviar datos fraccionados en
paquetes.
La pausa se ha definido con un tiempo de 2.56ms. Este tiempo ha de ser
superior al tiempo de un cero de datos e inferior al tiempo de guarda para que
el receptor pueda distinguir en todo momento en que estado se encuentra. De
esta forma, si el receptor recibe un silencio superior al tiempo de guarda
después de una trama de sincronismo, este ignorará lo que se envíe a
continuación y se reiniciará.
Después de una pausa válida el receptor está preparado para recibir los datos.
El formato de los datos es el siguiente:
Se ha escogido una codificación de datos PWM (Pulse Width Modulation) que
consiste en codificar los uno y ceros según la fig. 1.7.
1. INTRODUCCIÓN Y ESPECIFICACIONES
9
Fig. 1.7 Formato datos PWM
Según esto, un dato codificado (3 bits) siempre empezará por uno y siempre
acabará en cero. De esta forma se puede programar en recepción algún tipo de
corrección de errores si se sabe que 1536µs (512µs * 3) representan 1 bit
decodificado.
Este tipo de codificación es muy útil para reducir el BER (Bit Error Rate), ya que
al durar más el dato codificado que el bit original, hay más probabilidad de
recuperar el bit original.
Por último, después de enviar los datos, se deja un tiempo de guarda de
15.3ms para que el receptor pueda saber que la comunicación ha finalizado.
Este tiempo de guarda es más largo que la pausa antes transmitir datos para
que el receptor pueda distinguir entre ambos.
1.2.3.2. Receptor
El software del receptor es un poco más complejo que el del emisor. Esto es
así porque, a priori, el receptor no tiene porque saber la duración de cada pulso
(sí hay un margen máximo), sino que ha de estar todo el rato comprobando
cuando empieza y cuando acaba este. De esta manera ha de llevar un control
exhaustivo del tiempo que lleva el pulso en estado alto y realizar la función que
sea necesaria en función de este tiempo y el estado en el que esté el programa
en ese momento.
En primer lugar el programa ha de monitorizar si le llega la trama de
sincronismo. Para ello solo ha de mirar si el receptor está en estado alto o en
estado bajo. Cuando le llega un uno seguido de un cero, lo único que ha de
mirar es la duración del cero. Si el cero no dura más de un tiempo determinado
reinicia el programa. Si el cero dura más de lo predeterminado significa que se
pasa a estado de pausa de antes de la transmisión de los datos.
Cuando está en estado de pausa, el software ha de comprobar que realmente
esté en pausa. Por ello, si la pausa dura más de lo establecido el programa se
reiniciará. Esto significa que la trama de sincronismo recibida no era válida.
10
SENSORES INALÁMBRICOS DE BAJO CONSUMO
Una vez recibida una pausa válida se empiezan a recibir los datos. Los datos
vienen codificados según la codificación PWM. Para decodificarlos la técnica
utilizada es muy sencilla. Lo único que hay hacer es contar el tiempo que el
dato está en estado alto y restarle el tiempo que está en estado bajo. El carry
de la operación es el que dirá si el dato era un 1 o un 0. Según la codificación
PWM un cero está 2/3 de tiempo en estado alto y 1/3 en estado bajo. Al hacer
la resta el resultado sale positivo, por lo tanto no hay carry o este es 0. Por el
contrario con un uno el resultado del carry será 1.
Después de la recepción de datos el receptor pasa a monitorizar si llega un 0 y
cuanto tiempo dura este. Si el cero dura un mínimo establecido, entonces
puede dar la recepción como correcta. Si dura menos reinicia el programa e
ignora los datos recibidos.
Una vez validada la recepción, es hora de validar los datos recibidos. El emisor,
junto con los datos, envía un código de identificación. En recepción, el
programa ha de comprobar que este código sea válido. Si no es válido no se
pueden aceptar los datos recibidos y los ignora. Si es válido guarda los datos
en la memoria EEPROM y los muestra en los leds.
2. DISEÑO DE TRANSMISOR Y RECEPTOR
11
2. DISEÑO DE TRANSMISOR Y RECEPTOR
2.1. Funcionamiento del PIC12F675
El rfPIC12F675 es una variante del PIC12F675. Solo se diferencian en el
circuito de RF. Es por este motivo que para comprender el funcionamiento de
este PIC, con el modelo sencillo ya hay bastante. Así, para realizar las pruebas
iniciales se va a utilizar el PIC12F675.
Para familiarizarse con el Kit de pruebas del microcontrolador se han ido
realizando pequeños programas para ir viendo como responde y así se ha ido
tomando un primer contacto con los diferentes registros del PIC. Los pasos
seguidos han sido los siguientes:
2.1.1 Acceso a los puertos del microcontrolador
Este microcontrolador tiene 6 puertos: 5 de entrada/salida
1 de solo entrada
El Kit de prueba proporciona una matriz de leds para hacer todas las pruebas
necesarias. Esta matriz está conectada a los puertos GP1, GP2, GP4 y GP5
según se muestra en la Fig. 2.1
Fig. 2.1 Matriz de leds PICKIT 1
Los puertos RA_ se corresponden con los puertos GP_ del microcontrolador.
12
SENSORES INALÁMBRICOS DE BAJO CONSUMO
Lo primero que se ha probado ha sido encender el led D7. Para ello, como se
ve en la Fig. 2.1, solo es necesario activar el puerto GP1(RA1).
El programa es el siguiente:
list
p=12f675
; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions
;------------------------------------------------;Programa para activar el Puerto GP1
;------------------------------------------------bsf
clrf
clrf
bcf
clrf
bsf
end
STATUS,RP0
TRISIO
ANSEL
STATUS,RP0
GPIO
GPIO,GPIO1
;selecciono banco 1
;configura todos los puertos como salidas
;configura los puertos 3:0 como I/O digitales
;selecciono banco 0
;inicializo todos los puertos a ‘0’
;activo el Puerto 1 ‘1 lógico’
;fin del programa
2.1.2. Detección pulsador
Una vez se ha conseguido extraer datos por los puertos, el siguiente paso será
hacer un programa que en cuanto detecte la activación del pulsador que
incorpora el PIC KIT 1 active el led D7.
El pulsador del Kit está conectado al puerto GP3 como se observa en la Fig.
2.2 por lo tanto en el programa se ha de leer el estado de este puerto para
detectar su activación:
Fig. 2.2 Conexión del pulsador
El programa realizado es el siguiente:
list
p=12f675
; list directive to define processor
2. DISEÑO DE TRANSMISOR Y RECEPTOR
#include <p12f675.inc>
#define GP3m GPIO, 3
13
;processor specific variable definitions
; pulsador GP3
LED
bsf
STATUS,RP0
clrf
ANSEL
movlw 0x00
movwf TRISIO
bcf
STATUS,RP0
clrf
GPIO
bsf
GPIO,GPIO1
;selecciona banco 1
;configura puertos como I/O digitales
;configura el puerto GP1 como salida
btfss GP3m
goto LED
bsf
STATUS,RP0
clrf
ANSEL
movlw 0xFF
; ¿esta pulsado GP3?
;banco 0
;apaga todos los leds
;activa el led D7
MAIN
movwf TRISIO
bcf
STATUS,RP0
clrf
GPIO
;selecciona banco 1
;configura puertos como I/O digitales
;configura todos los puertos como
entradas (para que se apaguen los
leds del todo)
;banco 0
;apaga todos los leds
end
2.1.3. Interrupciones
La siguiente prueba realizada es para comprender el funcionamiento de las
interrupciones. Este punto es vital en este proyecto ya que el microcontrolador
deberá despertar de su estado SLEEP mediante una interrupción provocada
por el overflow de un timer interno.
El programa realizado es el siguiente:
list
p=12f675
; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions
; Definición de las diferentes variables
cblock 0x20
w_temp
status_temp
endc
14
SENSORES INALÁMBRICOS DE BAJO CONSUMO
ORG
0x000
goto
; Vector RESET
INIT
; Rutina de Interrupción
; Primero hay que guardar el estado del registro STATUS y de W
ORG
0x004
movwf
swapf
bcf
movwf
bcf
; Vector Interrupcion
w_temp
STATUS, W
STATUS, RP0
status_temp
STATUS,RP0
; save W register
; swap status to be saved into W
; ---- Select Bank 0 ----; save STATUS register
;banco 0
; Funciones a realizar durante la interrupción
; Aqui se podria poner una condicion para comprobar el tipo de interrupción
; que se ha provocado. En este caso solo hay una y no se pone la condición
bcf
clrf
bsf
bcf
STATUS,RP0
GPIO
GPIO,GPIO1
INTCON, GPIF
;banco 0
;apaga todos los leds
;borra el flag que avisa de la
; interrupción
;---------------------------------------; Vuelve a cargar el estado del registro STATUS y W
swapf status_temp, W
movwf
swapf
swapf
bcf
retfie
STATUS
w_temp, F
w_temp, W
STATUS,RP0
; swap status_temp into W, sets
; bank to original state
; restore STATUS register
; restore W register
;banco 0
;retorna de la interrupción
; Inicialización de los diferentes registros
INIT
; Configuración de puertos
bcf INTCON, GIE
; Deshabilita las interrupciones globales
bsf STATUS, RP0 ; Banco 1
movlw b'00001001'
movwf TRISIO
;configura puerto 1 como salida y puerto 3
como entrada
2. DISEÑO DE TRANSMISOR Y RECEPTOR
bsf
clrf
15
STATUS,RP0 ;selecciona banco 1
ANSEL
;configura puertos como I/O digitales
; Interrupción por cambio de estado en puerto 3
bsf
STATUS,RP0 ;banco 1
movlw b'00001000'
movwf IOC
; Activa la interrupción del puerto 3
(Pulsador SW1 del PicKit 1)
bcf
STATUS,RP0 ;banco 0
bsf
INTCON, GPIE ; Habilita la interrupción por cambio de
estado en un puerto
MAIN
bsf INTCON, GIE ; Habilita todas las interrupciones globales
bcf STATUS,RP0 ;banco 0
clrf GPIO
bcf STATUS,RP0 ;banco 0
end
Con el programa realizado se puede comprobar el correcto funcionamiento
de la interrupción provocada por un pulsador. El programa en si está bien,
pero tiene un pequeño problema. Es el siguiente: cuando es presionado el
pulsador, se intuye que se enciende el led D7, pero inmediatamente se
apaga. Esto es debido a que el programa va tan rápido que no da tiempo a
que se pueda observar el led encendido. Se debe a que una vez que se
acaba la rutina de interrupción vuelve a saltar al programa principal en el
cual hay una instrucción que borra todos los puertos de salida, con lo cual
apaga el led D7.
Una opción para solucionar este problema es introducir un pequeño delay
en la subrutina de interrupción, de manera que cuando se presione el
pulsador, el led se mantenga un segundo encendido.
La modificación introducida es la siguiente:
- El siguiente código es la parte de la interrupción que se dedica a
encender el led en la cual se ha introducido una llamada a una subrutina
que hace un delay de 1s utilizando el Timer1.
bcf
clrf
bsf
bsf
call
bcf
STATUS,RP0
;banco 0
GPIO
;apaga todos los leds
GPIO,GPIO1
;enciende el led D7
T1CON, TMR1ON ;enciende el Timer1
CONTA
;delay de 1s
INTCON, GPIF ;borra el flag que avisa de la interrupción
- Subrutina que hace el delay:
16
SENSORES INALÁMBRICOS DE BAJO CONSUMO
CONTA
movlw d'15'
movwf cont
TIMER1
btfss PIR1,TMR1IF ;¿Esta activo el flag de overflow del Timer1?
goto TIMER1
bcf
PIR1,TMR1IF ;Borra el flag de overflow
decfsz cont,1
goto TIMER1
return
2.1.4. Función SLEEP
Una función muy importante para este proyecto es la función SLEEP del
microcontrolador. Con esta función, una vez acaba las tareas ordenadas,
automáticamente se pone en modo de ahorro de energía hasta que algo haga
que se “despierte”. A continuación se muestran las pruebas realizadas sobre
esta función:
list
p=12f675
; list directive to define processor
#include <p12f675.inc> ; processor specific variable definitions
;errorlevel -302
; suppress message 302 from list file
__CONFIG
_CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF &
_PWRTE_OFF & _WDT_ON & _INTRC_OSC_NOCLKOUT
; En este programa se va a utilizar el puerto GP3 como entrada para detectar
; el cierre del pulsador y el puerto GP1 para activar el led 7
; Definición de las diferentes variables
cblock 0x20
w_temp
status_temp
cont
t
endc
RESET
ORG
0x000
; Vector RESET
2. DISEÑO DE TRANSMISOR Y RECEPTOR
goto
17
INIT
; Rutina de Interrupción
; Primero hay que guardar el estado del registro STATUS y de W
ORG
0x004
bcf INTCON, GIE
movwf w_temp
swapf STATUS, W
bcf STATUS, RP0
movwf status_temp
bcf
STATUS,RP0
; Vector Interrupcion
; Deshabilita las interrupciones globales
; save W register
; swap status to be saved into W
; ---- Select Bank 0 ----; save STATUS register
;banco 0
; Funciones a realizar durante la interrupción
;--------------------------------------------------------------------------btfsc INTCON,GPIF ; Comprueba si la interrupción la ha provocado el
; pulsador
goto RESET
; si es asi hace un reset. En el reset ya se borra
; el flag
bcf
PIR1,TMR1IF ; Borra el flag de overflow
;--------------------------------------------------------------------------; Vuelve a cargar el estado del registro STATUS y W
swapf status_temp, W
movwf STATUS
swapf w_temp, F
swapf w_temp, W
bcf
STATUS,RP0
bsf INTCON, GIE
; swap status_temp into W, sets bank to
; original state
; restore STATUS register
; restore W register
; banco 0
; Rehabilita las interrupciones globales
retfie
; Cargar contador
;**************************************************************************************
; El timer1 es un contador de 16 bits por lo tanto puede contar hasta 65536
; cada instrucción dura 1us y por lo tanto el timer1 puede temporizar 65536us
; Con el preescaler del Timer1 puesto como 1:8, cada 8 ciclos solo contará 1.
; de esta manera puede temporizar como mucho hasta 0.5s
;***************************************************************************************
CONTA
clrf
cont
18
SENSORES INALÁMBRICOS DE BAJO CONSUMO
movwf cont
; En función del valor que se le de a W el contador
; cogerá un valor u otro.
TIMER1
btfss PIR1,TMR1IF ;¿Esta activo el flag de overflow del Timer1?
goto TIMER1
;Si esta activo el flag no ejecuta esta linea
bcf
PIR1,TMR1IF ;Borra el flag de overflow
decfsz cont,1
goto TIMER1
bcf
T1CON, TMR1ON ; apaga el Timer1
return
; Inicialización de los diferentes registros
INIT
; Configuración de puertos
bcf INTCON, GIE ; Deshabilita las interrupciones globales
bcf
INTCON, PEIE ; Deshabilita Interrupción de Periféricos
bsf STATUS, RP0 ; Banco 1
movlw b'00001000'
movwf TRISIO
;configura puerto 3 como entrada y los demás salidas
bsf
clrf
STATUS,RP0
ANSEL
;selecciona banco 1
;configura puertos como I/O digitales
; Configuración interrupción puertos
bsf
INTCON, GPIE
bsf
IOC, IOC3
; Activa interrupción por cambio de estado en
; puertos
; Activa interrupción por cambio de estado
; puerto 3
; Configuración del Timer1
bcf
STATUS, RP0
movlw b'00110100'
movwf T1CON
bsf
bsf
STATUS, RP0
PIE1,TMR1IE
;banco 0
; Configura el registro de control del Timer1
; preescaler a 1:8
; Banco 1
; Habilita Interrupción por overflow de Timer1
; Configuración del WDT
bsf
STATUS,RP0
movlw b'11001111'
movwf OPTION_REG
;selecciona banco 1
2. DISEÑO DE TRANSMISOR Y RECEPTOR
19
MAIN
bsf
bsf
INTCON, GIE
INTCON, PEIE
; Habilita todas las interr. globales
;Habilita Interrupción de Perifericos
bcf
STATUS, RP0
;banco 0
clrf
GPIO
bsf
GPIO,1
bsf
T1CON, TMR1ON ;enciende el Timer1
movlw d'2'
; Delay de 1s
call CONTA
clrf
GPIO
; Con el preescaler a 1:128 se puede temporizar hasta 2,3s
; Me interesa temporizar 1 min. como mínimo. Si se hace 2,3*26 salen 59,8s
movlw d'26' ;Tiempo que esta en modo SLEEP (2.3s * 26 = 59.9s)
movwf t
SLEP1
clrwdt
;clear WDT
sleep
decfsz t,f
goto SLEP1
nop
nop
clrwdt ;clear WDT
bcf
clrf
STATUS,RP0
GPIO
bsf
GPIO,2
movlw d'2'
call CONTA
clrf
GPIO
bcf
STATUS,RP0
;banco 0
;banco 0
end
El objetivo del programa anterior era conseguir que el microcontrolador
estuviese 1 minuto en el modo SLEEP, se despertara, ejecutase el programa y
volviese a dormir. Pero se ha comprobado que este PIC no lo permite. Si se
utiliza el Watchdog como temporizador se puede conseguir que permanezca
2.3s en modo Sleep y si se utiliza cualquiera de los dos timers de que dispone
el PIC se consigue mucho menos tiempo. Por eso en este programa se ha
hecho una pequeña trampa y se está 1 min. sin ejecutar el programa, pero no
está todo el rato en modo Sleep.
20
SENSORES INALÁMBRICOS DE BAJO CONSUMO
2.2. Diseño del transmisor con rfPIC12F675
2.2.1. Hardware
Todo proyecto de más o menos envergadura es necesario dividirlo en
diferentes fases. En este proyecto, por ejemplo, las diferentes fases serían:
desarrollo del software y pruebas con emulador, desarrollo del hardware y
pruebas con software y, por último, desarrollo del interface gráfico. Pues bien,
este trabajo solo supone la primera fase del proyecto, es decir, desarrollo del
software y pruebas con emulador. Es por ese motivo que no se ha hecho un
gran estudio del hardware utilizado y se deja para posteriores estudios.
Los componentes más relevantes y que hace falta destacar son los que hacen
referencia al transmisor. A continuación se hace una breve descripción.
El rfPIC12F675 dispone de un oscilador a cristal tipo Colpitts para generar la
frecuencia de referencia que se entrega al PLL del emisor. Este oscilador es
totalmente independiente del que tiene el microcontrolador. A parte de este
oscilador, es necesario conectar un segundo cristal exterior al puerto XTAL y,
mediante la fórmula (2.1), se obtiene la frecuencia de transmisión.
f transmisión = f RFXTAL × 32
(2.1)
Para un ajuste más fino de la frecuencia de salida (solo en modo ASK) se
puede poner un condensador en serie con el cristal conectado a XTAL. En la
siguiente figura se muestra la conexión y posibles valores de C1 con sus
respectivas frecuencias finales.
2. DISEÑO DE TRANSMISOR Y RECEPTOR
21
Fig. 2.3 Posibles valores de C1
La potencia de salida del transmisor es otro de los puntos que hay que tener en
cuenta a la hora de estudiar el transmisor. Esta se puede ajustar desde 9dBm
hasta -70dBm. Para ello solo es necesario jugar con distintos valores de
resistencia en el puerto PS del microcontrolador tal y como se muestra en la
siguiente figura:
Fig. 2.4 Potencia de salida del transmisor
El transmisor del kit Pickit1 viene configurado para dar la potencia máxima de
salida que se permite, es decir, 9dBm ya que tiene un circuito abierto en lugar
de resistencia.
Para más detalles del hardware en el anexo 2 fig. 2.2 se muestra el esquema
del módulo emisor del PicKit1.
22
SENSORES INALÁMBRICOS DE BAJO CONSUMO
2.2.2. Software
2.2.2.1. Configuración registros
A partir de este punto se va a empezar a hacer el diseño del software que
controlará todo el sistema emisor. En la primera parte de este apartado se
explican con detalle cada uno de los registros que intervienen en la
configuración del programa emisor y a continuación se expone un diagrama de
bloques de lo que será el programa final. El programa completo se muestra en
el anexo 3.1.
La configuración de los diferentes registros del microcontrolador se realiza solo
empezar el programa, es decir, antes del programa principal en una subrutina
llamada INIT. Aquí se realiza tanto la configuración de los puertos como la de
los módulos del micro (A/D, comparador, etc.).
Lo primero que se realiza es la configuración de los diferentes puertos del PIC.
Hay diversos registros que afectan a dicha configuración, pero los básicos son:
GPIO y TRISIO.
Registro GPIO: Mediante este registro se puede cambiar el estado de un
puerto o leer su estado en caso de que sea un puerto de entrada.
•
•
Bit 7-6: No utilizado
Bit 5-0: Estado del puerto. Si vale 1 el puerto está en
estado alto. Si vale 0, estado bajo.
Registro TRISIO:
•
•
Bit 7-6: No utilizado.
Bit 5-0: Si vale 1 el puerto se configura como puerto de
entrada. Si vale 0 se configura como salida.
Después de la configuración de los puertos, en el caso del programa emisor, se
pasa a configurar una interrupción por cambio de estado en un puerto. Es decir,
que si se detecta un cambio en el estado de un puerto se genera una
interrupción haciendo saltar del programa principal a la rutina de interrupción.
2. DISEÑO DE TRANSMISOR Y RECEPTOR
23
En este programa se usa esta utilidad para que al pulsar el pulsador GP3 se
haga un reset del sistema. Para poder configurarlo los registros que se han de
modificar son: INTCON, IOC.
Registro INTCON:
•
•
•
•
•
•
•
•
Bit 7: Activación de interrupciones globales
Bit 6: Activación de interrupción de periféricos
Bit 5: Activación de interrupción por overflow en Timer0
Bit 4: Activación de interrupción externa en GP2/INT
Bit 3: Activación de interrupción por cambio de estado en
puerto
Bit 2: Flag de interrupción por overflow de Timer0
Bit 1: Flag de interrupción externa en GP2/INT
Bit 0: Flag de interrupción por cambio de estado en puerto
Los bits que se han de activar para que se genere una interrupción por
cambio de estado en un puerto son el 3 y el 7. Por regla general durante
el proceso de inicialización de registros se han de desconectar todo tipo
de interrupciones, por eso el bit 7 solo se activará cuando empiece el
programa principal.
Registro IOC:
•
•
Bit 7-6: No utilizado.
Bit 5-0: Activación de interrupción por cambio de estado en
puerto. Si el bit vale 1 se permite interrupción para ese
puerto.
La siguiente parte del emisor que se configura en la subrutina INIT es el timer
interno TIMER0. Los registros asociados al Timer0 son: TMR0, OPTION_REG,
INTCON y TRISIO explicados anteriormente.
Registro TMR0: Este es un registro de 8 bits y es donde se va
actualizando el estado del contador TMR0. A cada ciclo del procesador
(4 oscilaciones de reloj) el contador TMR0 se incrementa en una unidad,
excepto en el caso de que tenga preescaler.
24
SENSORES INALÁMBRICOS DE BAJO CONSUMO
Registro OPTION_REG:
De este registro los bits más importantes son:
• Bit 3: Asignación del preescaler. Si vale 1 se asigna al
Watchdog. Si vale 0 se asigna al TMR0
• Bit 2-0: Rate del preescaler
Por último se realiza la configuración del módulo A/D para realizar la
conversión analógico/digital de la señal procedente del sensor. Sus registros
asociados son: ADCON0 y ANSEL.
Registro ADCON0:
•
•
•
•
•
•
Bit 7: Si vale 1 justifica el resultado a la derecha o a la
izquierda en caso de que valga 0.
Bit 6: Indica Vref. Si es 1 coge una Vref externa. Si vale 0 la
Vref es VDD.
Bit 5-4: No usados
Bit 3-2: Selecciona una de las 4 entradas al A/D
Bit 1: Si vale 1 inicia la conversión y mientras valga 1 indica
que la conversión no ha finalizado. Si vale 0 la conversión
ha acabado.
Bit 0: Si se activa este bit, se activa el módulo A/D.
Registro ANSEL:
2. DISEÑO DE TRANSMISOR Y RECEPTOR
•
•
•
25
Bit 7: No utilizado
Bit 6-4: Selección del reloj del conversor A/D
000= Fosc/2
001= Fosc/8
010= Fosc/32
x11= Utiliza el clock del oscilador interno
100= Fosc/4
101= Fosc/16
110= Fosc/64
Bit 3-0: Selección del canal analógico. Si el bit vale 1, se
asigna ese canal como entrada analógica. Si por el
contrario vale 0, se configura el canal como I/O digital.
El resultado de la conversión se guarda en dos registros: ADRESH y
ADRESL. En función del bit 7 (Justificación del resultado) el LSB
quedará en una posición o en otra a lo largo del registro ADRESL. Esto
se muestra en la fig. 2.5
Fig. 2.5 Formato del resultado del A/D
26
SENSORES INALÁMBRICOS DE BAJO CONSUMO
2.2.2.2 Diagrama de estados
1
MAIN
FSR = Data0
Lectura Analógica
3
BitCont = 8
Activar TX
Rotar INDF
Data0=ID_TX
Data1=ADRESL
Data2=ADRESH
Data3=0x55
SI
NO
INDF = 1?
Sync =16
TALTO = 1
TALTO = 2
TBAJO = 2
TBAJO = 1
TX = 1
TMR0=0000
Temporizar 512us
TX = 1
TMR0=0000
TX = 0
TMR0=0000
Temporizar 512us
Temporizar
TALTO
TX = 0
Dec Sync
TMR0=0000
Sync = 0?
Temporizar
TBAJO
NO
SI
TMR0=0000
Temporizar
2.56ms
Dec BitCont
NO
BitCont = 0?
SI
1
2
2. DISEÑO DE TRANSMISOR Y RECEPTOR
27
2
Incrementar FSR
(Data3 XOR FSR)
AND 0x1F
Resultado =
0?
NO
3
SI
Temporizar
15.36ms
Desactivar TX
Sleep
MAIN
Fig. 2.6 Diagrama de estados emisor
2.3. Diseño del receptor
2.3.1. Hardware
El receptor que se ha utilizado para la recepción de los datos es el que
proporciona el kit Pickit1. Este receptor se basa en el chip rfRXD0420 de la
casa Microchip. Las principales características de este receptor son las
siguientes:
•
•
•
•
Permite seleccionar la frecuencia intermedia entre los 455kHz y los
21.4MHz mediante un sencillo filtro formado por un cristal de cuarzo
y un pequeño condensador
Es capaz de demodular señal en ASK, FSK y FM
La demodulación en ASK y FSK la realiza mediante un detector de
cuadratura (detector de coincidencia de fase)
Para ASK y FSK el decisor se hace mediante un amplificador
operacional configurado como comparador. También es posible
configurarlo como filtro para demodular FM
28
SENSORES INALÁMBRICOS DE BAJO CONSUMO
En el anexo 2.6 se puede observar el diagrama de bloques del receptor
rfRXD0420
Para seleccionar la frecuencia de recepción se pone un cristal de cuarzo
externo. En la figura 2.7 se muestran los diferentes valores de cristal y las
diferentes frecuencias de recepción resultantes. El valor del condensador C ha
de ser entre 15pF y 20pF
Frecuencia de recepción
315 MHz
433.92 MHz
Frecuencia de cristal X1
20.35625 MHz
26.45125 MHz
Fig. 2.7 Selección de frecuencia de recepción
El proceso de demodulación que sigue este chip es el siguiente: Se utiliza
como detector ASK un amplificador limitador de Frecuencia intermedia. La
señal que sale del detector es filtrada y comparada con una señal de referencia
para determinar si se ha recibido un uno o un cero lógico. El diseño de este
filtro dependerá de donde se quiera poner el umbral de decisión. Sabiendo que
la constante de tiempo τ = RC y que R = 36 KΩ , que es la impedancia de salida
del detector, y que C es el C1 del circuito receptor, se puede fijar el umbral de
decisión.
Hay que tener cuidado a la hora de fijar la constante de tiempo, ya que si se
pone demasiado larga puede provocar interferencia ínter simbólica con la
consecuente pérdida de bits.
Para más detalles sobre este receptor ver data-sheet. En el se explica
exactamente como seleccionar cada uno de los componentes externos.
En el anexo 2.7 se muestra el esquema que utiliza el receptor que se
proporciona con el kit de pruebas Pickit1. Este receptor ya viene configurado
como un demodulador ASK.
2. DISEÑO DE TRANSMISOR Y RECEPTOR
29
2.3.2. Software
2.3.2.1. Configuración registros
Como se ha explicado con anterioridad, para el receptor, se ha utilizado el
PIC16F676. La única diferencia con el PIC12F675 está en el número de
puertos. El PIC12F675 solo tiene 6 puertos, en cambio el PIC16F676 dispone
de 12 puertos configurables igualmente como I/O. Estos 12 puertos están
divididos en dos grandes puertos de 6 bits cada uno, PORTA y PORTC.
Así pues, en este nuevo PIC el único registro de configuración que cambia con
respecto al otro será el que hace referencia a los puertos. La configuración de
los puertos está dividida en dos registros, uno para cada puerto, A y C.
Registro PORTA: Sirve para cambiar o visualizar el estado de un puerto
dentro del puertoA.
•
•
Bit 7-6: No utilizado
Bit 5-0: Estado del puerto. 1 Activo, 0 Inactivo
Registro TRISA: Sirve para configurar la dirección de los puertos A
•
•
Bit 7-6: No utilizado
Bit 5-0: Si es 1 el puerto es configurado como entrada y si
es 0 se configura como salida
Registro PORTC: Sirve para cambiar o visualizar el estado de un puerto
dentro del puertoB.
• Bit 7-6: No utilizado
• Bit 5-0: Estado del puerto. 1 Activo, 0 Inactivo
Registro TRISC: Sirve para configurar la dirección de los puertos C
30
SENSORES INALÁMBRICOS DE BAJO CONSUMO
•
•
Bit 7-6: No utilizado
Bit 5-0: Si es 1 el puerto es configurado como entrada y si
es 0 se configura como salida
2.3.2.2. Diagrama de estados
El programa principal del receptor consta de 10 posibles estados. Cada estado
corresponde a un estado de la comunicación entre emisor y receptor. Los
posibles estados son:
• INICI: Sirve para detectar entrada de datos
• INICI1: Detecta entrada de trama de sincronismo inicial
• SILEN: Detecta pausa antes de recepción de datos
• SILEN1: Mira que la pausa no sea demasiado larga y detecta la entrada
de la trama de datos
• UNO1: Detecta el estado alto de un bit
• CERO0: Detecta el estado bajo de un bit
• SALVAR: Controla los bits recibidos y los guarda en su registro
correspondiente
• ESPERA: Comprueba que se finaliza la transmisión y monitoriza el
silencio de antes de la siguiente transmisión.
• OK: Comprueba la identidad del emisor y si es válida guarda los datos
en memoria.
• IL_LEDS: Muestra los datos recibidos en los leds del Pickit1. La función
de mostrar los datos en los leds se ha extraído directamente de una
programa de muestra para poder visualizar el resultado de la transmisión
ya que no es objeto de este trabajo la realización de dicho programa.
2. DISEÑO DE TRANSMISOR Y RECEPTOR
31
RESET
MAIN
Actualizar timer leds
Actualizar estado leds
Actualizar clock
Comprobar
variable control
INICI
INICI1
SILEN
SILEN1
UNO1
CERO0
SALVAR
ESPERA
OK
IL_LEDS
32
SENSORES INALÁMBRICOS DE BAJO CONSUMO
2. DISEÑO DE TRANSMISOR Y RECEPTOR
33
34
SENSORES INALÁMBRICOS DE BAJO CONSUMO
MAIN
OK
IL_LEDS
Leer posición 0x00
EEPROM
LEDREG = DATA1
RESET
EEPROM y
DATA0 son
iguales?
NO
RESET
SI
Guardar DATA1 en
posición 0x01
EEPROM
Guardar DATA2 en
posición 0x02
EEPROM
Incrementar Control
Fig. 2.8 Diagrama de estados receptor
3. FUTURAS LÍNEAS DE INVESTIGACIÓN
35
3. FUTURAS LÍNEAS DE INVESTIGACIÓN
Después de estudiar a fondo las características del sistema parece claro cual
ha de ser la continuación de este proyecto. El principal tema que hay que
investigar es la comunicación microcontrolador-PC. Hay que conseguir acceder
a la memoria del microcontrolador desde el ordenador vía USB para leer los
datos de temperatura recibidos.
Una vez logrado habría que visualizar por pantalla la temperatura recibida. Esto
se podría hacer con un entorno de programación visual tipo Visual C++ o Visual
Basic. Los datos recibidos se podrían ir guardando en disco y finalmente hacer
un gráfico de temperaturas o historial, máximas, mínimas, etc.
Una vez conseguidos estos objetivos se podría invertir un poco más de tiempo
en mejorar algunos aspectos del sistema emisor-receptor. Por ejemplo:
-
-
-
Detección de batería baja en emisor. El rfPIC12F675 incorpora un
detector de caída en el nivel de alimentación. Una vez detecta que ha
habido una bajada de tensión, activa un flag para indicarlo. Si junto con
los datos de temperatura se enviase este flag, se podría monitorizar el
estado de la pila del emisor.
Implementar el sensor de temperatura y comprobar de su
funcionamiento.
Implementar el sistema en un circuito impreso. Haciendo el diseño cad,
etc.
Posibilidad de crear una estación meteorológica completa añadiendo
diferentes sensores (humedad, presión, velocidad del viento, etc.) cada
uno con un subprograma e identificador distinto.
Desarrollar funciones de ahorro de energía. En las pruebas iniciales del
microcontrolador se ha investigado alguna función como SLEEP, pero
habría que investigar como utilizarlo para que el microcontrolador pueda
permanecer en standby durante 1 min. por lo menos (entre emisión y
emisión).
Posibilidad de alimentar el emisor con una placa solar.
36
SENSORES INALÁMBRICOS DE BAJO CONSUMO
4. CONCLUSIONES Y BIBLIOGRAFÍA
4.1. Conclusiones
En este trabajo se ha comprobado una de las posibles aplicaciones de los
microcontroladores, en concreto una aplicación inalámbrica. Al utilizar un
microcontrolador que lleva incorporado el circuito de RF se ahorra mucho
espacio. A parte de este ahorro de espacio, también se ahorra energía. Gracias
al poco consumo y a funciones especiales de que dispone, este
microcontrolador es idóneo para aplicaciones inalámbricas en que el consumo
sea vital.
Como se ha comentado ya, habría que investigar más sobre las funciones de
ahorro de energía del microcontrolador, ya que aumentaría considerablemente
la autonomía del emisor.
Como conclusión final, decir que este sistema, una vez finalizado, tiene muchas
posibilidades en diferentes campos: domótica, automoción, estaciones
meteorológicas, etc. ya que permite tener un sensor separado del equipo
principal y, además sin tener que preocuparse demasiado de su consumo y por
tanto de cambiarle la pila.
4. CONCLUSIONES Y BIBLIOGRAFÍA
4.2. Bibliografía
[1] Tutoriales: Microchip, CDROOM PICkit 1 Flash Starter Kit v2.1, 2004
[2] Microchip, Low Frequency Magnetic Transmitter Design, 2002
[3] Microchip, rfPIC12F675K/675F/675H Data Sheet, 2003
[4] Microchip, PIC16F630/676 Data Sheet, 2003
[5] Microchip, rfRXD0420/0920 Data Sheet, 2003
[6] “Interfaz USB”, elektor, 245, 30 - 35
37
38
SENSORES INALÁMBRICOS DE BAJO CONSUMO
ANEXOS
SENSORES INALÁMBRICOS DE BAJO CONSUMO
TITULACIÓ: Sistemes de Telecomunicació
AUTOR: Marc Ralita Álvarez
DIRECTOR: Francesc Sánchez Robert
DATA: 25 de febrer de 2005
ANEXO 1
39
ANEXO 1
Sensores
Un sensor es un dispositivo transductor, es decir, es capaz de convertir una
magnitud física en una magnitud eléctrica en función de la primera magnitud. El
mejor ejemplo de transductor sería un micrófono, que transforma las ondas
sonoras generadas por las cuerdas vocales en impulsos eléctricos. Otro
ejemplo, y este será el estudiado en este apartado, sería un sensor de
temperatura, que transforma la magnitud física temperatura en un valor de
tensión en función de la temperatura a la que esté sometido el dispositivo.
El sensor propuesto, el TC1047 de la casa Microchip, es un sensor de muy
reducidas dimensiones, 3mm de largo por 2mm de ancho. Gracias a su
reducido tamaño, es ideal para diseños en que el poco espacio es una cosa a
tener muy en cuenta. Así, en el emisor del sistema que se está diseñando, se
podrá incorporar en el mismo circuito impreso sin suponer una molestia.
Este sensor puede ir alimentado desde 2.7v hasta 4.4v y tiene un consumo de
entre 35µA y 60µA. Dado que se intenta diseñar un sistema de bajo consumo
esta característica es muy importante ya que permitirá reducir el consumo total
del sistema, incluso puede permitir la utilización de cualquier fuente de energía
de no más de 3v.
Las características básicas de este sensor son:
Tabla 1.1 Especificaciones TC1047
40
SENSORES INALÁMBRICOS DE BAJO CONSUMO
Fig. 1.1 Pins del sensor de temperatura
El siguiente gráfico muestra la variación de tensión en la salida en función de la
temperatura a la que se encuentre el dispositivo.
Fig. 1.2 Vout en función de la temperatura
ANEXO 1
41
En este gráfico se puede ver la precisión real del sensor. En la escala de la
izquierda se muestra la temperatura medida realmente. En la escala inferior se
muestra la temperatura ambiente.
Fig. 1.3 Precisión del sensor de temperatura
En el siguiente gráfico se observa el consumo de corriente en función de la
temperatura
Fig. 1.4 Consumo en función de la temperatura
42
SENSORES INALÁMBRICOS DE BAJO CONSUMO
ANEXO 2
2.1. Pins del rfPIC12F675
Fig. 2.1 Pins del rfPIC12F675
ANEXO 2
43
2.2. Esquema Transmisor
Fig. 2.2 Esquema emisor Pickit1
44
SENSORES INALÁMBRICOS DE BAJO CONSUMO
2.3. Memoria del rfPIC12F675
Este PIC dispone de 3 tipos de memoria:
-
Flash para guardar el programa realizado en ensamblador.
EEPROM para guardar toda la información referente a la
configuración de los diferentes registros
RAM para guardar registros de propósito general mapeado a
continuación de la memoria EEPROM.
La memoria de programa esta mapeada tal y como muestra la Fig. 2.3 aunque
solo es accesible el espacio comprendido entre las direcciones de memoria
0000h y 03FFh. El resto esta reservado para la pila y los vectores de reset y de
interrupción.
La memoria EEPROM o memoria de datos está particionada en dos bancos de
memoria distintos. En cada uno hay una parte del total de los registros de
propósito general. En la Fig. 2.4 se observan los diferentes registros con que
cuenta el rfPIC12F675 para su configuración de puertos, interrupciones,
comparador, conversor A/D, etc. *
Fig. 2.3 Mapa de memoria de programa
*
NOTA: Para más información acerca de la configuración de cada registro ver
Data Sheet de rfPIC12F675F incluido en esta memoria o ver bibliografía.
ANEXO 2
45
Fig. 2.4 Mapa de memoria de datos
46
SENSORES INALÁMBRICOS DE BAJO CONSUMO
2.4. Juego de instrucciones del rfPIC12F675
Cada microcontrolador dispone de sus propias instrucciones en ensamblador
para poder ser programado. El rfPIC12F675 solo dispone de 35 instrucciones,
con lo cual es muy sencillo aprender su funcionamiento. Son las mostradas en
la Fig. 2.5
Fig. 2.5 Instrucciones del rfPIC12F675
ANEXO 2
47
2.5. Diagrama de bloques receptor
Fig. 2.6 Diagrama de bloques receptor
48
SENSORES INALÁMBRICOS DE BAJO CONSUMO
2.6. Esquema Receptor
Fig. 2.7 Esquema receptor Pickit1
ANEXO 3
49
ANEXO 3
Programa principal
3.1. Programa emisor
; En este programa se desarrolla la parte de RF del PIC12F675
list
p=12f675
#include <p12f675.inc>
errorlevel -302
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF &
_PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
; Definición de las diferentes variables
cblock 0x20
w_temp
status_temp
cont
DATA0
DATA1
DATA2
DATA3
DATA4
TEMP
SYNC
BitCont
TALTO
TBAJO
endc
#define TX GPIO, 2
#define RFENA GPIO, 5
; Salida RF (Datos a transmitir) 1/0
; RF Enable
50
SENSORES INALÁMBRICOS DE BAJO CONSUMO
RESET
nop
goto
ORG
0x000
; Vector RESET
INIT
; Rutina de Interrupción
; Primero hay que guardar el estado del registro STATUS y de W
ORG
0x004
bcf INTCON, GIE
movwf w_temp
swapf STATUS, W
bcf STATUS, RP0
movwf status_temp
; Vector Interrupcion
; Deshabilita las interrupciones globales
; Guarda el registro W
; Banco 0
; Guarda el registro STATUS
; Funciones a realizar durante la interrupción
;--------------------------------------------------------------------------bcf INTCON, GPIF
goto RESET
; borra el flag que avisa de la interrupción
; Cuando se genera una interrupción (Pulsador
;GP3) se hace un reset
;--------------------------------------------------------------------------; Vuelve a cargar el estado del registro STATUS y W
swapf status_temp, W
movwf STATUS
swapf w_temp, F
swapf w_temp, W
bcf
STATUS,RP0
bsf INTCON, GIE
; Restaura el registro STATUS
; Restaura el registro W
; banco 0
; Rehabilita las interrupciones globales
retfie
; Cargar contador
;****************************************************************************
; El timer0 es un contador de 8 bits por lo tanto puede contar hasta 256
; cada instrucción dura 1us y por lo tanto el timer0 puede temporizar 256us
; Con el preescaler del Timer1 puesto como 1:2, cada 2 ciclos solo contará 1.
; de esta manera puede temporizar como mucho hasta 512us
;****************************************************************************
CONTA
bcf
INTCON,2 ; borra el flag de overflow por si llega activo
clrf
cont
; En función del valor que se le de a W el contador
movwf cont
; cogerá un valor u otro.
ANEXO 3
51
TIMER0
btfss INTCON, 2
;¿Esta activo el flag de overflow del Timer0?
goto TIMER0
;Si esta activo el flag no ejecuta esta linea
bcf
INTCON, 2
;Borra el flag de overflow
decfsz cont,1
goto TIMER0
return
;*************************************************************************
;* Aquí se realiza la conversión analógico-digital de la tensión que hay *
;* en el potenciometro GP0.
*
;* El resultado de 10 bits se guarda en los registros ADRESH y ADRESL
;*************************************************************************
LECTURA_ANALOG
bsf
ADCON0, ADON
*
; Turn on ADC module
; Temporización para dar tiempo al condensador del conversor a que se cargue
movlw D'6'
movwf TEMP
decfsz TEMP, F
goto $-1
; At 4 MHz, a 22us delay
; (22us = 2us + 6 * 3us + 1us)
bcf
bsf
STATUS, RP0
ADCON0, ADON
;banco 0
;enciende el A/D
bsf
ADCON0, GO
;Empieza la conversión
btfsc ADCON0, GO
goto
$-1
bcf
;¿Ha acabado la conversión?
ADCON0, ADON ;Apaga el A/D
return
; Inicialización de los diferentes registros
INIT
; Calibración del oscilador local
bsf
STATUS, RP0
; Banco 1
52
SENSORES INALÁMBRICOS DE BAJO CONSUMO
call 0x3FF
movwf OSCCAL
; Centra en su frecuencia central
bcf
; Banco 0
STATUS, RP0
; Configuración de puertos
bcf INTCON, GIE ; Deshabilita las interrupciones globales
bcf INTCON, PEIE ; Deshabilita Interrupción de Perifericos
bsf STATUS, RP0
movlw b'00011011'
movwf TRISIO
; Banco 1
;configura puerto 0,1,3 y 4 como entrada y 2 y 5
;como salida
; Configuración interrupción puertos
bsf
INTCON, GPIE
movlw b'00001000'
movwf
IOC
; Activa interrupción por cambio de estado en
; puertos
; Activa interrupción por cambio de estado
; puerto 3
; Configuración del Timer0
bsf
STATUS, RP0
movlw b'11000000'
movwf OPTION_REG
bcf
INTCON, 2
;banco 1
; Configura el registro para usar el Timer0
; preescaler a 1:2 (Tiempo máximo 512us)
; Borra el flag de overflow del Timer0
; Configuración del módulo A/D
;*********************************************************************************
; Seleccionando la frecuencia del reloj del conversor como Fosc/8 estamos
haciendo
; que el A/D tarde 2 ciclos en realizar la conversión.
;*********************************************************************************
bcf
STATUS, RP0
movlw b'10000000'
movwf ADCON0
bsf
STATUS,RP0
movlw b'00010011'
movwf ANSEL
bcf
STATUS, RP0
; banco 0
; Configura el registro del A/D para que el
; resultado quede alineado a la derecha y
; selecciona canal AN0
; selecciona banco 1
; selecciona Fosc/8 y puertos 3,2 como I/O
; digitales
; Configura puertos 0,1 como entrada
; analogica (pot)
; banco 0
ANEXO 3
53
MAIN
bsf
bsf
INTCON, GIE
INTCON, PEIE
; Habilita todas las interr. globales
; Habilita Interrupción de Perifericos
call
LECTURA_ANALOG
; A partir de aquí se rellena el buffer de transmisión con todo lo que se enviará
; Primero se envía el ID del emisor. De esta manera puede haber más de un
; emisor.
; A continuación se envían los datos
BUFFER_TX
bsf
RFENA
movlw 0x73
movwf DATA0
bsf STATUS, RP0
movfw ADRESL
bcf STATUS, RP0
movwf DATA1
movfw ADRESH
movwf DATA2
; Activa el Transmisor
; Nº de identificación del emisor
; Banco 1
; Banco 0
; Guarda los 8 bits de menor peso de la
; conversión A/D
; Guarda los 8 bits(2 en realidad) de
; mayor peso
; Flags de comprobación de final de
; Datos (Lo utiliza el RX)
movlw
0x55
movwf
DATA3
; A partir de aquí ya se empieza a TX
;**********************
;* Sincronismo *
;**********************
movlw
d'16'
; Nº de pulsos de sincronismo
movwf
SYNC
Sincro
bsf
TX
movlw
d'1'
clrf
TMR0
call
bcf
CONTA
TX
; DATA ON
; Pone el Timer0 a 0. A partir de aquí el Timer0 tarda
; dos ciclos en empezar a contar
; Temporización de 512us
; DATA OFF
54
SENSORES INALÁMBRICOS DE BAJO CONSUMO
movlw d'1'
clrf
TMR0
call CONTA
decfsz SYNC
goto
Sincro
; Una vez sincronizado hace una pausa de 2.56ms para que el receptor sepa
; que a continuación bienen los datos
Pausa
movlw d'5'
clrf
TMR0
call CONTA
;pausa de 2.56ms
movlw DATA0
movwf FSR
;Mueve el puntero a los primeros datos a enviar
;Direccionamiento indirecto
Byte
movlw d'8'
movwf BitCont
Bit
rrf
rrf
BC
INDF,w
INDF,f
UNO
;Recorre los 8 bits de un Byte
CERO
movlw d'2'
movwf TALTO
movlw d'1'
movwf TBAJO
goto TXbit
UNO
movlw d'1'
movwf TALTO
movlw d'2'
movwf TBAJO
TXbit
bsf
TX
movf TALTO,w
clrf
TMR0
call CONTA
;DATA ON
bcf
TX
movf TBAJO,w
clrf
TMR0
;DATA OFF
;TX durante TALTO
ANEXO 3
call
55
CONTA
decfsz BitCont,F
goto Bit
incf FSR,F
movlw DATA4
xorwf FSR,W
andlw 0x1F
BNZ Byte
;No TX durante TBAJO
; Salta para TX el siguiente bit de los 8
; que tiene cada variable
;Mira si es el último byte de datos
; 0x55 -> DATA3?
; Todos los datos ya estan enviados. Ahora se deja un tiempo de guarda
; para que el receptor sepa que ya se han acabado los datos.
movlw d'30'
clrf
TMR0
call CONTA
;Tiempo de guarda de 15.36ms
bcf
; Apaga el Transmisor
RFENA
goto MAIN
; Configuración del reloj interno del microprocesador
org 0x3ff
retlw 0x40
end
3.2 Programa receptor
list p=16f676
#include <p16f676.inc>
errorlevel -302
; suprime mensajes de compilación
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF &
_PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
56
SENSORES INALÁMBRICOS DE BAJO CONSUMO
cblock 0x20
TEMP
DATA0
DATA1
DATA2
; 1er byte de los datos recibidos
; 2o byte de los datos recibidos
; 3er byte de los datos recibidos
INICIO
TBAJO
TALTO
TOTAL_BAJ
TOTAL_ALT
; Variable para ir incrementando el contador de tiempo
; Temporiza el tiempo que esta en estado bajo
; Temporiza el tiempo que esta en estado alto
; Guarda el tiempo total que ha estado en estado bajo
; Guarda el tiempo total que ha estado en estado alto
CONTROL
conta
FLAGS
; Controla en que estado del programa está
; Contador de bits
; flags
; Variables de control de visualización de los datos recibidos
; Extraido tal cual de un programa de muestra
; Los datos son mostrados en una matriz de leds de los cuales nunca habrá
; más de uno encendido.
; La visualización se realiza por multiplexación de dicha matriz.
SX1TMR
SX2TMR
; LED timer (low order)
; LED timer (high order)
LEDREG
LEDREGBUF
LEDSTATE
; LED Array Register
; LED Array Register Buffer
; LED Array State Counter
endc
#define RX PORTC, 1
; Datos recibidos por el puerto RC1 procedentes
;del demodulador ASK rfRXD0420
; Definición de los diferentes estados del programa
; El programa consta de diferentes estados. En función de los datos recibidos
; pasará o no al siguiente estado.
#define
#define
#define
#define
INICIAR
0x00
INICIAR1 0x01
PAUSA
0x02
PAUSA1
0x03
ANEXO 3
#define
#define
#define
#define
#define
#define
57
UNO
CERO 0x05
GUARDAR
TGUARDA
VALIDAR
MOSTRAR
0x04
0x06
0x07
0x08
0x09
; Flags
#define FLAG1 FLAGS, 0
#define FLAG2 FLAGS, 1
; Flag utilizado en la rutina de temporización
; Flag utilizado en la rutina de finalización de
;TX
; Definiciones para las subrutinas de activación de los leds
#define LED0
#define LED1
#define LED2
#define LED3
#define LED4
#define LED5
#define LED6
#define LED7
LEDREG, 0
LEDREG, 1
LEDREG, 2
LEDREG, 3
LEDREG, 4
LEDREG, 5
LEDREG, 6
LEDREG, 7
; S0 LED
; S1 LED
; S2 LED
; GPIO Pins = xx543210
#define LED0TRIS b'00001111'
#define LED1TRIS b'00001111'
#define LED2TRIS b'00101011'
#define LED3TRIS b'00101011'
#define LED4TRIS b'00011011'
#define LED5TRIS b'00011011'
#define LED6TRIS b'00111001'
#define LED7TRIS b'00111001'
#define LEDOFFTRIS b'00111111'
; GPIO Pins = xx543210
#define LED0ON
b'00010000'
#define LED1ON
b'00100000'
#define LED2ON
b'00010000'
#define LED3ON
b'00000100'
#define LED4ON
b'00100000'
#define LED5ON
b'00000100'
#define LED6ON
b'00000100'
#define LED7ON
b'00000010'
58
SENSORES INALÁMBRICOS DE BAJO CONSUMO
ORG
nop
goto
0x000
; Vector RESET
RESET
DATA_EEPROM_READ
bsf STATUS, RP0
movwf EEADR
bsf EECON1, RD
movf EEDATA, W
bcf STATUS, RP0
; Banco 1
; Mueve W a EEADR. En W esta la dirección de
;memoria a leer
; inicia la lectura
; Mueve el dato leido a W
; Banco 0
return
DATA_EEPROM_WRITE
bsf
STATUS, RP0
bsf
EECON1, WREN
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1, WR
btfsc EECON1, WR
goto
; Banco 1
; Activa el permiso de escritura
; Configuración del registro de control de la
; EEPROM
; Inicia la escritura
; Comprueba si la escritura ha finalizado. Si
;esta a 0 ha finalizado.
$-1
bcf
EECON1, WREN
bcf
STATUS, RP0
; Desactiva el permiso de escritura
; Banco 0
return
INI
; Calibración del oscilador local
bsf
STATUS, RP0
; Banco 1
ANEXO 3
59
call 0x3FF
movwf OSCCAL
; Centra en su frecuencia central
bcf
; Banco 0
STATUS, RP0
; Configuración de puertos A y C
bsf
STATUS, RP0
movlw b'00111111'
movwf TRISA
movlw
movwf
movlw
movwf
bcf
b'00111111'
TRISC
b'00000000'
ANSEL
STATUS, RP0
; Banco 1
; Configura todos los puertos A como entradas
; Configura todos los puertos C como entradas
; Configura todos los puertos como I/O digitales
; Banco 0
; Configuración del Timer0
bsf
STATUS, RP0
; Banco 1
movlw b'11000001'
movwf OPTION_REG
; Preescaler a 1:4
bcf
; Banco 0
STATUS, RP0
retlw 0
; La subrutina TIMER sirve para controlar el tiempo que los leds están
; encendidos
TIMER
btfss FLAG1
goto TIMER1
movlw B'01111111'
addwf TMR0, W
btfss STATUS, C
retlw 0
bcf FLAG1
incfsz SX1TMR, F
retlw 0
incf
SX2TMR, F
60
SENSORES INALÁMBRICOS DE BAJO CONSUMO
retlw 0
TIMER1
movlw B'01111111'
addwf TMR0, W
btfsc STATUS, C
retlw 0
bsf FLAG1
retlw 0
; Control de temporizadores TBAJO - TALTO
; TBAJO temporiza hasta 1,024ms (2^8us*4)
; TALTO temporiza hasta 0,262s (2^8*1,024ms) con saltos de 1,024ms
; Cada vez que TBAJO llega a su máximo TALTO se incrementa en una unidad
; por lo tanto juntando los dos como un solo temporizador se puede llegar
; a contar hasta 0,262sec
CLOCK
movf INICIO, W
subwf TMR0, W
addwf TBAJO, F
btfsc STATUS, C
incf TALTO, F
movf TMR0, W
movwf INICIO
; El tiempo que lleva el contador TMR0 menos el
; tiempo que se inició se va añadiendo a la
;variable
; TBAJO hasta que desborde.
; en caso que desborde TBAJO se incrementa
;TALTO
; Nueva cuenta de TBAJO
retlw 0
; Inicializa variables de temporización
INICIALIZACION
movf TMR0, W
movwf INICIO
clrf TBAJO
clrf TALTO
retlw
0
; Inicializa variables de temporización de led's
SXON
btfss SX2TMR, 0
ANEXO 3
61
retlw 0
clrf
LEDREG
; Apaga todos los led's
retlw 0
; Subrutina de control del encendido de los leds (Máquina de estado)
LEDStateMachine
movlw HIGH LEDStateMachineStart
movwf PCLATH
movf LEDSTATE, W
andlw B'00000111'
addwf PCL, F
LEDStateMachineStart
goto LEDSTATE0
goto LEDSTATE1
goto LEDSTATE2
goto LEDSTATE3
goto LEDSTATE4
goto LEDSTATE5
goto LEDSTATE6
goto LEDSTATE7
LEDSTATE0
call LITELED0
goto EndLEDStateMachine
LEDSTATE1
call LITELED1
goto EndLEDStateMachine
LEDSTATE2
call LITELED2
goto EndLEDStateMachine
LEDSTATE3
call LITELED3
goto EndLEDStateMachine
LEDSTATE4
call LITELED4
goto EndLEDStateMachine
LEDSTATE5
call LITELED5
62
SENSORES INALÁMBRICOS DE BAJO CONSUMO
goto
EndLEDStateMachine
LEDSTATE6
call LITELED6
goto EndLEDStateMachine
LEDSTATE7
call LITELED7
EndLEDStateMachine
return
;---------------------------------------LITELED0
bsf STATUS, RP0
movlw LED0TRIS
movwf TRISA
bcf STATUS, RP0
movlw LED0ON
movwf PORTA
return
LITELED1
bsf STATUS, RP0
movlw LED1TRIS
movwf TRISA
bcf STATUS, RP0
movlw LED1ON
movwf PORTA
return
LITELED2
bsf STATUS, RP0
movlw LED2TRIS
movwf TRISA
bcf STATUS, RP0
movlw LED2ON
movwf PORTA
return
LITELED3
bsf STATUS, RP0
movlw LED3TRIS
movwf TRISA
bcf STATUS, RP0
movlw LED3ON
movwf PORTA
return
ANEXO 3
63
LITELED4
bsf STATUS, RP0
movlw LED4TRIS
movwf TRISA
bcf STATUS, RP0
movlw LED4ON
movwf PORTA
return
LITELED5
bsf STATUS, RP0
movlw LED5TRIS
movwf TRISA
bcf STATUS, RP0
movlw LED5ON
movwf PORTA
return
LITELED6
bsf STATUS, RP0
movlw LED6TRIS
movwf TRISA
bcf STATUS, RP0
movlw LED6ON
movwf PORTA
return
LITELED7
bsf STATUS, RP0
movlw LED7TRIS
movwf TRISA
bcf STATUS, RP0
movlw LED7ON
movwf PORTA
return
;Subrutina de encendido de led's
DISPLAY
movf
btfsc
goto
btfss
goto
LEDSTATE, W
STATUS, Z
; Are we at state 0?
BUFFERRESET
; Yes
LEDSTATE, 3
; No, did we pass the last state?
BUFFERLOADED
; No
BUFFERRESET
movf LEDREG, W
btfss STATUS, Z
; Yes
; is LEDREG = 0?
64
SENSORES INALÁMBRICOS DE BAJO CONSUMO
goto BUFFERRESET1
bsf STATUS, RP0
movlw LEDOFFTRIS
movwf TRISA
bcf STATUS, RP0
clrf PORTA
BUFFERRESET1
movf LEDREG, W
movwf LEDREGBUF
LEDREGISTER
clrf LEDSTATE
BUFFERLOADED
bcf STATUS, C
rrf LEDREGBUF, F
btfsc STATUS, C
goto UPDATELED
goto CONTINUE
UPDATELED
call LEDStateMachine
CONTINUE
incf LEDSTATE, F
return
; no, jump over
; yes, turn off LEDs
; ---- Select Bank 1 ----; ---- Select Bank 0 -----
; Reload with the current value in
; Ensure State Zero
; Ensure Carry Is Clear
; Is The Next Bit a '1'
; Yes, Update The LED Array
; No
; Update LED Array
; Point To Next State
; Programa Principal
; Inicialización de las diferentes variables y puertos
RESET
clrf FLAGS
clrf PORTA
clrf PORTC
clrf LEDREG
clrf LEDSTATE
clrf LEDREGBUF
movlw INICIAR
movwf CONTROL
call INI
MAIN
call
call
call
TIMER
CLOCK
DISPLAY
; Control de iluminación de leds
; Control de Contadores
; Actualización de matriz de led's
ANEXO 3
65
movlw B'00000111'
andwf LEDREG, W
btfss STATUS, Z
call SXON
; Control de estado de led's
movlw HIGH ESTADO
movwf PCLATH
movf CONTROL, W
andlw B'00001111'
addwf PCL, F
; Filtra la variable CONTROL ya que solo
; habrán
; 10 posibles estados
; Mediante la variable control se incrementa el
; contador de programa para pasar de un estado a
;otro
ESTADO
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto
INICI
INICI1
SILEN
SILEN1
UNO1
CERO0
SALVAR
ESPERA
OK
IL_LEDS
; A la espera de trama de sincronismo
INICI
btfsc RX
incf CONTROL, F
goto MAIN
INICI1
btfsc RX
goto MAIN
call
incf
INICIALIZACION
CONTROL, F ; Pasa a monitorizar el silencio para determinar
; si está en estado de sincronismo o pausa antes de
goto MAIN
; estado DATOS
; Si hay un cero durante 1,25ms pasa a SILEN1
SILEN
btfsc RX
66
SENSORES INALÁMBRICOS DE BAJO CONSUMO
goto RESTART
btfss TALTO, 0
goto MAIN
movlw D'64'
andwf TBAJO, W
btfsc STATUS, C
goto MAIN
incf
goto
; Temporiza 1,024ms. Entonces hay overflow
; que se ve reflejado en TALTO bit 0
; Ahora hay que temporizar los 0,25ms restantes
; Por eso 64 * 4us = 0,25ms
; Cuando hay overflow se acaba la temporización
CONTROL, F
MAIN
; SILEN 1 y 2 Comprueba que no este más de 6ms en estado bajo
SILEN1
movlw D'6'
subwf TALTO, W
btfss STATUS, C
goto SILEN2
goto
; Si hay carry es que lleva mas de 6ms a cero
; y reinicia el programa
RESTART
SILEN2
btfss RX
goto MAIN
call
INICIALIZACION
movlw D'24'
movwf conta
incf CONTROL, F
goto
; Vuelve a pasar por SILEN1 y comprueba
; el tiempo que lleva en estado bajo
; Cuando llega un 1 se reinician todos los
; contadores
; y se prepara para recibir los 24 bits de datos
; Pone CONTROL a estado UNO1
MAIN
; Recibe pulso alto
UNO1
btfsc TALTO, 0
goto RESTART
; Si esta más de 1,024ms (dos 1's) no es un dato
;válido
; y reinicia
btfsc RX
goto MAIN
movf TBAJO, W
; Cuando pasa a estado bajo guarda el tiempo
movwf TOTAL_ALT
; que ha estado en estado alto
call INICIALIZACION
ANEXO 3
incf
goto
67
CONTROL, F
; Pasa a estado CERO0 porque después de un 1
;o dos 1's siempre se enviará un 0 o 2 0's
MAIN
; Recibe pulso bajo
CERO0
btfsc TALTO, 0
válido
goto CERO2
; Si esta más de 1,024ms (dos 0's) no es un dato
; y pasa a estado PAUSA
btfss RX
goto MAIN
movf TBAJO, W
; Cuando pasa a estado alto guarda el tiempo
movwf TOTAL_BAJ
; que ha estado en estado bajo
call INICIALIZACION
incf CONTROL, F
; Pasa a estado SALVAR
goto
MAIN
CERO2
movlw PAUSA
movwf CONTROL
goto
; Pasa a estado PAUSA
MAIN
; Guarda cada uno de los bits recibidos en el byte que le corresponde
SALVAR
movf TOTAL_ALT, W
subwf TOTAL_BAJ, W
; Para saber que bit se ha recibido se hace
; la resta entre el tiempo que ha estado en 0
; menos el tiempo que ha estado en 1
; El carry de esta operación es el bit recibido
rrf DATA2, F
rrf DATA1, F
; Se rota bit a bit a traves de las 3 variables
rrf DATA0, F
; hasta completar los 24 bits de datos.
movlw UNO
movwf CONTROL ; Pasa a estado UNO ya que el siguiente dato
decfsz conta, F
; se sabe que empieza por 1 (Todos empiezan por 1)
goto MAIN
movlw TGUARDA
movwf CONTROL
goto MAIN
; Pasa a estado de ESPERA.
; Esta subrutina recibe el último byte de datos que envía el emisor para
68
SENSORES INALÁMBRICOS DE BAJO CONSUMO
; asegurar que se ha finalizado correctamente la TX. Y por último comprueba
; que se recibe un silencio mayor de 8ms
ESPERA
btfsc FLAG2
goto ESPERA1
; Monitoriza los bits recibidos para comprobar si llega
; un 0 y poder contar el tiempo que esta a 0.
btfsc RX
goto MAIN
call
bsf
INICIALIZACION
FLAG2
ESPERA1
btfss RX
goto ESPERA2
bcf
goto
FLAG2
MAIN
ESPERA2
btfss TALTO, 3
goto MAIN
bcf
incf
goto
; Si lleva mas de 8ms pasa a estado OK (VALIDAR)
FLAG2
CONTROL, F
MAIN
; Primero de todo comprueba la identidad del emisor.
; Si no reconoce al emisor no acepta la repción.
OK
movlw 0x00
call DATA_EEPROM_READ
xorwf DATA0, W
btfss STATUS, Z
goto RESTART
movlw 0x01
movwf EEADR
; lee el nº de ID guardado en la EEPROM
; si el nº recibido y el de la EEPROM son
; iguales, continuará
; Guarda el primer byte recibido en la
; posición 0x01 de la EEPROM para su
; posterior
; analisis.
movlw DATA1
movwf EEDAT
call
DATA_EEPROM_WRITE
ANEXO 3
69
movlw
movwf
movlw
movwf
call
incf
goto
0x02
; Guarda el segundo byte en la posición 0x02
EEADR
DATA2
EEDAT
DATA_EEPROM_WRITE
CONTROL, F
; Pasa a estado IL_LEDS (MOSTRAR) para
;mostrar el resultado en los leds
MAIN
IL_LEDS
movfw DATA1
movwf LEDREG
clrf
clrf
goto
SX1TMR
SX2TMR
RESTART
; Se reinicia el programa
; Subrutina de reinicio del programa
RESTART
movlw INICIO
movwf CONTROL
goto
MAIN
; Memoria EEPROM
ORG 0x2100
DE
0x73
; Se guarda el valor del nº de ID del emisor en la
; EEPROM para posteriores comprobaciones
; Configuración del reloj interno del microprocesador
org 0x3ff
retlw 0x40
end
Descargar