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