Universidad Autónoma Metropolitana Unidad Iztapalapa División de CBI Funcionalidad de una red cc1000 básica Proyecto Terminal De Ingeniería Electrónica. Presentado por: Irving Azael Torres González Matrícula: 206214227 Asesores: Ing. Mauricio López Villaseñor Redes y Telecomunicaciones. Departamento de Ingeniería Eléctrica. M. En C. Ricardo Marcelín Jiménez Redes y Telecomunicaciones. Departamento de Ingeniería Eléctrica. Noviembre 2014 Índice Página. 1 Introducción. CAPÍTULO 1. Descripción general de la red de Sensores Inalámbrica. 4 1.1 Arquitectura a bloques del nodo-P y nodo-S. 1.2 Criterios de señalización entre nodos. 1.3 El PIC de Protocolo. 1.3.1 Longitud, contenido y mapa de datos de información. 1.3.2 Funcionamiento del PIC de Protocolo, Nodo-P. 1.3.3 Funcionamiento del PIC de Protocolo, Nodo-S. 1.4 El PIC de Enlace. 1.4.1 Funcionamiento del PIC de Enlace. 1.4.2 Registro de Banderas. 5 6 7 7 12 13 14 15 17 CAPÍTULO 2. Descripción técnica del PIC de Protocolo, nodo-S. 19 2.1 Descripción de funcionamiento. 2.2 Descripción técnica de la subrutina ini_reg. 2.3 Descripción técnica de la subrutina Pseudo. 2.4 Descripción técnica de la subrutina LeeTmp. 2.5 Descripción técnica de la subrutina Dat_basicos. 2.6 Descripción técnica de la subrutina AJUSTAR_AP. 2.7 Descripción técnica de la subrutina Dat_extra. 2.8 Descripción técnica de la subrutina Recibir_ack. 2.9 Descripción técnica subrutina SERVICIO_INTERRUPCION. 19 25 25 27 28 29 30 31 35 CAPÍTULO 3. Descripción técnica del PIC de Protocolo, nodo-P. 39 3.1 Descripción de funcionamiento. 3.2 Descripción técnica de la subrutina Envia_ack. 3.3 Descripción técnica de la subrutina LeeTmp. 3.4 Descripción técnica de la subrutina Muestra_info. 3.5 Conversión de Binario a BCD. 3.5.1 Descripción técnica de la subrutina Bin8_BCD. 3.6 Descripción técnica de la subrutina Tx_mns. 3.7 Descripción de la subrutina de interrupción llamada UART. 3.7.1 Descripción técnica de la subrutina UART. 39 47 48 49 54 54 55 57 57 II CAPÍTULO 4. Descripción técnica del PIC de Enlace. 62 4.1 Descripción de funcionamiento. 62 4.2 Descripción de las subrutinas TXMODE y RXMODE. 70 4.2.1 Descripción de la subrutina TXMODE. 70 4.2.2 Descripción de la subrutina RXMODE. 71 4.3 Servicios de interrupción en el PIC de Enlace. 71 4.3.1 Descripción de la sección del servicio de interrupción por recepción REQUEST_UART_RX. 72 4.3.1.1 Descripción técnica de la sección del servicio de interrupción por recepción REQUEST_UART_RX. 72 4.3.2 Descripción de la sección del servicio de interrupción externa REQUEST_CC1000. 73 4.3.2.1 Descripción técnica de la sección del servicio de interrupción externa REQUESTE_CC1000. 75 4.3.3 Descripción técnica de la sección del servicio de interrupción BUFFER_RX_VACIO. 83 4.4 Descripción de las rutinas ES_VACIOTX y ES_VACIORX. 84 4.4.1 Descripción técnica de la subrutina ES_VACIOTX. 84 4.4.2 Descripción técnica de la subrutina ES_VACIORX. 85 CAPÍTULO 5. Funcionamiento y configuración del módulo CC1000. 87 5.1 Descripción del circuito. 5.2 Interfaz de configuración. 5.3 Interfaz de la señal de Datos. 5.4 Parámetros configurables. 5.4.1 Software y registros de configuración para el módulo CC1000. 5.5 Procedimiento de configuración del módulo CC1000. 5.5.1 Secuencia de inicialización y calibración del módulo CC1000. 5.5.2 Descripción de la subrutina INITCC1000. 5.5.3 Descripción de la subrutina RESETCC1000. 5.5.4 Descripción de la subrutina WRITETOCC1000. 5.5.5 Descripción técnica de la Configuración de Recepción. 5.5.5.1 Descripción de la subrutina TURNONRX. 5.5.5.2 Descripción de la subrutina TURNOFFRX. 5.5.6 Descripción técnica de la Configuración de Transmisión. 5.5.6.1 Descripción de la subrutina TURNONTX. 5.5.6.2 Descripción de la subrutina TURNOFFTX. 5.6 Antenas. 87 88 90 91 91 95 95 97 98 98 106 106 106 108 108 108 110 CAPÍTULO 6. Sensor digital de temperatura DS1621. 111 6.1 Parámetros de configuración y de lectura. 6.2 Programa de configuración y de lectura. 6.2.1 Descripción técnica de la subrutina DS1621_Inicializa. 6.2.2 Descripción técnica de la subrutina DS1621_LeeTemperatura. 111 114 115 115 CAPÍTULO 7. Memoria EEPROM serial 24C02. 128 7.1 Direccionamiento como esclavo. 7.2 Escritura en la memoria 24C02. 7.3 Lectura en la memoria 24C02. 7.4 Descripción técnica de las subrutinas de interacción PIC-Memoria. 7.4.1 Descripción técnica de la subrutina writememory. 7.4.2 Descripción técnica de la subrutina readmemory. 128 129 129 129 130 130 CAPÍTULO 8. Comunicación serial UART. 138 8.1 Descripción técnica de la subrutina envia. 8.2 Descripción técnica de la subrutina RS23Ini. 8.3 Descripción técnica de las subrutinas IniUART. 138 139 140 CAPÍTULO 9. Protocolo de capa física: KeeLoq. 144 9.1 Protocolo P1UAMI. 9.2 Protocolo KeeLoq. 9.3 Generación de tramas en protocolo KeeLoq. 9.3.1 Descripción técnica de la subrutina TRANSMITIR. 9.3.2 Descripción con diagramas de flujo de la subrutina TRANSMITIR. 9.4 Detección de tramas en protocolo Keeloq. 9.4.1 Descripción técnica de la subrutina RECIBIR. 9.4.2 Descripción técnica con diagramas de flujo de la subrutina RECIBIR. 144 145 148 148 152 164 164 168 Anexo 1. Diagrama de conexiones entre el PIC de Protocolo y el PIC de Enlace, nodo-S. 183 Anexo 2. Diagrama de conexiones entre el PIC de Protocolo y el PIC de Enlace, nodo-P. 183 Conclusiones Bibliografía 184 185 Introducción La documentación planteada en este reporte forma parte de un proyecto más amplio y complejo, que propone el desarrollo de una Red de Sensores Inalámbrica, cuya finalidad es la de capturar, almacenar y transmitir información proveniente de los sensores de temperatura actualmente implementados en los nodos denominados secundarios. Esta red esta constituida por un numero determinado de nodos, los cuales fundamentalmente son de dos tipos, uno de ellos llamado nodo secundario, encargado de captar datos del medio físico por medio de los sensores implementados en su tarjeta electrónica, para posteriormente transmitirlos mediante radio frecuencia a otros nodos secundarios, de t al fo rm a q ue la trama de datos con la información em p aq ue t a d a , finalmente llegue a cualquier nodo primario. El nodo primario, se encarga de recopilar toda la información de la red de sensores a través de la recepción de los datos empaquetados a través de un sensor configurado como receptor de radiofrecuencia, para posteriormente, por medio de un puerto serial RS-232 implementado en su tarjeta electrónica, transmitir la información a un ordenador para su futuro procesamiento y visualización por parte del usuario. Como antecedentes a este proyecto, se tiene una infraestructura de un nodo primario (llamado nodoP) y de un nodo secundario (llamado nodo-S). Ambos nodos cuentan con una etapa de control del nodo (constituido por dos microcontroladores, uno llamado PIC de Enlace y el otro PIC de Protocolo), la etapa de radio frecuencia y un sensor de temperatura. El presente proyecto tiene como finalidad incorporar al nodo secundario cuatro memorias externas para aumentar el almacenamiento de datos sin comprometer los recursos propios de los microcontroladores encargados del control del nodo. Además, se incluye las pruebas de integridad del sistema previo, con la incorporación de las memorias externas de almacenamiento y de toda la interacción y funcionamiento del enlace de radio frecuencia entre los nodos. El documento esta dividido en diferentes capítulos. Se detalla con un preámbulo e l panorama general, mientras que gradualmente, a lo largo de los capítulos, se va particularizando el diseño, la implementación y la aplicación de cada etapa. También, se incluyen capítulos del funcionamiento del dispositivo de radio frecuencia, del sensor de temperatura y de las memorias externas de almacenamiento masivo, así como de los algoritmos del protocolo de la capa física utilizados en este proyecto. En el primer capítulo se da una descripción de la arquitectura a bloques del nodo-P y el nodo-S, esto permite conocer de manera general los principales elementos que los conforman. Se aborda la interacción existente entre el nodo-P y el nodo-S, llevada a cabo siguiendo un protocolo de señalización entre ellos. Además, se da una explicación de cómo se establece el contenido de información de los datos de la trama que se desea transmitir o recibir por radio frecuencia y el almacenamiento de dichos datos a transmitir en el PIC de Protocolo. Por último, se indica el funcionamiento general del PIC de Protocolo (para el nodo-P y nodo-S) y el PIC de Enlace. En el funcionamiento del PIC de Enlace se ve involucrado el registro de banderas que está asociado a un registro de propósito general y que sus bits funcionan como banderas de control. El segundo capítulo hace referencia a todas las funciones del PIC de Protocolo para el nodo-S. Entre las funciones más importantes destaca la lectura del valor de temperatura, el resguardo de datos en las memorias externas de almacenamiento masivo, la generación de la estructura de la trama que será transmitida al PIC de Enlace, la transferencia de datos de la estructura de la trama al PIC de Enlace, la captura de los datos de la trama ACK proveniente del PIC de Enlace y la 1 generación de las correspondientes señalizaciones que permiten llevar a cabo el control del PIC de Enlace. Adicionalmente se proporciona con detalle el algoritmo implementado con sus diagramas de flujo, que incluye la descripción del programa principal, las rutinas auxiliares y la rutina de interrupción, que da servicio al proceso de transmisión y recepción de datos vía UART. En el tercer capítulo se explican todas las funciones del PIC de Protocolo para el nodo-P. Entre las funciones más importantes destaca la lectura de los datos proveniente del PIC de Enlace, que a su vez provienen de la captura de una trama válida recibida desde el nodo-S; verifica que dicha trama sea un paquete dirigido a éste nodo-P, estructura la trama ACK que será enviada al nodo-S (vía PIC de Enlace), transfiere los datos de la trama ACK al PIC de Enlace. Adicionalmente sensa el valor de temperatura presente en el nodo-P y envía a la Hyper Terminal, de una computadora personal tipo PC, tanto los datos recibidos de temperatura provenientes del nodo-S como el valor de la lectura de temperatura propia. También, envía a la Hyper Terminal el número total de muestras de temperatura y el identificador del nodo fuente, en este caso del nodo-S. Además, se proporciona con detalle el algoritmo implementado con sus diagramas de flujo, que incluye la descripción del programa principal, las rutinas auxiliares y la rutina de interrupción, que da servicio al proceso de transmisión y recepción de datos vía UART. El capítulo cuatro describe el funcionamiento del PIC de Enlace, para ambos nodo-P y nodo-S. Las funciones principales del PIC de Enlace son las de configurar al módulo de radio frecuencia CC1000 (en modo de recepción, transmisión o de bajo consumo) de acuerdo al modo de operación establecido por el correspondiente PIC de Protocolo. Para identificar esta condición de modo de operación, el PIC de Enlace monitorea un par de terminales de señalización provenientes del PIC de Protocolo. Captura una trama y la valida. Transfiere la trama válida al correspondiente PIC de Protocolo. También en este capítulo se proporciona con detalle el algoritmo implementado con sus diagramas de flujo, que incluye la descripción del programa principal, las rutinas auxiliares y la rutina de interrupción, que da servicio al proceso de recepción de datos vía UART o debido a una interrupción externa. El quinto capítulo hace referencia al módulo de radio frecuencia CC1000, en donde se proporciona con detalle los criterios para la configuración y la calibración del dispositivo, su funcionamiento y las características generales como voltaje de polarización, descripción de las terminales del circuito integrado, etc. Se detalla el conjunto de registros internos que deben ser configurados para el buen funcionamiento del dispositivo, la función en específico de cada uno de estos registros de configuración, así como la secuencia a seguir para la calibración y configuración de todos sus registros internos del CC1000. Además, se proporciona una descripción de la interfaz proporcionada por el fabricante para establecer los parámetros de configuración del dispositivo para la aplicación en particular. Adicionalmente se proporciona el algoritmo implementado, que incluye las subrutinas encargadas de activar y desactivar la recepción y transmisión del módulo, con sus respectivos diagramas de flujo. En el sexto capítulo se cita al sensor digital de temperatura DS1621. Se describen las principales características y especificaciones técnicas del dispositivo, que incluye el intervalo de temperatura que puede medir, la resolución en la medición, así como la distribución en sus terminales del integrado. Presenta el formato de la trama de la temperatura medida y una explicación del registro de control. Se proporciona con detalle el funcionamiento y la operación del sensor, así como los comandos a utilizar para la configuración del dispositivo de acuerdo a la aplicación en particular. 2 Muestra los diagramas de tiempos que deben tomarse en cuenta para realizar una transferencia de información entre el dispositivo DS1621 y un microcontrolador. Se muestra el diagrama de conexiones entre el microcontrolador y el sensor de temperatura DS1621. Explica las rutinas que deben ser invocadas y ejecutadas por un microcontrolador para llevar a cabo la configuración del sensor digital y la captura de un valor de temperatura, todo esto apoyándose con sus respectivos diagramas de flujo. El capítulo séptimo es dedicado a la memoria serial EEPROM AT24C02. Se describe las características propias de esta memoria serial como es el voltaje de operación, su capacidad de almacenamiento, velocidad de transmisión para recibir y proporcionar datos, de y hacia un microcontrolador, y la distribución en las terminales del integrado. Se describe el funcionamiento y la lógica a seguir en los procesos de lectura y escritura, particularizando en el direccionamiento de la memoria como dispositivo esclavo. Describe las rutinas que son invocadas y ejecutadas por el nodo-S para llevar a cabo los procesos de escritura y lectura de datos a la memoria serial, apoyándose con sus respectivos diagramas de flujo y diagrama físico de conexión con cuatro memorias seriales. En el octavo capítulo se proporciona una explicación del protocolo de comunicación serial UART, particularizando primero en los criterios de señalización del protocolo y la lógica que el algoritmo debe seguir para su implementación mediante software. Segundo, se establecen los criterios de configuración de los registros internos del microcontrolador para llevar a cabo esta comunicación serial asíncrona mediante hardware. Además, se explica el por que es requerido implementar la comunicación serial mediante hardware y software. En el noveno capítulo se hace referencia al protocolo de la capa física que permite la comunicación inalámbrica en la banda de RF entre los nodos de la aplicación (nodo-P y nodo-S). Se describe cómo este protocolo de la capa física se divide en dos subprotocolos, el protocolo KeeLoq y el protocolo PIUAMI. En la primera parte del capítulo se explica el criterio del protocolo PIUAMI, debido a que las particularidades de éste repercuten en la lógica de la construccion de la trama de datos requerida por el protocolo KeeLoq, de aquí que la última parte del capítulo se hace mención d el protocolo KeeLoq. También se incluyen los procedimientos y la lógica que el algoritmo debe seguir para la generación y detección de una trama. 3 CAPÍTULO 1. Descripción general de la red de Sensores Inalámbrica. La Red de Sensores Inalámbricos es una arquitectura compuesta por un conjunto de nodos (más de dos nodos) y por una computadora personal (PC) que está conectada a uno de los nodos pertenecientes a la red. A su vez cada nodo cuenta con un módulo transceptor (CC1000) de Radio Frecuencia, un sensor digital, una memoria externa (la que se implementa en este proyecto, y solo para nodos no conectados a una computadora personal PC), algunos LED (para indicar el estado del módulo) y dos microcontroladores, encargados de controlar los dispositivos conectados al nodo, el primer microcontrolador llamado PIC de Protocolo y el segundo el PIC de Enlace. En la Red de Sensores Inalámbrica se pueden diferenciar dos tipos de nodos: el nodo que tiene comunicación directa a la PC, por medio del puerto serial, al cual se le denomina Nodo Primario ó nodo-P, y los nodos que no cuentan con conexión directa a la PC, que se les denomina Nodo Secundario ó nodo-S. En la figura 1.1 se muestra la red básica, la cual contiene un nodo-P, un nodo-S y una PC. Figura 1.1 Red de sensores inalámbrica básica. Para que la red sea operable se requiere que al menos un nodo-S tenga comunicación con el nodo-P y se prevenga errores debido a interferencia de la señal. Este último problema se resuelve inicialmente al ocupar el canal de transmisión por periodos cortos y decodificando los datos recibidos. En esta etapa de desarrollo de la Red de Sensores Inalámbricos, corresponde la adecuación de 4 memorias externas en el nodo-S, considerando que ya se tiene el diseño de la capa física de comunicación por Radio Frecuencia (RF) entre el nodo-P y el nodo-S; así como la comunicación serial entre el nodo-P y la PC, como se muestra en la figura 1.1. En las siguientes secciones se da una descripción general de los dispositivos que conforman cada nodo, la forma en la que éstos se configuran para su funcionamiento y la interacción entre ellos. Además se da una explicación de cómo se establece el contenido de información de la trama de datos que se desea transmitir por RF y el almacenamiento de dichos datos en el PIC de 4 Protocolo. Por último se detalla el funcionamiento del PIC de Protocolo y el PIC de Enlace (para el nodo-P y el nodo-S). 1.1 Arquitectura a bloques del nodo-P y nodo-S La descripción de la arquitectura a bloques del nodo-P y el nodo-S permiten reconocer la forma general de los principales elementos de construcción de éstos. Arquitectura del nodo-P: Bloque de control: Compuesto por 2 microcontroladores PIC16F877A, uno llamado PIC de Enlace y el otro PIC de Protocolo. Bloque de comunicación por RF: Compuesto por el módulo CC1000 que puede funcionar como transmisor, operando en bajo consumo o como receptor. Bloque de sensores: Compuesto por el sensor digital de temperatura DS1621. Bloque de indicadores: Compuesto por una barra de LED que permiten indicar el estado del módulo CC1000 y 2 LED que indican el modo en que el PIC de Protocolo desea poner al módulo CC1000. Bloque de comunicación serie: Acopla las señales del puerto serie RS-232 de la PC con las señales TTL del microcontrolador PIC, para realizar transferencias de datos. En la figura 1.2 se observan los bloques que conforman al nodo-P. Figura 1.2 Diagrama a bloques del nodo-P. 5 Arquitectura del nodo-S: Bloque de control: Compuesto por 2 microcontroladores PIC16F877A, uno llamado PIC de Enlace y el otro PIC de Protocolo. Bloque de comunicación por RF: Compuesto por el módulo CC1000 que puede funcionar como transmisor, operando en bajo consumo o como receptor. Bloque de sensores: Compuesto por el sensor de temperatura digital DS1621. Bloque de almacenamiento de datos: Compuesto por la memoria externa EEPROM 24C02 para almacenar los datos de temperatura obtenidos del sensor. Bloque de indicadores: Compuesto por una barra de LED que permiten indicar el estado del módulo CC1000, 2 LED que indican el modo en que el PIC de Protocolo desea poner al módulo CC1000, otros 2 LED, uno que indica el tiempo de espera de la trama ACK y otro que indica cuando se ha recibido una trama valida. En la figura 1.3 se observan los bloques que conforman al nodo-S. Figura 1.3 Diagrama a bloques del nodo-S. 1.2 Criterios de señalización entre nodos La interacción entre el nodo-P y el nodo-S se lleva a cabo siguiendo un protocolo de señalización entre ellos. El nodo-S es el primero en transmitir información hacia el nodo-P, esto implica que cada uno de los nodos inicializa su configuración de funcionamiento de manera diferente al ser energizado. El nodo-S configura inicialmente su módulo de Radio Frecuencia CC1000 como transmisor, mientras que el nodo-P configura su módulo CC1000 como receptor. Además, el nodoS genera, con un cierto criterio, el conjunto de datos (longitud de bytes, destinatario, remitente y datos de temperatura sensados) que conforma la trama en la transmisión, por su parte el nodo-P detecta la trama recibida y valida para asegurar por un lado la confiabilidad de los datos y por otro si éstos son dirigidos hacia él (validando la palabra de identificación, ID). Una vez que el nodo-P valida la trama, configura su módulo CC1000 en modo de transmisión para enviar al nodo-S un mensaje de confirmación (trama de ACK) de que el paquete de datos fue recibido correctamente; mientras que el nodo-S configura su módulo CC1000 como receptor para esperar la trama de acuse recibido, antes de enviar un nuevo paquete de datos. 6 El nodo-P al recibir una trama válida, la transfiere a la PC, al conectarse con el puerto serial RS232 de la PC, configurando la comunicación serial para tal fin. La computadora recibe los datos que consisten en una cadena de caracteres y son visualizados por el usuario en la ventana de la HyperTerminal. Como se indicó con anterioridad, cada nodo (nodo-P y nodo-S) está compuesto en su etapa de control por dos microcontroladores PIC16F877A, de tal manera que las funciones realizadas por el nodo se reparten entre éstos (PIC de Enlace y PIC de Protocolo). El PIC de Enlace es el encargado de la etapa de radio frecuencia y el PIC de Protocolo coordina todas las demás funciones. El PIC de Protocolo es propiamente el cerebro del nodo, debido a que éste se encarga del sensado de la temperatura, almacenamiento de éstos en la memoria externa (sólo para el nodo-S), decide en qué modo debe trabajar el módulo CC1000 (operando en bajo consumo, transmisión o recepción), configura la información que debe transmitirse (longitud de bytes y su contenido) y envía al PIC de Enlace el número de bytes y el contenido a ser transmitido (destinatario, remitente y los datos de temperatura sensados); además se encarga de las señales de control de las acciones que debe llevar a cabo el PIC de Enlace. En el caso particular del PIC de Protocolo del nodo-P, éste se comunica con la computadora en forma serial basándose en el protocolo RS232. El PIC de Enlace es el esclavo de esta relación simbiótica, debido a que su función es controlar el módulo de Radio Frecuencia CC1000, de acuerdo a las instrucciones proporcionadas por el PIC de Protocolo, este control se basa en configurar el modo de trabajo del CC100 (operando en bajo consumo, transmisión o recepción), generar la señal física de la trama, basado en el protocolo de la capa física KeeLoq, y estructurado de acuerdo a la longitud de bytes y su contenido. Cuando el PIC de Enlace está operando en modo de recepción, valida que la señal física recibida corresponda al formato establecido por el protocolo de la capa física KeeLoq. 1.3 El PIC de Protocolo El PIC de Protocolo, como ya se mencionó es el cerebro del nodo, y para entender su principal funcionamiento se da una explicación de cómo se establece el contenido de información de los datos que conforman la trama, que se desea transmitir por RF, y el almacenamiento de éstos, para ello se incluye el mapeo de la memoria de datos del PIC16F877A. Recuerde que tanto el nodo-S como el nodo-P cuentan con un PIC de Protocolo. Además, se describe en ésta sección los criterios de funcionalidad particulares del PIC de Protocolo para el nodo-P y el nodo-S. 1.3.1 Longitud, contenido y mapa de datos de información Como se ha mencionado, en esta aplicación solo se tiene un nodo-P y un nodo-S, de manera que algunos criterios establecidos en este reporte cambiaran parcialmente a medida que se constituya la red de sensores inalámbrica. Esto es, en una red de sensores inalámbrica el nodo-S en ocasiones ejercerá algunas de las funciones que en este proyecto solo tiene asignado el nodo-P (recibir trama de datos y responder con un ACK). 7 Para cada uno de los nodos (nodo-P o nodo-S) el PIC de Protocolo conforma los datos, que se desean transmitir por RF, de manera diferente. Por ejemplo el nodo-S transmite paquetes de datos de información que incluyen los valores del sensado de temperatura, mientras que el nodo-P únicamente transmite paquetes ACK. En cualquiera de los casos el PIC de Protocolo resguarda el paquete de datos recibido. En el PIC de Protocolo del nodo-S los datos de información o paquete de datos a transmitir por RF se clasifican en dos tipos diferentes, los llamados básicos y los complementarios. El paquete de datos básicos contiene la siguiente información: Destinatario, número de bytes de datos y remitente, en donde Destinatario Número de bytes de datos Remitente Es el identificador (ID) del nodo a quien va dirigido el paquete (o trama) de datos. Es el número de bytes de datos de información que se envían. Es el identificador (ID) del nodo que envía el paquete de datos. El paquete de datos complementarios son todas las lecturas de temperatura y que fueron almacenadas en la memoria externa, usando un formato binario. El número total de bytes que conforma el paquete de datos complementarios toma una longitud distinta y varía en el intervalo de 1 a 89 bytes, el criterio de su longitud se obtiene de una subrutina encargada de establecer éste número basándose en un algoritmo pseudo aleatorio. Sin importar su longitud estos bytes se agregan a los datos del paquete básico. Por ejemplo, si el número pseudo aleatorio es diez, se envía el paquete básico y diez bytes más, es decir, un total de trece bytes. En modo de transmisión el PIC de Protocolo genera los datos de la trama, que serán enviados al PIC de Enlace, para ello el PIC de Protocolo genera un buffer de datos, llamado buffer de transmisión o BUFFERT, cuyo contenido se almacena en sus localidades de memoria SRAM. En modo de recepción el PIC de Protocolo almacena los datos, recibidos del PIC de Enlace, en un buffer llamado buffer de recepción o BUFFERR, en localidades de memoria de la SRAM y diferentes a las localidades parar el buffer de transmisión. El tamaño máximo de los buffer es de 96 bytes, esta longitud se restringe por la capacidad física de memoria del PIC en sus bancos 2 y 3. El buffer de transmisión se almacena en el banco 2, localidades asignadas de 110h a 16Fh, y el buffer de recepción en el banco3, localidades asignadas de 190h a 1EFh, como se muestra en la figura 1.4. Es importante aclarar, que la estructura de las tramas generadas por los PIC de Protocolo (uno para el nodo-P y otro para el nodo-S) son diferentes. En el PIC de Protocolo del nodo-S el paquete de datos complementario generado, como se mencionó, lo conforman las lecturas de temperatura; mientras que para el PIC de Protocolo del nodo-P sólo está compuesto por el paquete básico llamado paquete ACK. En ambos PIC de Protocolo el paquete básico se constituye de la misma forma, sin olvidar que la trama en general se estructura con el básico y el complementario. Además, la trama generada (paquete básico y complementario) almacenado en el buffer de transmisión (con datos de lectura de temperatura o paquete ACK) al ser transmitida, será capturada por el otro nodo y esta se almacenará en el buffer de recepción, de manera que la trama generada y transmitida por el 8 nodo-S (con datos de lectura de temperatura) se almacenará en el buffer de recepción del PIC de Protocolo del nodo-P; de igual forma la trama generada y transmitida por el nodo-P (con el paquete ACK) se almacena en el buffer de recepción del PIC de Protocolo del nodo-S. A continuación se da una descripción de la ubicación y distribución de los datos en la memoria SRAM de los PIC de Protocolo, que incluye el paquete básico y el complementario (con contenido de las lecturas de temperatura o con el paquete ACK). Figura 1.4 Ubicación de los buffers BUFFERT Y BUFFERR en el mapa de la memoria SRAM del PIC16F877A. Se establece que el primer dato del buffer de transmisión, BUFFERT[0], es la localidad de memoria 110h. Por simplicidad al contenido de este buffer se le asigna las variables D0, D1, D2, etc y para uno de ellos en particular la variable NUMDAT, como se muestra en la figura 1.5. Figura 1.5 Distribución de los datos en el buffer de transmisión y recepción. 9 En este proyecto, el contenido de BUFFERT[0], D0, corresponde al valor del ID del nodo destinatario que está conformado por el número de red a la que pertenece el nodo (bits <7:5>) y el número de nodo (bits <4:0>). El ID del nodo-P es 20h (red “1”, número de nodo “0”) y el ID del nodo-S es 21h (red “1”, número de nodo “1”) tal como se observa en la figura 1.6. Figura 1.6 Valores de ID asignados al nodo-P y nodo-S. Por otra parte, el contenido del segundo byte del buffer de transmisión, BUFFERT[1], es NUMDAT que corresponde al número de bytes de datos que se transmite por RF. El valor NUMDAT no contabiliza ni a D0 ni a sí mismo, es decir, solo contabiliza los bytes que se encuentran después de él (desde D1 a D94 como máximo). Es importante aclarar que el valor de D0 debe ser diferente a los valores definidos por los bytes de preámbulo (los valores de los bytes de preámbulo en este proyecto son: 55h y AAh; ver Capítulo 5). Los bytes que se encuentran a partir de BUFFERT[2] hasta BUFFERT[95] son los datos D1, D2, ...,D94. En este proyecto D1 es el ID del nodo remitente, mientras que D2 en adelante son las muestras de temperatura y corresponden al paquete de datos complementario, ver figura 1.7. Figura 1.7 Buffer de Transmisión nodo-S. Por otra parte el paquete de datos denominado ACK, el cual sirve para confirmar la llegada de un paquete de datos al nodo-P (acuse de recibo), está conformado por los siguientes datos: DESTINATARIO, REMITENTE y el número de datos a transmitir (se basa en los criterios previamente establecidos en el que los dos primeros no son contabilizados). La posición que guardan es la misma que en el del paquete básico, el destinatario es el ID del nodo recibido y el remitente es el ID del nodo que transmite el paquete. En la figura 1.8 se muestra su distribución. 10 Figura 1.8 Buffer de Transmisión nodo-P. Por otra parte, el buffer de recepción del nodo-P se almacena en el banco 3 de la SRAM del PIC16F877A (localidades 190h a 1EFh) como se muestra en la figura 1.5. La estructura del buffer de recepción es igual a la que se explicó para el buffer de transmisión. BUFFERR[0], D0, corresponde al valor del ID del nodo destinatario, BUFFERR[1], corresponde a NUMDAT. Recuerde que NUMDAT no contabiliza ni a D0 ni a sí mismo. Los bytes a partir de BUFFERR[2] hasta BUFFERR[95] le corresponden a los datos D1, D2, ...,D94, con D1 el ID del nodo remitente, y D2 en adelante es el arreglo de muestras de temperatura, como se muestra en la figura 1.9. Figura 1.9 Buffer de Recepción nodo-P. Para el caso del buffer de recepción del nodo-S, en éste sólo se almacena el paquete ACK. De ésta forma, su estructura queda como se muestra en la figura 1.10, donde ya se ha establecido la función de cada uno de los tres bytes que lo conforman. Figura 1.10 Buffer de Recepción en nodo-S. El buffer de transmisión, en el programa diseñado, es BUFFERT, mientras que el buffer de recepción es BUFFERR. 11 1.3.2 Funcionamiento del PIC de Protocolo, Nodo-P El PIC de Protocolo del nodo-P realiza las siguientes actividades: 1. Configuración del microcontrolador Configura los puertos de entrada/salida digital/analógica. Configura módulo MSSP en modo I2C para comunicarse con el sensor DS1621. Configura la UART y avisa al PIC de Enlace que ya se puede iniciar su proceso de configuración. Configura el DS1621 en modo de conversión continua. Configura TIMER. 2. Le indica al PIC de Enlace que configure el módulo CC1000 como receptor, espera la confirmación y posteriormente se mantiene en espera de una trama válida. 3. Una vez que se ha recibido una trama válida proveniente del PIC de Enlace, además de indicarle al PIC de Enlace que configure al módulo CC1000 en operando en bajo consumo, comienza a recibir por la UART los datos provenientes del PIC de Enlace y los va almacenando en su buffer de recepción. 4. Una vez almacenados todos los datos recibidos verifica si el ID del DESTINATARIO corresponde a su ID, en tal caso va al paso 5 de lo contrario regresa al paso 2. 5. Extrae la información básica de la trama: Destinatario. Número de datos (Bytes). Remitente. 6. Configura la trama ACK y la almacena en el buffer de transmisión. Destinatario: ID del nodo Remitente. NUMDAT: 1 dato (ID Remitente). Remitente: ID del nodo Transmisor. 7. Envía la trama ACK por la UART hacia el PIC de Enlace y le indica que configure al módulo CC1000 como transmisor, espera confirmación. La trama ACK se envía cuatro veces. 8. Lee la temperatura del sensor DS1621, dentro de la tarjeta del nodo-P. 9. Envía a la PC los datos del paquete básico recibidos y los valores de temperatura de cada nodo (los procesa para que se presenten en forma de carácter ASCII en la HyperTerminal): 12 Número de Red (bit 7-5 del ID del nodo). Número de nodo (bit 4-0 del ID del nodo). Arreglo de muestras de temperatura provenientes del nodo-S. Valor de la temperatura del nodo-P. 10. Regresa al paso 2. 1.3.3 Funcionamiento del PIC de Protocolo, Nodo-S El PIC de Protocolo del nodo-S realiza las siguientes actividades: 1. Configuración del microcontrolador Configura los puertos de entrada/salida digital/analógica. Configura el módulo MSSP en modo I2C para comunicarse con el sensor DS1621 y la memoria externa 24C02. Configura TIMER. Configura la UART y avisa al PIC de Enlace que ya se puede iniciar su proceso de configuración. Configura el DS1621 en modo de conversión continua. 2. Le indica al PIC de Enlace que configure el módulo CC1000 en operando en bajo consumo, espera la confirmación, después verifica si el buffer de transmisión del PIC de Enlace esta vacío. Mientras no se cumpla alguna de las condiciones anteriores, el PIC de Protocolo se mantiene esperando. 3. Se establece el número de muestras que serán tomadas del sensor, usando una subrutina pseudo aleatoria. 4. Toma cada muestra de temperatura del sensor DS1621 a un intervalo de 1 segundo y las guarda en la memoria EEPROM (memoria externa). 5. Almacena en el buffer de transmisión los datos básicos: D0:”Destinatario” (ID del nodo receptor). NUMDAT: 2. Corresponden a los siguientes dos bytes. D1:”Remitente”, ID del nodo transmisor. 6. Continúa almacenando en el buffer de transmisión los datos extras (paquete complementario), el número de datos depende del valor establecido en el paso 3 y estos datos son extraídos de la memoria EEPROM. 7. Envía los datos por UART hacia el PIC de Enlace. 13 8. Le indica al PIC de Enlace que configure al módulo CC1000 como transmisor para que se puedan enviar los datos, y espera confirmación. Posteriormente espera hasta que el PIC de Enlace le indica que ha terminado de transmitir todos los datos. 9. Comienza la espera del acuse de recibido (ACK), con el siguiente procedimiento: Le indica al PIC de Enlace que configure al módulo CC1000 como receptor. Espera a que el PIC de Enlace le indique que ha recibido una trama válida. Si se cumple dicha condición, le indica al PIC de Enlace que configure al módulo CC1000 operando en bajo consumo y comienza a recibir los datos por la UART. Una vez recibidos, se comprueba el ID del Destinatario. Si el ID es correcto, ahora se verifica que el nodo remitente pertenezca a la misma red que el nodo destinatario. Si es valido el destinatario y pertenece a la misma red, implica que se recibió correctamente el ACK y salta al paso 11. Pero, mientras no se reciba correctamente estas condiciones (ID y Red), se iniciará nuevamente el paso 9. Sin embargo, si la espera, en este paso 9, a transcurrido más de 5.89 segundos, terminando el máximo tiempo de espera, salta al paso 10. 10. Una vez que concluye el tiempo de espera, verifica si recibió el ACK. Si no se recibió el acuse, regresa al paso 2, ya que se envía una nueva trama. No se reenvía la misma trama debido a que los apuntadores de transmisión y recepción son inicializados. 11. Se prende una bandera que indica que se recibió una trama válida y va al paso 2. 1.4 El PIC de Enlace El PIC de Enlace en esta Red Inalámbrica de Sensores representa la capa física de la red, su labor es cumplir las órdenes recibidas por el PIC de Protocolo y administrar las herramientas de comunicación con el exterior. Todos los nodos de la red cuentan con un PIC de Enlace (al igual que con un PIC de Protocolo), este PIC de Enlace es muy similar para ambos nodos, ya que éste sólo es una herramienta que configura los recursos de comunicación vía RF, las pequeñas diferencias entre el PIC de Enlace ubicado en el nodo primario y el del nodo secundario, son referentes a la interacción con sus respectivos PIC de Protocolo, la programación será detallada en el Capítulo 4. El PIC de Enlace cuenta con 2 buffers para el almacenamiento de tramas, uno para la trama que será transmitida vía RF, y otro para la trama que es recibida por la misma vía, el tamaño y composición de estos son iguales a los contenidos en el PIC de Protocolo, con la diferencia de que los buffers en el PIC de Enlace sólo son usados para almacenamiento y no para su procesamiento, ya que al PIC de Enlace no le interesa el contenido en ellos. 14 Como se ha mencionado, la principal tarea del PIC de Enlace es la de gestar todo lo referente a la comunicación con el resto de la red. En donde se incluye el control del modo de operación del módulo CC1000 (operando en bajo consumo, PD, en transmisión, TX, en recepción, RX; ver Capítulo 5). Cuando el módulo CC1000 se encuentra configurado como transmisor, TX, o como receptor, RX, el PIC de Enlace centra toda su atención en la señalización con el módulo CC1000, dejando a un lado por el momento la interacción con el PIC de Protocolo. En el modo de TX del módulo CC1000 el PIC de Enlace utiliza los datos almacenados en su buffer de transmisión para generar la señalización de la trama (la transmisión en RF), de acuerdo a los datos que recibió del PIC de Protocolo, y siguiendo el estándar establecido por el protocolo KeeLoq (se ha supuesto que ya se tiene montado sobre éste el protocolo P1UAMI), ver capítulo 9. Al finalizar la etapa de transmisión de la trama, el PIC de Enlace le avisa al PIC de Protocolo que se ha completado el proceso. Por otra parte, en el modo de RX del módulo CC1000 el PIC de Enlace monitorea continuamente los cambios de señalización de la señal de RF, que se entiende como la captura de la trama, y una vez validada una trama la almacena en el buffer de recepción, indicándole al PIC de Protocolo que se ha cumplido dicha acción. Finalmente en modo operando en bajo consumo, el PIC de Enlace puede ocuparse de la interacción con el PIC de Protocolo o simplemente entrar en un estado de ocio. El intercambio de datos que se da con el PIC de Protocolo se lleva a cabo utilizando una comunicación serial (UART) y dependiendo del contexto estaría mandando datos (en estado de transmisión) o recibiendo datos (en estado de recepción) hacia o desde el PIC de Protocolo. Es importante enfatizar que los datos que envía el PIC de Enlace al PIC de Protocolo, vía UART, son almacenados en el buffer de recepción del PIC de Protocolo. Mientras que los datos que recibe el PIC de Enlace suministrados por el PIC de Protocolo, provienen de datos previamente guardados en el buffer de transmisión del PIC de Protocolo. 1.4.1 Funcionamiento del PIC de Enlace El PIC de Enlace juega un papel muy importante en el proceso de control del nodo, ya que es el único enlace existente entre el PIC de Protocolo y el módulo de Radio Frecuencia CC1000; con el PIC de Protocolo el encargado de la toma de decisiones de los procesos que realiza el nodo, mientras que el módulo CC1000 es el dispositivo con el cual lleva a cabo la comunicación con el exterior. La comunicación del PIC de Enlace con estos dispositivos (PIC de Protocolo y CC1000) es de forma serial, la interacción con el PIC de Protocolo se lleva a cabo con la ayuda de su dispositivo interno UART y con el módulo de Radio Frecuencia el PIC de Enlace se ayuda del dispositivo interno de comunicación SPI. En el PIC de Enlace se utilizan dos clases de eventos de interrupción, una externa (para atender a la interrupción proporcionada por el reloj del módulo CC1000) y otra interna (para atender la interrupción proporcionada por la bandera del buffer de recepción en la comunicación con el PIC de Protocolo, comunicación serial RS232C). 15 El evento de interrupción externa generado por el reloj del módulo de Radio Frecuencia CC1000 se produce cada 26μs (cuando se encuentre configurado como transmisor o como receptor; en modo de operación en bajo consumo no se genera ésta señal), y sólo se atiende a la primera interrupción generada en cada etapa de transmisión o recepción del módulo CC1000, ya que ésta es usada como indicador de inicio para los procesos de transmisión y recepción, ver Capítulo 9. La otra clase de interrupción, la interna, es generada por la UART y sólo se halla habilitada cuando el módulo CC1000 se encuentra operando en bajo consumo, ésto es para prevenir una colisión entre interrupción externa y la interna; la interrupción interna se produce cuando el PIC de Protocolo necesita que se envíe una trama por RF, en este caso la interrupción por recepción de la UART debe encontrarse configurada y activada para poder recibir y almacenar posteriormente los datos provistos. Debido a que el PIC de Enlace no sabe cuándo será requerida está herramienta se opta por mantenerla siempre activa y se deja como responsable de evitar las colisiones al PIC de Protocolo. Por otra parte, los dos PIC de cada nodo trabajan con cristales de diferentes frecuencias (el PIC de Protocolo a 4Mhz y el PIC de Enlace a 16Mhz), lo cual requiere una sincronización adicional entre ellos para evitar un mal funcionamiento del dispositivo interno UART, tomando en cuenta que éste es el único medio de comunicación de datos entre los PIC del nodo. La sincronización consiste en configurar primero la UART del PIC de Protocolo y una vez que ésta se encuentre funcionando se procede a configurar al dispositivo del PIC de Enlace, con lo cual se evita la recepción errónea de datos, ya que el dispositivo UART del PIC de Enlace desde un inicio es configurado y habilitado como receptor. El PIC de Enlace se encuentra en un ciclo infinito, en el cual verifica continuamente el modo en que debe estar configurado al módulo de Radio Frecuencia CC1000, ésto lo hace mediante 2 banderas, las cuales son controladas por el PIC de Protocolo de acuerdo a sus requerimientos, ver figura 1.11. Figura 1.11 Modo de Operación de CC1000. Debido a que continuamente se verifica el modo de operación al que debe ser configurado el módulo CC1000, existe la posibilidad de que el módulo CC1000 se esté re-configurando de la misma forma consecutivamente, por lo que se revisa el modo de operación del módulo CC1000 después de conocer el modo de operación que requiere el PIC de Protocolo, ya que si estos coinciden no será necesaria una nueva configuración, de este modo no se interrumpe el funcionamiento del módulo CC1000, ya que una interrupción perjudicaría la sincronía en la comunicación y se reflejaría en pérdida de datos. 16 Ahora, se plantea la lógica a seguir para cambiar o no, el funcionamiento del Transceiver CC1000: Verificación del modo de operación en que se encuentra el PIC de Enlace: PD, TX o RX. Si dicho modo coincide con lo requerido por el PIC de Protocolo, no se realiza ninguna configuración. Si se encuentra en el modo TX, y las banderas indican que debe cambiar a un modo PD, el cambio se realiza inmediatamente. Si las banderas indican que debe cambiar a un modo RX, primero se desactiva el modo TX y posteriormente se activa el modo RX, ver Capítulo 5. Si se encuentra en el modo RX, y las banderas indican que debe cambiar a un modo PD, el cambio se realiza inmediatamente. Si las banderas señalan un cambio a un modo TX, entonces primero se desactiva el modo RX y posteriormente se activa el modo TX, ver Capítulo 5. Si se encuentra en el modo PD y las banderas indican un cambio a un modo TX o RX, la activación del modo de operación deseado es inmediata. 1.4.2 Registro de Banderas El registro de banderas es un registro de propósito general, ya que sus bits funcionan como banderas de control. El registro de banderas fue implementado con la finalidad de hacer más sencillo el monitoreo de las variables que definen el estado y funcionamiento del PIC de Enlace. Básicamente la información que se puede encontrar en el registro de banderas es el estado (vacío o lleno) de los buffers y el modo de operación del Transceiver (transmisión, recepción o de bajo consumo). Si el bit que representa cada bandera de estado de los buffers tiene un valor de “1”, entonces el estado está activo, por ejemplo, si el bit del Buffer Rx vacio esta en 1 (activo) entonces el buffer de recepción se encuentra vacío y si el bit del Buffer Rx lleno se encuentra en 1 (activo), el buffer de recepción se encuentra lleno. En la figura 1.12 se muestra el registro de banderas y las variables de control asociadas. Figura 1.12 Registro de banderas. En el caso de las banderas que indican el modo de operación sólo puede estar activa una a la vez; el PIC de Enlace utiliza dichas banderas para informarse del modo de operación del módulo CC1000 y con éste dato poder decidir en que configuración establecer al módulo de Radio Frecuencia. 17 Se hace uso del registro de banderas para el control del evento de interrupción externa, ya que el PIC de Enlace antes de iniciar una transmisión en Radio Frecuencia, primero verifica la bandera de buffer de transmisión vacío, ya que si ésta se encuentra en “1” no existe dato alguno para enviar y por lo tanto es innecesario seguir con el servicio de interrupción externa. Como se puede ver, el uso del registro de banderas simplifica mucho la toma de decisiones en los procedimientos que realiza el PIC de Enlace, ya que es preferible verificar el valor de un solo bit que la verificación de registros completos (normalmente se requiere de más operaciones). 18 CAPÍTULO 2. Descripción técnica del PIC de Protocolo, nodo-S. Como se indicó en el capítulo anterior, el PIC de Protocolo es el cerebro del nodo y en particular para el nodo-S sus principales funciones son: leer los valores de temperatura sensada por el dispositivo DS1621, almacenar en una memoria externa estos valores leídos, generar una trama que contenga tanto el paquete básico (Destinatario, Número de datos y Remitente) como el paquete complementario (los valores de la temperatura), transferir los datos de la trama al PIC de Enlace, recibir la trama del ACK de éste último y generar las correspondientes señalizaciones para el control del PIC de Enlace (indicar el modo de trabajo del módulo CC1000, etc). Estas tareas son realizadas por un algoritmo que consta de un programa principal y un conjunto de subrutinas. 2.1 Descripción de funcionamiento El PIC de Protocolo en su etapa de configuración, una vez que se le ha aplicado la fuente de alimentación lleva a cabo los siguientes procesos: primero configura los puertos (ver tabla 2.1), después el módulo MSSP en modo I2C para la comunicación con el sensor DS1621 y la memoria externa (ver tabla 2.2), el TIMER asociado al preescalador para un valor de 256 para generar un tiempo de 5.89s, que es el tiempo máximo de espera para recibir la trama del ACK, luego configura la UART (vea el capítulo 8) habilitando la interrupción por transmisión por UART para la comunicación entre el PIC de Protocolo y el PIC de Enlace, configuración del DS1621 (vea el capítulo 6) en modo de conversión continua y al finalizar esta etapa de configuración le avisa al PIC de Enlace que ha terminado este proceso. Esto último obliga al PIC de Enlace a esperar esta señalización para continuar con sus actividades. Esta situación es motivada por el hecho de que el PIC de Enlace trabaja con un cristal de 16MHz y el PIC de Protocolo con uno de 4 MHz; por lo que el funcionamiento del PIC de Enlace es cuatro veces más rápido que el PIC de Protocolo; además, considerando que el PIC de Protocolo es el cerebro del nodo, este debe ser configurado primero. Ahora se inicializa, en el registro XpS, el valor de la semilla (constante establecida por la variable “Sem”) que será utilizada para generar el número pseudoaleatorio y se establece el ID del nodo-P (nodo destinatario). A continuación manda al PIC de Enlace las banderas de señalización indicadoras de que configure al CC1000 en modo de bajo consumo y espera la confirmación de que se ha llevado a cabo este proceso. Esto se verifica al monitorear la bandera (BANDERA_PD), que también se encuentra conectada a la barra de LED indicadora de que el módulo CC1000 se encuentra en modo de bajo consumo. Posteriormente se verifica que el buffer de transmisión del PIC de Enlace se encuentre vacio, monitoreando la bandera de buffer vacio (BufferTx_Vacio) vea la figura 1.13. Una vez que se cumplen las condiciones anteriores, se inicializan dos registros, „condicion‟ y „contadorr‟, el primero se inicializa a 0 y cambia a 1 cuando termina de enviar los datos de la trama del PIC de Protocolo al PIC de Enlace, el otro registro se inicializa a 1 y se incrementa en 1 cada que recibe un dato por la UART y se vuelve a inicializar cuando reciba 3 datos que corresponden al paquete ACK, la inicialización la realiza la subrutina “ini_reg” (vea la sección 2.2). Después se establece el valor del ID que se obtiene de la tabla “T_IDNODO” y que contiene únicamente el valor del ID del nodo-S (21h), y se almacena en la variable NODOID. 19 Enseguida se genera un número pseudoaleatorio de 8 bits, cuya semilla es el valor contenido en el registro XpS, para ello se utiliza la subrutina “PSeudo” (vea la sección 2.3), este número generado, llamado N, es usado para obtener el número de muestras del sensor de temperatura que serán transmitidos, correspondientes al paquete complementario. Valor del Puerto y Entrada o Salida registro TRIS Pin TRISA = 34h RA<1:0> Salida RA2 Entrada RA3 Salida RA4 RA5 Entrada Entrada TRISB = 00h TRISC = 98h RB<7:0> Salida RC<4:3> Entrada TRISD = 0Fh RC6 RC7 RD1 Salida Entrada Entrada RD2 Entrada RD4 Salida RD5 Salida Función Bits de señalización, le indican al PIC de Enlace en que modo debe configurar al módulo CC1000. Bandera que indica el fin de transmisión de datos por el módulo CC1000. Bandera que indica si el PIC de Enlace ya puede continuar con sus actividades. Bandera que indica si recibió una trama válida. Bandera que indica si el PIC de Enlace terminó de enviar datos por UART. Muestra los datos recibidos por la UART. Inicia la comunicación I2C con el sensor DS1621 y la memoria externa. Inicia la comunicación UART, bit de transmisión. Inicia la comunicación UART, bit de recepción. Bit de señalización, indica si el módulo CC1000 del PIC de Enlace esta en modo de bajo consumo. Bit de señalización, indica si el Buffer de transmisión del PIC de Enlace esta vacio. Bit de señalización, indica al usuario el tiempo de espera del paquete ACK. Bit de señalización, indica al usuario cuando se recibió un paquete ACK válido. Tabla 2.1 Configuración de puertos. Registros de control, estado y dirección SSPCON SSPCON2 SSPSTAT SSPADD Valor asignado 28h 00h 80h 09h Tabla 2.2 Registros de configuración del módulo MSSP para operar en modo I2C. Se capturan las N muestras de temperatura y cada muestra capturada se almacena en la memoria EEPROM, con la ayuda de la subrutina “LeeTmp” (vea la sección 2.4). Posteriormente se inicializa los apuntadores de escritura y lectura del buffer de transmisión y recepción, y se almacena en el buffer de transmisión los datos básicos (DESTINATARIO, NUMDAT y REMITENTE), utilizando la subrutina “Dat_basicos” (vea la sección 2.5). Enseguida se termina el llenado del buffer de transmisión con los datos complementarios, para ello se usa la subrutina “Dat_extra” (vea la sección 2.7), recordemos que el número de datos que se extraen de la memoria EEPROM depende del valor 20 arrojado por la subrutina “PSeudo”. Ahora se habilitan las interrupciones por periféricos y general para el envío de los datos almacenados en el buffer de transmisión del PIC de Protocolo hacia el PIC de Enlace, ayudándose de la subrutina de interrupción “SERVICIO_INTERRUPCION” (vea la sección 2.9 que indica como se inicia este proceso de interrupción). Cuando termina de enviar todos los datos, deshabilita la interrupción por transmisión de UART y habilita la interrupción por recepción, para esperar el paquete ACK. Antes de habilitar la interrupción por recepción, se le indica al PIC de Enlace que configure al módulo CC1000 en modo de transmisión, para que el PIC de Enlace envíe los datos hacia el nodoP; mientras tanto, el PIC de Protocolo se mantiene a la espera de que el PIC de Enlace le avise cuando ha terminado de enviar estos datos, para pasar a lo siguiente. Al recibir esta indicación, se inicia la espera del paquete ACK, que consiste del paquete de datos básico, llevándose acabo con la ayuda de la subrutina “Recibir_ack” (vea la sección 2.8). Para lo cual se indica al PIC de Enlace de que el módulo CC1000 se debe configurar en modo receptor. El tiempo máximo de espera del paquete ACK es de aproximadamente 5.89s y para que el usuario identifique este tiempo de espera, se enciende el LED asociado a la señalización ESPERANDO_ACK y hasta que expire este tiempo o se reciba una trama válida, se apaga éste LED y sale de la subrutina “Recibir_ack”. Para llevar la cuenta del tiempo de espera se hace uso del TIMER y del registro TIME_ACK. Es importante notar que el PIC de Protocolo necesita que el PIC de Enlace le avise cuándo ha recibido una trama válida, ésta validación de trama la lleva acabo el PIC de Enlace usando la subrutina RECIBIR (vea el capítulo 9). Cuando el PIC de Enlace levanta la bandera de trama válida, pone al módulo CC1000 en modo de bajo consumo, y comienza a enviar por UART, hacia el PIC de Protocolo, los datos recibidos, quien a su vez éste último se encarga de almacenarlos en su buffer de recepción con la ayuda de la subrutina de interrupción “SERVICIO_INTERRUPCION”, que previamente, como se mencionó, se habilitó la interrupción de recepción. Para dar inicio a la verificación de los datos recibidos, el PIC de Protocolo espera una señal (por parte del PIC de Enlace) indicadora que ya se ha terminado la transferencia de todos los datos. Los valores que se verifican son: Destinatario: Comprobar si el paquete ACK esta dirigido hacia el nodo que envió la trama de datos. Remitente. Es necesario comprobar si en realidad el paquete proviene del nodo al que se le envío la información. Si uno de los dos valores anteriores no concuerda con el esperado, se desecha la trama recibida y empieza de nuevo el proceso de espera del paquete ACK. En caso de que los datos sean correctos, termina el proceso de espera, se apaga el LED de señalización ESPERANDO_ACK y se enciende el LED de señalización ACK_VALIDO para indicarle al usuario que la trama recibida es correcta, finalizando la subrutina “Recibir_ack”. Se deshabilitan la interrupción por recepción de UART y se habilita la interrupción por transmisión de UART. Sin embargo, para evitar una interrupción no deseada al habilitar la interrupción por transmisión, primero debe deshabilitarse la interrupción general. Una vez habilitada la interrupción por transmisión ya se puede habilitar la interrupción general. Todo este proceso vuelve a iniciarse después del punto donde se establece el ID del nodo-P (nodo destinatario). 21 En las figuras 2.1, 2.2 y 2.3 se muestran los diagramas de flujo de esta descripción. Figura 2.1 Diagrama de flujo programa principal, parte 1/3. 22 Figura 2.2 Diagrama de flujo programa principal, parte 2/3. 23 Figura 2.3 Diagrama de flujo programa principal, parte 3/3. 24 2.2 Descripción técnica de la subrutina ini_reg ini_reg Inicializa registros de control para el programa. Entrada: Ninguna. Salida: CONDICION Mientras su valor es cero se asume que los datos dentro del buffer de transmisión aún no se envían. Se inicializa a uno para auxiliar en la recepción del paquete ACK. CONTADORR Subrutinas empleadas Ninguna. Variables utilizadas Internas Ninguna. Externas CONDICION CONTADORR Se utiliza para verificar si ya se han enviado todos los datos almacenados en el buffer de transmisión. Sirve para saber cuándo se han recibido los 3 datos que componen el paquete ACK. En la figura 2.4 se muestra el diagrama de flujo de la subrutina ini_reg. Figura 2.4 Diagrama de flujo de la subrutina ini_reg. 2.3 Descripción técnica de la subrutina Pseudo Pseudo Se encarga de generar un número pseudoaleatorio, en módulo 89, a partir de una semilla ingresada. Se utiliza para establecer el número de datos que se van a tomar del sensor de temperatura. Entrada: XpS Salida: XpS Contiene la semilla a partir de la cual se genera un número pseudoaleatorio. Una vez que el algoritmo determina el nuevo valor pseudoaleatorio lo almacena en XpS que será la nueva semilla cuando se entra una vez más a esta subrutina. El valor de XpS se utiliza para generar el número de datos complementarios que se almacenan en el buffer de transmisión y determinar el número de datos a extraer o almacenar en la memoria EEPROM. 25 Subrutinas empleadas Ninguna. Variables utilizadas Externas XpS En este registro se almacena el valor de la semilla generado por el algoritmo pseudoaleatorio. Internas Aux Almacena una copia del registro XpS como auxiliar en la obtención del nuevo número pseudoaleatorio. Constantes utilizadas TRI Valor D'89' correspondiente al valor del módulo para generar el número pseudoaleatorio. En la figura 2.5 se muestra el diagrama de flujo de la subrutina PSeudo. Figura 2.5 Diagrama de flujo de la subrutina PSeudo. 26 2.4 Descripción técnica de la subrutina LeeTmp LeeTmp Entrada: Ninguna. Salida: TEMPE Se encarga de tomar la lectura de la temperatura sensada por el sensor DS1621, y la almacena en la memoria EEPROM. Almacena el valor de la temperatura leída. Subrutinas empleadas Retardo_1s. Subrutina que genera un retardo de 1 seg, que permite al dispositivo DS1621 termine su proceso de conversión de temperatura. DS1621_LeeTemperatura. Subrutina que se encarga de leer la temperatura del sensor DS1621 siguiendo el protocolo I2C. writememory. Subrutina que se encarga de almacenar en la memoria EEPROM uno de los datos tomados del sensor, uno a la vez. Variables utilizadas Internas DS1621_Temperatura. Externas drmemory. TEMPE. Oper2. Contiene la parte entera de la temperatura obtenida por la subrutina DS1621_LeeTemperatura. Apuntador de dirección de memoria, en donde hay que escribir la temperatura tomada por el sensor. Almacena el valor de la temperatura medida. El contenido de este registro se almacena en la memoria EEPROM. Establece el número de datos, que hay que guardar en la memoria EEPROM En la figura 2.6 se presenta el diagrama de flujo correspondiente a la subrutina LeeTmp. 27 Figura 2.6 Diagrama de flujo subrutina LeeTmp. 2.5 Descripción técnica de la subrutina Dat_basicos Dat_basicos. Llena el buffer de transmisión con los datos básicos (Destinatario, Número de Datos y Remitente). Entrada: DESTID NODOID Salida: Ninguna. Identificador del nodo a quien va dirigido el paquete de datos (DESTINATARIO). Identificador del nodo (REMITENTE). Subrutinas empleadas AJUSTAR_AP: Se encarga de inicializar los apuntadores de lectura y escritura para el buffer de transmisión y de recepción. 28 Variables utilizadas Internas Ninguna. Externas AP_BUFWTX NODOID DESTID Apuntador de escritura que almacena la dirección de la siguiente localidad disponible del buffer de transmisión. Contiene el ID del nodo. Contiene el ID del nodo destinatario. En la figura 2.7 se muestra el diagrama de flujo de la subrutina Dat_basicos. Figura 2.7 Diagrama de flujo de la subrutina Dat_basicos y AJUSTAR_AP. 2.6 Descripción técnica de la subrutina AJUSTAR_AP AJUSTAR_AP Inicializa los apuntadores de direccionamiento en lectura y escritura, para el buffer de recepción y de transmisión. Entrada: Ninguna. Salida: AP_BUFRTX AP_BUFWTX AP_BUFRRX Apuntador que se incrementa al leer un dato del buffer de transmisión. Se inicializa con el valor de la dirección de la localidad H'10' del banco 2. Apuntador que se incrementa al escribir un dato en el buffer de transmisión. Se inicializa con el valor de la dirección de la localidad H'10' del banco 2. Apuntador que se incrementa al leer un dato del buffer de recepción. 29 AP_BUFWRX Variables utilizadas Interna. Ninguna. Externas AP_BUFRTX AP_BUFWTX AP_BUFRRX AP_BUFWRX Se inicializa con el valor de la dirección de la localidad H‟90‟ del banco 3. Apuntador que se incrementa al escribir un dato en el buffer de recepción. Se inicializa con el valor de la dirección de la localidad H'90' del banco 3. Apuntador de lectura del buffer de transmisión. Apuntador de escritura del buffer de transmisión. Apuntador de lectura del buffer de recepción. Apuntador de escritura del buffer de recepción. En la figura 2.7 se muestra el diagrama de flujo de la subrutina AJUSTAR_AP. 2.7 Descripción técnica de la subrutina Dat_extra Dat_extra Entrada: EDO_OP Salida: AP_BUFWTX Agrega los datos de la memoria EEPROM al buffer de transmisión, que corresponden a los datos complementarios. Número de datos que se leerán de la memoria EEPROM y que se agregan al buffer de transmisión. Apuntador de escritura que direcciona a la siguiente localidad vacía del buffer de transmisión. Subrutinas empleadas readmemory. Subrutina que se encarga de extraer de la memoria EEPROM cada uno de los datos tomados del sensor. Retardo_5ms. Subrutina que genera un retardo de 5ms, tiempo necesario para escribir en el buffer de transmisión. Variables utilizadas Internas datomemory Valor extraído de la memoria EEPROM. Externas AP_BUFWTX Apuntador de escritura. Almacena la dirección de la siguiente localidad disponible dentro del buffer de transmisión. EDO_OP Contiene una copia del número generado en la subrutina Pseudo, XpS. CONTADOR Es usado como contador para obtener el total de datos que se extraen de la memoria EEPROM. 30 En la figura 2.8 se muestra el diagrama de flujo de la subrutina Dat_extra. Figura 2.8 Diagrama de flujo de la subrutina Dat_extra. 2.8 Descripción técnica de la subrutina Recibir_ack Recibir_ack Espera la llegada de la trama de ACK y enciende el LED de señalización ESPERANDO_ACK para indicarle al usuario de esta espera, si se detecta la trama de ACK correspondiente prende el LED de señalización ACK_VALIDO por un segundo, apaga el LED de señalización ESPERANDO_ACK y sale de la subrutina. Si no se detecta la trama de ACK en un lapso de 5.89s apaga el LED de señalización ESPERANDO_ACK y sale de la subrutina sin prender el LED de señalización ACK_VALIDO. Entrada: Ninguna. 31 Salida: Ninguna. Subrutinas empleadas SERVICIO_INTERRUPCION. Atiende el origen de las interrupciones, ambas asociadas a la UART, una para la transmisión y la otra a la recepción. Variables utilizadas Internas TIME_ACK Externas NODOID AP_BUFRRX Registro que almacena el número de veces que se necesita desbordar el TIMER para alcanzar el tiempo de espera del paquete ACK. Contiene el identificador del nodo secundario. Apuntador para leer del buffer de recepción el ID, para verificar que el paquete ACK recibido sea para este nodo. Banderas ESPERANDO_ACK Es un bit del registro BANDERAS_P que controla al LED de señalización que se enciende durante el tiempo de espera del paquete ACK. ACK_VALIDO Es un bit del registro BANDERAS_P que controla al LED de señalización que se enciende cuando se ha recibido un paquete ACK válido. En las figuras 2.9 y 2.10 se muestran los diagramas de flujo de la subrutina Recibir_ack. 32 Figura 2.9 Diagrama de flujo de la subrutina Recibir_ack, parte 1/2. 33 Figura 2.10 Diagrama de flujo de la subrutina Recibir_ack, parte 2/2. 34 2.9 Descripción técnica subrutina SERVICIO_INTERRUPCION La rutina de interrupción, SERVICIO_INTERRUPCION, se encarga, en esta aplicación, de dar servicio al proceso de transmisión y recepción de datos vía UART. De manera que la interrupción se ejecuta cuando la bandera TXIF (PIR1<4>) de transmisión se activa o cuando la bandera RCIF (PIR1<5>) de recepción se activa. Siempre y cuando se encuentren habilitados los permisos de interrupción general, GIE (INTCON<7>), de periféricos PEIE (INTCON<6>) y los correspondientes TXIE (PIE1<4>) y RCIE (PIE1<5>), respectivamente. Las banderas TXIF y RCIF no pueden ser modificadas por software y solo se activan por un suceso provocado por el software. En la figura 2.11 se muestran estas banderas. Figura 2.11 Registro PIR1 y sus banderas que permiten generar interrupciones. Donde: bit 5 : RCIF (USART Receive Interrupt Flag bit). Bandera de estado de la recepción serial. RCIF = 1. Buffer de recepción lleno. RCIF = 0. Buffer de recepción vacío bit 4 : TXIF (USART Transmit Interrupt Flag bit). Bandera de estado de la transmisión serial. TXIF = 1. Buffer de transmisión vacío TXIF = 0. Buffer de transmisión lleno. La bandera TXIF se activa por cualquiera de los siguientes eventos: 1. Cuando el registro TXREG está vacío. 2. Cuando se habilita el bit de activación de la transmisión, TXEN (TXSTA<5>). Nota: El bit TXEN se coloco a uno cuando se configuró la UART. La bandera TXIF pasa a cero cuando un nuevo dato se carga en el registro TXREG. Cada vez que se desea transmitir datos del PIC de Protocolo vía UART hacia el PIC de Enlace es suficiente con activar los bits GIE y PEIE, debido a que el bit TXEN se encuentra activo, y por consiguiente la bandera TXIF Como se mencionó, para pasar de un proceso de recepción a uno de transmisión debe deshabilitarse los bits GIE y PEIE antes de realizar éste cambio, y una vez realizado se habilitan nuevamente los bits GIE y PEIE. Para la recepción vía UART los bits GIE (INTCON<7>) y PEIE (INTCON<6>) siguen activos pero ahora se activa el bit RCIE (PIE1<5>) y se desactiva el bit TXIE (PIE1<4>). Por lo tanto el bit RCIF (PIR1<5>) se pondrá a uno cada que el registro RCREG este lleno y es limpiado por hardware cuando el registro RCREG ha sido leído. 35 SERVICIO_INTERRUPCION Entrada: AP_BUFRTX AP_BUFWTX AP_BUFWRX Esta corresponde a la subrutina de interrupción. En modo transmisor UART envía los datos almacenados en el buffer de transmisión. En modo receptor UART recibe los datos correspondientes al paquete ACK y los almacena en el buffer de recepción. Apuntador de la dirección de la primera localidad de memoria del buffer de transmisión. Sirve para verificar cuando se vació el buffer de transmisión. Se incrementa en uno cada vez que se almacena un dato correspondiente al paquete ACK. Salida: AP_BUFRTX AP_BUFWRX CONDICION Una vez leído todos los datos del buffer de transmisión se ubica en la misma dirección que el apuntador de escritura (AP_BUFWTX). Cada que se terminan de recibir los 3 datos del paquete ACK y se verifican, se inicializa a H'90' para almacenar un nuevo paquete ACK. Si vale “1” indica que se mandaron todos los datos almacenados en el buffer de transmisión. Este registro sólo usa el bit 0. Subrutinas empleadas Retardo_2ms Genera un retardo de 2ms, antes de enviar el siguiente dato hacia el PIC de Enlace. Variables utilizadas Internas CONTADORR Cuenta los datos recibidos correspondientes al paquete ACK. Se inicializa en “1”. Externas AP_BUFWTX Se usa para verificar cuando el buffer de transmisión está vacío, esta condición se cumple cuando el apuntador de lectura (AP_BUFRTX) y el apuntador de escritura del buffer de transmisión (AP_BUFWTX) se encuentran en la misma posición de la localidad de memoria. AP_BUFRTX Se incrementa en uno cada que se lee un nuevo dato del buffer de transmisión. AP_BUFWRX Se incrementa en uno cada que se recibe un dato correspondiente al paquete ACK. CONDICION Bandera que indica cuando se han terminado de enviar los datos almacenados en el buffer de transmisión. En las figuras 2.12 y 2.13 se muestran los SERVICIO_INTERRUPCION. 36 diagramas de flujo de la subrutina Figura 2.12 Diagrama de flujo subrutina SERVICIO_INTERRUPCION, parte 1/2. 37 Figura 2.13 Diagrama de flujo subrutina SERVICIO_INTERRUPCION, parte 2/2. 38 CAPÍTULO 3. Descripción técnica del PIC de Protocolo, nodo-P. El PIC de Protocolo, nodo-P, es el cerebro del nodo, y juega prácticamente el mismo papel que tiene el PIC de Protocolo en el nodo-S, con pequeñas diferencias. La principal función del PIC de Protocolo, nodo-P, es procesar los datos que recibe de los nodos-S, vía su PIC de Enlace, y los transfiere a la Hyper Terminal de una computadora personal tipo PC, para su visualización y futuro almacenamiento. El PIC de Protocolo, nodo-P, inicia con el análisis de la trama recibida, verificando si la dirección de destino corresponde a la de su dirección. Si la dirección no corresponde desecha la trama y espera una nueva. Si esta dirección coincide manda al PIC de Enlace la trama de acuse que debe ser enviada al nodo-S. Es importante comentar que en este proyecto sólo se cuenta con un nodo-S (vea el capítulo 1), por lo que la trama de acuse siempre se envía al mismo nodo. Posteriormente obtiene la temperatura del sensor DS1621, ubicado en esta tarjeta del nodo-P. Por último envía a la Hyper Terminal de la PC los datos de temperatura recibidos del nodo-S y el valor de temperatura propia. 3.1 Descripción de funcionamiento El PIC de Protocolo en su etapa de configuración, una vez que se le ha aplicado la fuente de alimentación lleva a cabo los siguientes procesos: primero configura los puertos (ver tabla 3.1), después el módulo MSSP en modo I2C para la comunicación con el sensor DS1621 (ver tabla 3.2), luego configura la UART (vea la sección 8.3) habilitando la interrupción por recepción por UART para la comunicación entre el PIC de Protocolo y el PIC de Enlace; después se inicia la configuración de la comunicación RS232 con la PC (vea la sección 8.2) y la configuración del DS1621 (vea el capítulo 6) en modo de conversión continua. Además, inicializa los apuntadores de escritura y lectura del buffer de recepción (POINTER_RXW, POINTER_RXR), y se inicializan dos registros, „CONTADOR2‟ y „TAM_POINTER‟, el primero siempre se inicializa a 1 y se incrementa en 1 cada que recibe un dato por la UART, y sirve para saber si ya se recibió el segundo dato (NUMDAT) de la trama; el segundo registro se inicializa a 0 y en este se almacena el conteo del total de los datos de la trama recibidos del PIC de Enlace, y provenientes del nodo-S, y al finalizar esta etapa le avisa al PIC de Enlace que ha terminado este proceso. Esto último obliga al PIC de Enlace a esperar esta señalización para continuar con sus actividades. Esta situación es motivada por el hecho de que el PIC de Enlace trabaja con un cristal de 16MHz y el PIC de Protocolo con uno de 4 MHz; por lo que el funcionamiento del PIC de Enlace es cuatro veces más rápido que el PIC de Protocolo; además, considerando que el PIC de Protocolo es el cerebro del nodo, este último debe ser configurado primero. Terminadas las configuraciones el PIC de Protocolo se mantiene en espera de la señal del PIC de Enlace que le indique que se ha configurado el módulo CC1000 correctamente y una vez recibida esta confirmación, entonces le ordena al PIC de Enlace a configurar el módulo CC1000 en modo receptor y nuevamente espera una confirmación proveniente del PIC de Enlace para poder continuar. Para verificar el momento de la confirmación se monitorea la bandera de recepción (pin 1 del PORTD), que también se encuentra conectada a la barra de LED indicadora de que el módulo CC1000 se encuentra en modo de recepción. Ahora, el PIC de Protocolo se mantiene en espera de una trama válida, es decir, espera a que el PIC de Enlace capture una trama válida y levante la 39 bandera de trama válida, esta bandera es observada por el PIC de Protocolo en el pin 5 del PORTA. Cuando esta bandera de trama válida se levanta, el PIC de Protocolo le indica al PIC de Enlace que configure al CC1000 en modo de bajo consumo. Una vez realizada ésta última acción se procede a habilitar las banderas de la interrupción por periféricos y general, con el fin de prepararse para recibir los datos que han sido recibidos y que provienen del PIC de Enlace; en este proceso se verifica continuamente una bandera indicadora de que la captura de los datos a finalizado, es decir, permanece en un bucle mientras permite que se generen las interrupciones por recepción de datos por la UART, este proceso se mantiene hasta que se activa la bandera. El registro utilizado como bandera es el registro de trabajo W y cuando tiene el valor de 255 en decimal (0xFF en hexadecimal) entonces indicará que se ha recibido y almacenado todos los datos en el buffer de recepción (BUFFERR) del PIC de Protocolo. Recuerde que una interrupción, por recepción de datos por la UART, se genera cada vez que el buffer de recepción (RCREG) se llena, en este caso por los datos enviados vía UART por el PIC de Enlace. La rutina de interrupción, llamada UART (vea la sección 3.7), se encarga de almacenar uno a uno los datos en el arreglo de registros buffer de recepción llamado BUFFERR. El total de datos a salvar se obtiene del valor del tamaño de datos de la trama y que le corresponde al segundo byte recibido (NUMDAT), para ello se ayuda de una serie de apuntadores. La rutina de interrupción también se encarga de detectar la terminación de la recepción de los datos a resguardar, ésto al activar la bandera correspondiente, registro de trabajo con valor de 255 en decimal. Valor del Puerto y Entrada o Salida registro TRIS Pin TRISA = 24h RA<1:0> Salida TRISB = 00h TRISC = 98h TRISD = EFh RA2 Entrada RA3 Salida RA5 RB<7:0> RC<4:3> RC6 RC7 RD1 Entrada Salida Entrada Salida Entrada Entrada RD4 RD5 Salida Entrada Función Bits de señalización, le indican al PIC de Enlace en que modo debe configurar al módulo CC1000. Bandera que indica si el PIC de Enlace terminó de configurar al módulo CC1000 en alguno de sus tres modos (transmisión, recepción o bajo consumo). Bandera que indica si el PIC de Enlace ya puede continuar con sus actividades. Bandera que indica si recibió una trama válida. Muestra los datos recibidos por la UART. Inicia la comunicación I2C con el sensor DS1621. Inicia la comunicación UART, bit de transmisión. Inicia la comunicación UART, bit de recepción. Bit de señalización, indica si el módulo CC1000 del PIC de Enlace esta en modo de recepción. Inicia la comunicación UART, bit de transmisión. Bit de señalización, indica si el módulo CC1000 del PIC de Enlace esta en modo de transmisión. Tabla 3.1 Configuración de puertos. 40 Registros de control, estado y dirección SSPCON SSPCON2 SSPSTAT SSPADD Valor asignado 28h 00h 80h 09h Tabla 3.2 Registros de configuración del módulo MSSP para operar en modo I2C. Una vez que se levanta la bandera de fin de recepción de datos, sale del bucle de espera y deshabilita las interrupciones, al desactivar los permisos de interrupción general y periféricos. Verifica que los datos recibidos en el buffer BUFFERR sea una trama dirigida a este nodo-P. Para ello se compara la dirección transmitida por el nodo-S con la dirección del nodo, éste último almacenado en la variable NODOID, cuyo valor se obtiene de la tabla T_IDNODO, que contiene el ID del nodo-P (en este proyecto con el valor 20h). El valor de la dirección transmitida por el nodo-S le corresponde al primer dato almacenado en el registro BUFFERR. Si las direcciones no coinciden se desecha la trama recibida y se vuelve a inicializar „CONTADOR2‟ y se inicializan los apuntadores de escritura y de lectura del buffer de recepción, con la finalidad de prepararlos para la siguiente nueva captura de trama. Además, inicializa el apuntador que establece el tamaño de la trama, „TAM_POINTER‟, y habilita la interrupción por recepción de la UART, para permitir la captura de los datos provenientes de su PIC de Enlace; regresando al punto en donde se especifica que se debe configurar al módulo CC1000 como receptor. Por el contrario, en el caso de que las direcciones coincidan se establecen registros que almacenen: el total de datos recibidos (CONTADOR), la dirección del remitente enviado por el nodo-S (NODOR). Posteriormente se genera el paquete ACK que se enviará al nodo-S. La información que conforma este paquete de acuse de recibido se almacena en el buffer de transmisión (BUFFERT), esto con la ayuda de la subrutina “Envia_ack” (vea la sección 3.2). La trama del paquete ACK se envía cuatro veces al nodo-S, y el control de este número de veces se lleva a cabo con un contador, llamado NUM_AK. Para que este paquete ACK llegue al nodo-S, primero el PIC de Protocolo lo transfiere al PIC de Enlace y este a su vez lo envía al nodo-S. Antes de comenzar la transferencia de datos entre el PIC de Protocolo y el PIC de Enlace se inicializan los apuntadores de lectura y escritura del buffer de transmisión, POINTER_TXR y POINTER_TXW. Enseguida se procede a habilitar las banderas de la interrupción por periféricos y general, se activa la interrupción por transmisión de la UART, y empieza a enviar los datos vía UART hacia el PIC de Enlace con la ayuda de la rutina de interrupción, llamada UART (vea la sección 3.7), cuando termina de enviar todos los datos le indica al PIC de Enlace que configure al CC1000 en modo transmisor, ya que cada acuse es enviado vía RF al nodo-S; espera 100ms aproximadamente antes de enviar el siguiente acuse. Una vez enviado los cuatro acuses el PIC de Protocolo le indica al PIC de Enlace que configure al CC1000 en modo de bajo consumo, para después brindar un informe de la trama procesada, el informe es dirigido al usuario y puede observarse mediante la Hyper Terminal de la PC (vea la figura 3.1). Antes de enviar la información a la PC se lleva acabo la lectura de la temperatura del nodo-P, con la ayuda de la subrutina “LeeTmp” (vea la sección 3.3), y el valor obtenido se 41 almacena en TEMPP. Posteriormente se envía el informe vía puerto serial a la PC, para el informe se extrae de la trama recibida el ID del nodo-S, y las muestras de temperatura del nodo-S, con la ayuda de la subrutina “Muestra_info” (vea la sección 3.4). Figura 3.1 Visualización de los datos de la trama recibida. Después de brindar el informe al usuario, inicializa „CONTADOR2‟ y los apuntadores de escritura y lectura del buffer de recepción (POINTER_RXW, POINTER_RXR), el registro TAM_POINTER y se habilita la interrupción por recepción de la UART. Todo este proceso vuelve a iniciarse después del punto donde se establece al módulo CC1000 como receptor. En las figuras 3.2, 3.3, 3.4 y 3.5 se muestran los diagramas de flujo de esta descripción. 42 Figura 3.2 Diagrama de flujo del programa principal del nodo-P, parte 1/4. 43 Figura 3.3 Diagrama de flujo del programa principal del nodo-P, parte 2/4. 44 Figura 3.4 Diagrama de flujo del programa principal del nodo-P, parte 3/4. 45 Figura 3.5 Diagrama de flujo del programa principal del nodo-P, parte 4/4. 46 3.2 Descripción técnica de la subrutina Envia_ack Envia_ack Almacena el paquete ACK (ver capítulo 1) en el buffer de transmisión (BUFFERT) del PIC de Protocolo del nodo-P. Entrada: NODOR, NODOID. Salida: Ninguna. Subrutinas empleadas Ninguna. Variables utilizadas Internas Ninguna. Externas NODOID NODOR Almacena el ID del nodo destinatario (20h), nodo-P. Almacena el ID del nodo remitente (21h), nodo-S. En la figura 3.6 se muestra el diagrama de flujo de la subrutina Envia_ack. Figura 3.6 Diagrama de flujo de la subrutina Envia_ack. 47 3.3 Descripción técnica de la subrutina LeeTmp LeeTmp Se encarga de tomar la lectura de la temperatura sensada por el sensor DS1621. Entrada: Ninguna. Salida: TEMPP, almacena el valor de la temperatura sensada en el nodo-P. Subrutinas empleadas DS1621_LeeTemperatura Retardo_1s Subrutina que se encarga de leer la temperatura del sensor DS1621 siguiendo el protocolo I2C, vea la sección 6.2.2. Subrutina que genera un retardo de 1s, que permite al dispositivo DS1621 termine su proceso de inicialización antes de llevar a cabo la lectura de la temperatura. Variables utilizadas Internas DS1621_Temperatura Externas TEMPP Contiene la parte entera de la temperatura obtenida por la subrutina DS1621_LeeTemperatura. Almacena el valor de la temperatura medida. En la figura 3.7 se muestra el diagrama de flujo de la subrutina LeeTmp. Figura 3.7 Diagrama de flujo de la subrutina LeeTmp. 48 3.4 Descripción técnica de la subrutina Muestra_info Muestra_info Envía a la PC los datos que recibió el PIC de Protocolo por parte del PIC de Enlace, los datos se transmiten en código ASCII para que se visualicen en la HyperTerminal de la PC. Entrada: CONTADOR. NODOR. BUFFERR [3…95] TEMPP. Contiene el número de datos complementarios que integran la trama que recibió del PIC de Enlace. ID del nodo (REMITENTE). Almacena las muestras de temperatura del nodo-S. Almacena la temperatura del nodo-P. Salida: Ninguna. Subrutinas empleadas Bin8_BCD. envia. Tx_mns Convierte un número binario de 8 bits (1 byte) en su representación en BCD (3 bytes), vea la sección 3.5. Rutina encargada de enviar los datos hacia la PC en modo serial, ver capítulo 8. Transmite a la PC una cadena de caracteres ASCII de la tabla MENSAJE, vea la sección 3.6. Variables utilizadas Internas AUX1 BIN BCD0 BCD1 Almacena temporalmente una copia del registro NODOR. Registro que almacena el valor binario a convertir y contiene las unidades del resultado de la conversión. Contiene las decenas del resultado de la conversión. Contiene las centenas del resultado de la conversión. Externas CONTADOR NODOR BUFFERR [3…95] TEMPP Variable usada para saber cuántos bytes extraer del buffer de recepción y después enviarlos a la PC. Se descompone en número de red y de nodo para desplegar individualmente en la PC dicha información. Almacena las muestras de temperatura sensada en el nodo-S por el sensor DS1621. Almacena la temperatura sensada en el nodo-P por el sensor DS1621. En las figuras 3.8, 3.9, 3.10 y 3.11 se muestran los diagramas de flujo de la subrutina Muestra_info. 49 Figura 3.8 Diagrama de flujo de la subrutina Muestra_info, parte 1/4. 50 Figura 3.9 Diagrama de flujo de la subrutina Muestra_info, parte 2/4 51 Figura 3.10 Diagrama de flujo de la subrutina Muestra_info, parte 3/4. 52 Figura 3.11 Diagrama de flujo de la subrutina Muestra_info, parte 4/4. 53 3.5 Conversión de Binario a BCD La subrutina de conversión de binario a BCD es utilizada cuando se necesita enviar un número binario a la PC, ya que para visualizarlo en la ventana de la HyperTerminal es necesaria una codificación ASCII. Para llevar a cabo el proceso de codificación en ASCII se debe partir de la representación en BCD del número binario. La subrutina Bin8_BCD permite realizar la conversión de un número binario de 8 bits a su equivalente valor binario de 24 bits en BCD. Para ejemplificar el algoritmo suponga que el número binario de 8 bits que se desea convertir a BCD se encuentra almacenado en un registro llamado BIN y el resultado de la conversión se almacena en los registros BIN, BCD0 y BCD1 (número binario de 24 bits en BCD). De manera que los bits del registro BIN, corresponden al dígito de las unidades, los bits de BCD0 a las decenas y finalmente los bits de BCD1 a las centenas. La transformación de binario a BCD se realiza por medio de restas sucesivas al valor binario. Primero restas de 10 unidades para encontrar el número de decenas y luego restas de 10 unidades para el número de centenas, el residuo es el número de unidades. 3.5.1 Descripción técnica de la subrutina Bin8_BCD Bin8_BCD Esta subrutina convierte un número binario de 8 bits (1 byte) a su representación en BCD (3 bytes). Las unidades quedan en el registro BIN, las decenas en el registro BCD0 y las centenas se almacenan en el registro BCD1. Entrada: BIN Registro que almacena el valor binario a convertir. El contenido de este registro es modificado por esta subrutina. Salida: BIN Registro que almacena las unidades del resultado de la conversión. BCD0 Registro que almacena las decenas del resultado de la conversión. BCD1 Registro que almacena las centenas del resultado de la conversión. Subrutinas empleadas Ninguna. Variables utilizadas BIN Registro que contiene el valor en binario de 8 bits que se desea convertir a BCD, es la entrada de la subrutina Bin8_BCD y su valor es procesado durante la ejecución de esta subrutina y almacena el dígito de las unidades. BCD0 Registro que almacena el dígito de las decenas del resultado de la conversión binario a BCD en la subrutina Bin8_BCD. BCD1 Registro que almacena el dígito de las centenas del resultado de la conversión binario a BCD en la subrutina Bin8_BCD. 54 En la figura 3.12 se presenta el diagrama de flujo correspondiente a la subrutina Bin8_BCD. Figura 3.12 Diagrama de flujo subrutina Bin8_BCD. 3.6 Descripción técnica de la subrutina Tx_mns Tx_mns Subrutina que manda a la PC una cadena de caracteres ASCII de la tabla MENSAJE (vea la tabla 3.1), el inicio de la cadena debe ser establecido antes de invocar a esta subrutina, se utiliza el registro W para tal fin, para identificar el fin del mensaje se utiliza el byte con el valor 00h. Entrada: W Inicio de la cadena que está contenida en la tabla MENSAJE. Salida: Ninguna. 55 Subrutinas empleadas envia: Subrutina encargada de enviar los datos en modo serial hacia la computadora. MENSAJE: Tabla donde se encuentran mensajes predefinidos por el usuario para organizar la información mostrada en la PC. Variables utilizadas OFFSET Registro donde se guarda el número del elemento de la tabla que se desea obtener. Es utilizado por la subrutina Tx_mns para obtener el elemento de la tabla MENSAJE que se va a transmitir a la PC. Etiqueta MENSAJE mns_Red mns_IdNod mns_muestras mns_Tempe mns_Tempe2 Contenido 0Ah, 0Ah, 0Dh, "Red: ", 00h 0Ah, 0Dh, "ID Nodo: ", 00h 0Ah, 0Dh, "Numero total de muestras: ", 00h 0Ah, 0Dh, "Temperatura en nodo secundario: ", 00h 0Ah, 0Dh, "Temperatura en nodo primario: ", 00h Tabla 3.1 Tabla de mensajes predefinidos por el usuario. En la figura 3.13 se presenta el diagrama de flujo correspondiente a la subrutina Tx_mns. Figura 3.13 Diagrama de flujo subrutina Tx_mns. 56 3.7 Descripción de la subrutina de interrupción llamada UART La subrutina de interrupción llamada UART, se encarga de atender a las interrupciones referentes al dispositivo interno UART, las cuales son causadas por la recepción o transmisión de un byte, debido a estas dos posibilidades, lo primero que realiza la subrutina es verificar cual fue la causa de la interrupción, esto permite direccionar el flujo de la ejecución del programa de la subrutina a la sección correspondiente, ya sea para atender la recepción ó atender la transmisión. Si la causa de la interrupción es la recepción de un byte proveniente del PIC de Enlace, se procede a deshabilitar las interrupciones por periféricos y general, también se verifica si el dato que se está recibiendo es el segundo (como se explica en el capítulo 1, las tramas contienen en su segundo byte el tamaño de la trama), en cuyo caso se almacena este dato en la localidad de memoria direccionada por el apuntador POINTER_RXW (apuntador de escritura) del BUFFERR, después se extrae una copia del contenido del byte, a la cual se le suma un 92 que es el inicio del BUFFERR mas la localidad del ID y NUMDAT, y se almacena en el apuntador TAM_POINTER, de manera que éste último apunta a la última localidad de memoria donde se almacenará la trama que se recibe. Cada vez que se entra a la subrutina UART en la sección de recepción se verifica si el valor de TAM_POINTER es igual a POINTER_RXW, de ser iguales significa que ya se cuenta con una trama completa en el BUFFERR y se enciende la bandera temporal W después de que se ha almacenado el último byte de la trama. En la recepción del resto de los datos sólo se almacena el byte en el BUFFERR. Antes de terminar la subrutina UART se incrementa en uno a POINTER_RXW, el cual apunta a la localidad de memoria inmediata donde se almacenará el siguiente byte una vez que ocurra otra interrupción, además habilita las interrupciones por periféricos y general (en el PIC de Protocolo del nodo-P sólo existen interrupciones debido a periféricos) finalizando la subrutina. Para el caso de transmisión, se extrae el byte que se encuentra en la localidad de memoria que apunta POINTER_TXR, apuntador de lectura del BUFFERT, y el dato se almacena en el registro TXREG, ya que éste último será el byte a enviar vía UART, posteriormente se incrementa a POINTER_TXR actualizando su valor para la siguiente atención a este tipo de interrupción; antes de finalizar la subrutina se verifica si ya se ha enviado la totalidad de la trama, restando POINTER_TXR a POINTER_TXW, este último apunta al final de la trama a enviar localizada en el BUFFERT, si la operación da como resultado “0” quiere decir que el dato previamente enviado ha sido el último de la trama, por lo que se deshabilitan las interrupciones por periféricos, general y por transmisión de la UART y finaliza la subrutina, para cualquier otro resultado de la resta sólo se procede a finalizar la subrutina. 3.7.1 Descripción técnica de la subrutina UART UART Se encarga de atender las interrupciones por transmisión y recepción del módulo UART. En modo transmisor, el módulo UART, envía el paquete ACK almacenado en el buffer de transmisión y en modo receptor almacena el paquete de datos proveniente del nodo-S en el buffer de recepción. 57 Entrada: CONTADOR2 Auxiliar en la extracción del segundo byte de datos (NUMDAT) de la trama recibida por el módulo UART. Su valor inicial es “1”. POINTER_RXW Apuntador que se incrementa en uno cada vez que se almacena un dato en el buffer de recepción. Se inicializa en la localidad H'90' del banco 3. POINTER_TXR Apuntador que se incrementa al leer un dato del buffer de transmisión. Se inicializa en la localidad H'10' del banco 2. POINTER_TXW Apuntador que se incrementa al escribir un dato en el buffer de transmisión. Se inicializa en la localidad H'10' del banco 2. Salida: W Indicador del estado de la recepción de datos vía UART, “255” señala que se recibieron todos los datos y cualquier otro valor, que aún faltan datos por recibir. Subrutinas empleadas Retardo_2ms. Genera un retardo de 2ms, antes de poder enviar el siguiente byte. Variables utilizadas Internas TAM_POINTER Externas CONTADOR2 POINTER_RXW POINTER_TXR POINTER_TXW Usada para verifica cuando se llena el buffer de recepción, esta condición se cumple cuando el apuntador de escritura (POINTER_RXW) y TAM_POINTER se encuentran apuntando a la misma localidad. Se usa para detectar cuando se recibe, por el módulo UART, el segundo byte de la trama de datos enviada desde el PIC de Enlace. Apuntador de escritura del buffer de recepción. Apuntador de lectura del buffer de transmisión Apuntador de escritura del buffer de transmisión. En las figuras 3.14, 3.15, 3.16, 3.17 y 3.18 se muestran los diagramas de flujo de la subrutina UART. 58 Figura 3.14 Diagrama de flujo de la subrutina UART, parte 1/5. Figura 3.15 Diagrama de flujo de la subrutina UART, parte 2/5. 59 Figura 3.16 Diagrama de flujo de la subrutina UART, parte 3/5. Figura 3.17 Diagrama de flujo de la subrutina UART, parte 4/5. 60 Figura 3.18 Diagrama de flujo de la subrutina UART, parte 5/5. 61 CAPÍTULO 4. Descripción técnica del PIC de Enlace. Como se mencionó en el capítulo 1, las funciones principales del PIC de Enlace para cualquiera de los nodos son: monitorear las condiciones de modo de operación del módulo de RF que provienen del PIC de Protocolo, configurar al módulo de RF CC1000 de acuerdo al modo de operación indicado, atender las fuentes de interrupción que se encuentren activas; las interrupciones permiten el intercambio de datos entre los PIC‟s del nodo y la comunicación mediante RF con los demás nodos de la red. 4.1 Descripción de funcionamiento El PIC de Enlace en su etapa de configuración, una vez que se le ha aplicado la fuente de alimentación lleva a cabo los siguientes procesos: primero configura el registro OPTION_REG (ver tabla 4.1), después configura los puertos (ver tabla 4.2), luego el módulo MSSP en modo SPI para la comunicación con el módulo CC1000 (ver tabla 4.3), limpia los puertos y el registro BANDERAS (vea la sección 1.4.2), le indica al PIC de Protocolo que todavía no se configura el módulo CC1000 (PORTB,6), espera la señalización (PORTB,7) hasta que se configure la UART de el PIC de Protocolo, después de recibir la señalización configura la UART (vea la sección 8.3) habilitando la interrupción por recepción por UART para la comunicación entre el PIC de Enlace y el PIC de Protocolo, inicializa el registro BANDERAS colocando a uno los bits de Buffer de TX vacío y Buffer de RX vacío (vea figura 1.13 de la sección 1.4.2), inicializa los apuntadores de escritura y de lectura de los Buffers de transmisión y recepción, habilita las banderas de la interrupción por periféricos y general. Una vez realizada ésta última acción procede a monitorear la condición del modo de operación que es indicado por el PIC de Protocolo, este monitoreo se lleva a cabo al verificar continuamente los pines 4 y 5 del puerto B del PIC de Enlace (vea tabla 4.2); el cual es una de las dos funciones que tienen estos dos pines, la otra función es indicar el modo de operación actual del módulo CC1000 como se vera en la sección 4.3.2. Para el monitoreo permanece en un bucle infinito mientras permite que se compruebe el estado en que se debe configurar al módulo CC1000, lo cual puede ser de bajo consumo (PD), transmisor (TX) ó receptor (RX). Una vez que se conoce el modo de operación en el que debe trabajar el módulo CC1000 se examina el estado actual del CC1000; esto se hace para prevenir reconfiguraciones con el mismo modo de operación, por ejemplo, si el módulo CC1000 se encuentra en modo PD y el PIC de Protocolo desea que esté precisamente en PD, no es necesario efectuar una reconfiguración. Para saber el modo de operación actual del módulo CC1000 se recurre al registro BANDERAS (bits <6:4>). 62 Bits RBPU INTEDG T0CS T0SE PSA PS<2:0> Valor 0 1 0 1 0 1 Registro OPTION_REG Función Habilita las resistencias de pull-ups del PORTB. Interrupción por filo de subida del pin RB0/INT. Instrucción del ciclo de reloj interna (CLKO). Incremento de transición de alto a bajo en pin RA4/T0CKI. Preescalador asignado al Timer0. Proporción 1:256 del TMR0. Tabla 4.1 Configuración del registro OPTION_REG. Valor del Puerto y Entrada o Salida registro TRIS Pin TRISB = B1h RB7 Entrada RB6 Salida RB<5:4> Entrada TRISC = 90h TRISD = 00h RB3 Salida RB2 RB1 Salida Salida RB0 RC7 RC6 RC5 RC4 RC3 RC1 Entrada Entrada Salida Salida Entrada Salida Entrada y Salida RC0 Salida RD<6:0> Salida Función Bandera que indica si el PIC de Enlace ya puede continuar con sus actividades. Sólo nodo-P. Bandera que indica si el PIC de Enlace terminó de configurar al módulo CC1000 en alguno de sus tres modos (transmisión, recepción o bajo consumo). Bits de señalización, indican en que modo se debe configurar al módulo CC1000. 00 como transmisor 10 como receptor 11 como bajo consumo Sólo nodo-S. Bandera que indica el fin de transmisión de datos por el módulo CC1000. Bandera que indica si recibió una trama válida. Sólo nodo-S. Bandera que indica si terminó de enviar datos por UART. Entrada de interrupción externa. Inicia la comunicación UART, bit de recepción. Inicia la comunicación UART, bit de transmisión. Salida de datos serial. Entrada de datos serial. Reloj serial. Entrada de datos en modo receptor. Salida de datos en modo transmisor. 1 Indica que el dato enviado es una DIRECCIÓN. 0 Indica que el dato enviado es un DATO. Vea la sección 1.4.2. Tabla 4.2 Configuración de puertos. Registros de control, estado y dirección SSPCON SSPSTAT Valor asignado 31h 40h Tabla 4.3 Registros de configuración del módulo MSSP para operar en modo SPI. 63 Cada vez que se inicia una nueva configuración (transmisor, receptor o bajo consumo) de operación del CC1000, que es indicado por el PIC de Protocolo, y que sea diferente al estado actual, primero se deshabilitan todas las interrupciones, ya que en el proceso de configuración del módulo CC1000 no se desea atender a otro proceso, sólo el debido a la comunicación vía SPI y además le indica al PIC de Protocolo que todavía no se configura el módulo CC1000. Si el modo de operación indicado por el PIC de Protocolo es transmisión y en ese momento el módulo CC1000 no trabaja como tal, se presentan dos escenarios: 1. Si el modo de operación actual es recepción, entonces se deshabilita la recepción con la ayuda de la subrutina TURNOFFRX (vea la sección 5.5.5.2) y posteriormente se habilita la transmisión con ayuda de la subrutina TXMODE (vea la sección 4.1.1), ésta última es la encargada de configurar al módulo CC1000 en el modo de operación deseado. 2. Si el modo de operación actual es de bajo consumo, entonces se habilita la transmisión con ayuda de la subrutina TXMODE. Posterior a la configuración del módulo CC1000 se actualiza el registro de banderas, ya que ahora indicará que el módulo CC1000 opera como transmisor. Debido a que en este instante aún no se sabe que información será enviada por RF se coloca en “1” el pin DIO (pin configurado como entrada o salida digital, recibe o proporciona el estado (Alto/Bajo) que presenta el módulo de RF CC1000.) como medida de precaución. Por otra parte, si el modo de operación indicado por el PIC de Protocolo es recepción y el módulo CC1000 no trabaja como receptor, se realiza un proceso similar al de transmisión, ya que también se presentan dos escenarios: 1. Si el modo de operación actual es transmisión, entonces se deshabilita la transmisión con la ayuda de la subrutina TURNOFFTX (vea la sección 5.5.6.2) y posteriormente se habilita la recepción con ayuda de la subrutina RXMODE (vea la sección 4.1.2), ésta última es la encargada de configurar al módulo CC1000 en el modo de operación deseado. 3. Si el modo de operación actual es de bajo consumo, entonces se habilita la recepción con ayuda de la subrutina RXMODE. Al igual que en transmisión se debe actualizar el registro de banderas para indicar el estado actual de operación del módulo CC1000, ya que ahora indicará que opera como receptor. Por último si el modo de operación indicado por el PIC de Protocolo es de bajo consumo y no está operando en bajo consumo, primero se identifica cual es el estado actual de operación, por lo que se presentan dos casos: 1. Si el modo de operación actual es recepción, entonces se deshabilita la recepción con la ayuda de la subrutina TURNOFFRX. 2. Si el modo de operación actual es transmisión, entonces se deshabilita la transmisión con la ayuda de la subrutina TURNOFFTX. 64 Al deshabilitar el modo presente del módulo CC1000, éste quedará en modo de bajo consumo, por lo que sólo resta actualizar el registro de banderas. En cualquiera de los tres casos de configuración, una vez que se ha terminado de configurar al módulo CC1000, se le indica al PIC de Protocolo que terminó la configuración, además habilita la bandera de la interrupción general y continúa monitoreando el modo de operación que indique el PIC de Protocolo. En las figuras 4.1, 4.2, 4.3 y 4.4 se muestran los diagramas de flujo del algoritmo. 65 Figura 4.1 Diagrama de flujo del Programa Principal del PIC de Enlace, parte 1/4. 66 Figura 4.2 Diagrama de flujo del Programa Principal del PIC de Enlace, parte 2/4. 67 Figura 4.3 Diagrama de flujo del Programa Principal del PIC de Enlace, parte 3/4. 68 Figura 4.4 Diagrama de flujo del Programa Principal del PIC de Enlace, parte 4/4. 69 4.2 Descripción de las subrutinas TXMODE y RXMODE Estas rutinas, TXMODE y RXMODE, se encargan de inicializar y activar al módulo CC1000 como transmisor o como receptor, respectivamente, configurar a DIO como salida o entrada y habilitar la interrupción externa. Son invocadas por el programa principal. Cuando se desea configurar como transmisor se invoca a TXMODE, y su función principal es inicializar al módulo CC1000, con ayuda de la subrutina INITCC1000 (vea la sección 5.5.2.), para posteriormente activar la transmisión, con la subrutina TURNONTX (vea la sección 5.5.6.1.), después configura a DIO (PORTC,1) como salida para que pueda enviar la trama y por último habilita la interrupción externa. Cuando se desea configurar como receptor se invoca a RXMODE, y su función principal es inicializar al módulo CC1000, con ayuda de la subrutina INITCC1000 (vea la sección 5.5.2.), para posteriormente activar la recepción, con la subrutina TURNONRX (vea la sección 5.5.6.1.), después configura a DIO (PORTC,1) como entrada para que pueda recibir la trama y por último habilita la interrupción externa. 4.2.1 Descripción de la subrutina TXMODE TXMODE Subrutina encargada de coordinar la configuración del módulo CC1000 como transmisor. Entrada: Ninguna. Salida: Ninguna. Subrutinas empleadas INITCC1000 TURNONTX Vea la sección 5.5.2. Vea la sección 5.5.6.1. En la figura 4.5 se muestra el diagrama de flujo a la subrutina TXMODE. Figura 4.5 Diagrama de flujo de TXMODE. 70 4.2.2 Descripción de la subrutina RXMODE RXMODE Subrutina encargada de coordinar la configuración del módulo CC1000 como receptor. Entrada: Ninguna. Salida: Ninguna. Subrutinas empleadas INITCC1000 TURNONRX Vea la sección 5.5.2. Vea la sección 5.5.5.1. En la figura 4.6 se muestra el diagrama de flujo a la subrutina RXMODE. Figura 4.6 Diagrama de flujo de RXMODE. 4.3 Servicios de interrupción en el PIC de Enlace En esta aplicación el funcionamiento del programa principal se ve interrumpido para dar atención al servicio de interrupción presente en el PIC de Enlace. Las fuentes de interrupción habilitadas en el PIC de Enlace son las siguientes: Interrupción externa, debido al módulo CC1000 al configurarse como transmisor o receptor. Interrupción por recepción UART. Cada que se produce una interrupción se procede a la validación de la fuente de interrupción, ya que esto dirá que proceso se debe realizar para atender las necesidades del nodo. La validación se hace al verificar los registros INTCON y PIR1 del PIC de Enlace; La bandera INTF del INTCON indica la existencia o ausencia de interrupción externa, el registro PIR1 es referente a periféricos y en su bandera RCIF indica la existencia o ausencia de interrupción debido al dispositivo UART en su modalidad de receptor. 71 Si la fuente de interrupción es debido al módulo CC1000, que corresponde a una interrupción externa, se va hacia el conector REQUEST_CC1000, que se encarga de la transmisión y recepción vía RF. En el caso de que la interrupción sea producto de una recepción vía UART, se va hacia el conector REQUEST_UART_RX. Para resumir lo anterior en la figura 4.7 se presenta el diagrama de flujo que muestra el servicio de interrupción. Figura 4.7 Diagrama de flujo de los servicios de interrupción. 4.3.1 Descripción de la sección del servicio de interrupción por recepción REQUEST_UART_RX Antes de acceder al servicio de interrupción REQUEST_UART_RX el módulo CC1000 debe encontrarse operando en bajo consumo, ya que de ésta forma se previenen colisiones entre fuente de interrupción externa e interrupción de periféricos. La sección del servicio de interrupción REQUEST_UART_RX se encarga de almacenar en el buffer de transmisión uno a uno los bytes entregados por el PIC de Protocolo; el apuntador POINTER_TXW indica la posición en la que se almacena mediante direccionamiento indirecto el byte que se encuentra en el registro RCREG (registro que contiene un byte recibido por UART), después se incrementa el valor del apuntador POINTER_TXW, ya que debe apuntar a una localidad vacía del buffer de transmisión, de ésta forma queda actualizado el apuntador para la siguiente vez que se entre a la sección del servicio de interrupción REQUEST_UART_RX. Una vez que se ha agregado un dato al buffer se actualiza el registro de banderas, asegurando la existencia de por lo menos un dato en el buffer de transmisión, por lo tanto el buffer no está vacío, así que se limpia la bandera de buffer de transmisión vacío. 4.3.1.1 Descripción técnica de la sección del servicio de interrupción por recepción REQUEST_UART_RX REQUEST_UART_RX Sección de la rutina de interrupción que se encargada de almacenar los datos recibidos vía UART en el buffer de transmisión. 72 Entrada: RCREG. Salida: Ninguna. Registro que contiene el byte recibido vía UART. Subrutinas empleadas: Ninguna. Variables utilizadas POINTER_TXW RCREG Apuntador de escritura del buffer de transmisión, apunta a la localidad vacía del buffer, que se encuentra después de los datos almacenados. Registro que entrega a la subrutina el byte recibido vía UART. BANDERAS BANDERAS,0 Bandera que indica si el buffer de transmisión se encuentra vacío. En la figura 4.8 se muestra mediante un diagrama de flujo de la sección del servicio de interrupción por recepción REQUEST_UART_RX. Figura 4.8 Diagrama de flujo de la sección del servicio de interrupción por recepción REQUEST_UART_RX. 4.3.2 Descripción de la sección del servicio de interrupción externa REQUEST_CC1000 La sección del servicio de interrupción externa REQUEST_CC1000 se encarga de atender a la interrupción externa generada por el reloj del módulo CC1000, el reloj se genera cuando el módulo CC1000 se configura como transmisor o receptor, en cada caso se procede de manera diferente. 73 Inicialmente se baja la bandera de interrupción externa, se establece el número de pulsos de preámbulo, el número de bytes de preámbulo inicial, el número de bytes de preámbulo final y los valores de los bytes de preámbulo, se decide el proceso que se llevará a cabo (transmisión o recepción), esto mediante el bit cinco del registro BANDERAS, el cual indica el modo de operación actual del módulo CC1000 (transmisor o receptor). En el caso de transmisión, primero se verifica que el módulo CC1000 este en realidad como transmisor (PORTB<5:4>) de no estarlo se concluye el servicio de interrupción externa, por el contrario se revisa el estado del buffer de transmisión, buffer vacio ó buffer lleno, con ayuda de la subrutina ES_VACIOTX (vea la sección 4.2.2.2), ya que si se encuentra vacío no será necesario seguir y se da por concluido el servicio de interrupción externa; si contiene datos el buffer se procede a generar la trama a transmitir con ayuda de la subrutina TRANSMITIR (vea la sección 9.3). Una vez enviada la trama se desactiva la interrupción externa y se actualiza el registro de banderas, debido a que el buffer de transmisión se encuentra vacío. Mediante el pin 3 del puerto B (sólo nodo-S) se avisa al PIC de Protocolo que se ha enviado satisfactoriamente la trama vía RF, colocando durante un intervalo de tiempo de 25μs en alto dicho pin, este intervalo de tiempo es suficiente para que el PIC de Protocolo observe la señalización. Se restaura el valor del apuntador, POINTER_TXW a 0x10, y se da por finalizado el servicio de interrupción externa REQUEST_CC1000. En caso de recepción, primero se verifica que el módulo CC1000 este en realidad como receptor (PORTB<5:4>), de no estarlo se concluye el servicio de interrupción externa, por el contrario se deshabilita la interrupción externa y se indica a través del pin 1 del puerto B (sólo nodo-S) que aún no ha terminado de enviar los datos por UART al PIC de Protocolo; después comienza a buscar una trama que cumpla con el formato KeeLoq con ayuda de la subrutina RECIBE (vea la sección 9.4). Mediante el bit FRX del registro FLAGSRF se evalúa si ya se ha obtenido una trama, si no es así se continua la búsqueda, pero si ya se cuenta con ella se baja la bandera de buffer de recepción vacío y sube la bandera de buffer de recepción lleno, activa la bandera de trama válida mediante el pin 2 del puerto B, este aviso dura 25μs suficiente para ser detectada la señalización. Una vez recibida la trama válida ésta debe ser transmitida al PIC de Protocolo, para ello se extrae del buffer de recepción el tamaño de la trama, dicho valor se encuentra en la localidad 0x191, a este valor se le suma el contenido del registro POINTER_RXW y se le suma un dos para obtener el tamaño total de la trama en el buffer de recepción. El resultado de la suma se guarda en el apuntador POINTER_RXW, el cual establece el fin del paquete de datos en el proceso de transmisión vía UART y espera 500μs para que el PIC de Protocolo se prepare. Después se envía la trama recibida, pero antes se verifica que el buffer de recepción no se encuentre vacío, con ayuda de la subrutina ES_VACIORX (vea la sección 4.2.2.3), ya que si se encuentra vacío se va hacia el conector BUFFER_RX_VACIO (vea la sección 4.2.2.4), en caso de estar lleno, el apuntador POINTER_RXR se almacena en FSR y se envían uno a uno los bytes que serán entregados al PIC de Protocolo, esperando 5ms entre cada byte transmitido; se incrementa POINTER_RXR para enviar el siguiente byte, se actualiza el registro de banderas, asegurando que por lo menos se ha enviado un dato vía UART y por tanto este buffer ya no contiene una trama completa, así que se limpia la bandera de buffer de recepción lleno y continúa en un bucle enviando los bytes restantes. Cuando termina de enviar todos los bytes al PIC de Protocolo, el buffer de 74 recepción se encuentra vacío y se sale del bucle, para después dirigirse hacia el conector BUFFER_RX_VACIO, el cual informa al PIC de Protocolo, mediante el pin 1 del puerto B (sólo nodo-S), que ya se le ha enviado la totalidad de la trama para su procesamiento. Se inicializan los valores de los apuntadores del buffer de recepción, ya que el buffer de recepción está vacío, y se da por finalizado el servicio de interrupción externa REQUEST_CC1000. 4.3.2.1 Descripción técnica de la sección del servicio de interrupción externa REQUESTE_CC1000 REQUEST_CC1000 Sección de la rutina de interrupción que se encarga de enviar o recibir una trama en protocolo KeeLoq. Entrada: Almacena datos en el buffer de recepción, en caso de recepción. Salida: Contenido del buffer de transmisión, en caso de transmisión. Subrutinas empleadas TRANSMITIR RECIBIR ES_VACIOTX ES_VACIORX vea la sección 9.3. vea la sección 9.4. Subrutina encargada de verificar si el buffer de transmisión se encuentra vacío. Subrutina encargada de verificar si el buffer de recepción se encuentra vacío. Variables utilizadas POINTER_TXW POINTER_TXR FLAGSRF POINTER_RXR POINTER_RXW Apuntador de escritura del buffer de transmisión, apunta a la última localidad del buffer, que se encuentra después de los datos almacenados. Registro que apunta a cada localidad del buffer de transmisión que se extrae para la generación de la trama en formato KeeLoq. vea las secciones 9.3.2 y 9.4.2. Apuntador de lectura del buffer de recepción, apunta a la localidad del dato que será enviado vía UART, del buffer de recepción. Apuntador de escritura del buffer de recepción, apunta a la última localidad del buffer, que se encuentra después de los datos almacenados. Banderas utilizadas PORTB,1 PORTB,2 PORTB,3 BANDERAS,0 BANDERAS,2 BANDERAS,3 Indica la terminación de datos por UART (sólo nodo-S). Indica la recepción exitosa de una trama vía RF. Indica la transmisión exitosa de una trama vía RF (sólo nodo-S). Bandera que indica si el buffer de transmisión se encuentra vacío. Bandera que indica si el buffer de recepción se encuentra vacío. Bandera que indica si el buffer de recepción se encuentra lleno. 75 Como se explica en la sección 4.2.2, las únicas diferencias entre el servicio de interrupción externa REQUEST_CC1000 en el nodo-P y nodo-S, son las banderas PORTB<3> y PORTB<1> que están implementadas sólo en el nodo-S. Por lo que estas diferencias se observan en las figuras 4.9, 4.10, 4.11, 4.12, 4.13, 4.14 y 4.15 que muestran los diagramas de flujo del servicio de interrupción externa REQUEST_CC1000. Las figuras 4.9, 4.10 y 4.11 se encuentran asociadas al nodo-P y las figuras 4.12, 4.13, 4.14 y 4.15 al nodo-S. 76 Figura 4.9 Diagrama de flujo de la sección del servicio de interrupción externa REQUEST_CC1000 nodo primario, parte 1/3. 77 Figura 4.10 Diagrama de flujo de la sección del servicio de interrupción externa REQUEST_CC1000 nodo primario, parte 2/3. 78 Figura 4.11 Diagrama de flujo de la sección del servicio de interrupción externa REQUEST_CC1000 nodo primario, parte 3/3. 79 Figura 4.12 Diagrama de flujo de la sección del servicio de interrupción externa REQUEST_CC1000 nodo secundario, parte 1/4. 80 Figura 4.13 Diagrama de flujo de la sección del servicio de interrupción externa REQUEST_CC1000 nodo secundario, parte 2/4. Figura 4.14 Diagrama de flujo de la sección del servicio de interrupción externa REQUEST_CC1000 nodo secundario, parte 3/4. 81 Figura 4.15 Diagrama de flujo de la sección del servicio de interrupción externa REQUEST_CC1000 nodo secundario, parte 4/4. 82 4.3.3 Descripción técnica de la sección del servicio de interrupción BUFFER_RX_VACIO BUFFER_RX_VACIO Se encarga de informar al PIC de Protocolo que ya se le ha enviado la totalidad de la trama para su procesamiento (sólo nodo-S), se inicializan los valores de los apuntadores del buffer de recepción ya que el buffer está vacío. Entrada: Ninguna. Salida: PORTB,1 Indica si se ha enviado la trama completa al PIC de Protocolo (sólo nodo-S). Variables utilizadas POINTER_RXR POINTER_RXW Apuntador de lectura del buffer de recepción, apunta a la localidad del dato que será enviado vía UART, del buffer de recepción. Apuntador de escritura del buffer de recepción, apunta a la última localidad del buffer, que se encuentra después de los datos almacenados. En las figuras 4.16 y 4.17 se muestran los conectores BUFFER_RX_VACIO, tanto para el nodo-P como para el nodo-S, mediante diagramas de flujo. Figura 4.16 Diagrama de flujo del conector BUFFER_RX_VACIO nodo primario. Figura 4.17 Diagrama de flujo del conector BUFFER_RX_VACIO nodo secundario. 83 4.4 Descripción de las rutinas ES_VACIOTX y ES_VACIORX Estas rutinas, ES_VACIOTX y ES_VACIORX, se encargan de verificar si los buffers de transmisión y recepción se encuentran vacíos, para después activar la bandera correspondiente. Son invocadas por la rutina de servicio de interrupción externa REQUESTE_CC1000, cuando se desea conocer si el buffer de transmisión esta vacío se invoca a ES_VACIOTX, y su función principal es realizar la resta de POINTER_TXR menos PONITER_TXW, si el resultado es cero se activa la bandera de BUFFERTX vacío (BANDERAS,0) y por último se visualiza la bandera en la barra de LEDS (vea la sección 1.1). Cuando se desea conocer si el buffer de recepción esta vacío se invoca a ES_VACIORX, y su función principal es realizar la resta de POINTER_RXR menos PONITER_RXW, si el resultado es cero se activa la bandera de BUFFERRX vacío (BANDERAS,2) y por último se visualiza la bandera en la barra de LEDS (vea la sección 1.1). 4.4.1 Descripción técnica de la subrutina ES_VACIOTX ES_VACIOTX Entradas: POINTER_TXW POINTER_TXR Salida: BANDERAS,0 Subrutina encargada de verificar si el buffer de transmisión se encuentra vacío. Apuntador de escritura del buffer de transmisión, apunta a la última localidad del buffer, que se encuentra después de los datos almacenados. Registro que apunta a cada localidad del buffer de transmisión que se extrae para la generación de la trama en formato KeeLoq. Bandera que indica si el buffer de transmisión esta vacío. Variables utilizadas POINTER_TXW POINTER_TXR En la figura 4.18 se muestra el diagrama del flujo de la subrutina ES_VACIOTX. 84 Figura 4.18 Diagrama de flujo de la subrutina ES_VACIOTX. 4.4.2 Descripción técnica de la subrutina ES_VACIORX ES_VACIORX Entrada: POINTER_RXR POINTER_RXW Salida: BANDERAS,2 Subrutina encargada de verificar si el buffer de recepción se encuentra vacío. Apuntador de lectura del buffer de recepción, apunta a la localidad del dato que será enviado vía UART, del buffer de recepción. Apuntador de escritura del buffer de recepción, apunta a la última localidad del buffer, que se encuentra después de los datos almacenados. Indica si el buffer de recepción está vacío. Variables utilizadas POINTER_RXR POINTER_RXW En la figura 4.19 se muestra el diagrama de flujo de la subrutina ES_VACIORX. 85 Figura 4.19 Diagrama de flujo de la subrutina ES_VACIORX. 86 CAPÍTULO 5. Funcionamiento y configuración del módulo CC1000. 5.1 Descripción del circuito El módulo CC1000 es un Transceiver SRD (Short Range Device) de UHF (Ultra High Frequency) diseñado para aplicaciones inalámbricas de baja potencia y bajo voltaje. Está diseñado para las bandas de frecuencia ISM (Industrial Scientific and Medical) y SRD (Short Range Device) para operar a 315, 433, 868 y 915 MHz. Los parámetros de configuración del módulo CC1000 pueden ser programados mediante un bus serial de tres líneas. El módulo CC1000PP viene en dos versiones, el módulo CC1000PP-433 que opera a 433 MHz y el módulo CC1000PP-868 que opera a 868.3 MHz. Para este proyecto se utiliza la versión 868 del módulo. Los pines de salida del módulo se muestran en la tabla 5.1. Tabla 5.1 Pines de salida del Módulo CC1000PP-868. El módulo CC1000PP-868 (28x20mm) contiene todos los elementos de RF requeridos para su funcionamiento, también incluye un cristal de 14.745 MHz y un filtro LC para eliminar los armónicos emitidos. Este módulo está diseñado para trabajar en un intervalo de frecuencia de 868 MHz a 930 MHz, la figura 5.1 muestra el módulo CC1000 y los elementos que lo componen. Figura 5.1 Módulo CC1000PP‐868. 87 La tabla 5.2 muestra el nombre, tipo y descripción de cada pin del módulo CC1000-868. Nombre pin PALE Tipo de pin Entrada digital PDATA Entrada/Salida digital PCLK DCLK Entrada digital Salida digital DIO Digital input/output CHP_OUT (LOCK) Entrada/Salida de datos Salida Analógica VDD GND Antena Alimentación Tierra Entrada/Salida de RF Salida Analógica RSSI/IF Descripción Cerrojo de la dirección de programación para habilitar el pin 24, 25 y 26. Tiene resistencia de pull-up internas. Datos de programación. Entrada de datos de programación para la operación de escritura, salida de datos de programación para la operación de lectura. Entrada para la programación del reloj. Salida de los niveles de la señal de reloj para los datos en el modo de recepción y transmisión. Entrada de datos en modo transmisor. Salida de datos en modo receptor. Salida de la carga de corriente del generador. El pin se puede utilizar también como indicador de bloqueo de PLL. La salida es alta cuando PLL está bloqueado. Fuente de alimentación (3 V) para módulos digitales. Conexión a tierra (0 V) para módulos digitales. Entrada y salida de la señal de RF de la antena. El pin puede ser usado como RSSI o salida IF de 10.7 MHZ para opciones externas de IF. Si no se usa, el pin debe quedar abierto (no conectado). Tabla 5.2 Descripción de los pines. 5.2 Interfaz de configuración En un sistema típico, el módulo CC1000 utiliza una interfaz con un microcontrolador. El microcontrolador debe estar habilitado para programar al CC1000 en diferentes modos de operación, por medio de tres pines usados como interfaz de configuración (PDATA, PCLK y PALE). El pin del microcontrolador conectado a PDATA debe ser bidireccional para la lectura de datos de programación. Otro pin bidireccional para conectarse a la terminal de los datos (DIO) del módulo CC1000 que serán transmitidos y recibidos. DCLK debe ser conectado a un pin de entrada del microcontrolador ya que produce los niveles de la señal de reloj (ver figura 5.2 y 5.3). Figura 5.2 Interfaz con el Microcontrolador. 88 Figura 5.3 Diagrama de conexión con el PIC16F877A. La figura 5.4 muestra la interfaz de configuración de manera general utilizando el protocolo SPI y la figura 5.3 las conexiones con el microcontrolador PIC16F877A. Los pines del microcontrolador conectados a PDATA y PCLK pueden utilizarse para otros propósitos, cuando la interfaz de configuración no esta en uso, con la condición de que PALE se encuentre en estado alto. PALE tiene resistencia de pull-up y puede estar abierta o activada en un nivel alto, mientras el módulo CC1000 este en modo de bajo consumo a fin de prevenir un desperdicio de corriente. Figura 5.4 Interfaz SPI. Se recomienda utilizar el puerto serial síncrono (SPI) del microcontrolador para llevar a cabo la interfaz con el módulo CC1000. Con SPI en modo maestro, el pin MISO (Master In, Slave Out) y el MOSI (Master Out, Slave In) deben conectarse juntos y a su vez estar conectados con el pin PDATA. El pin MOSI debe configurarse como entrada durante la lectura del módulo CC1000. Un pin de propósito general (I/O pin) puede usarse para controlar el PALE del módulo CC1000. El módulo CC1000 se configura mediante una interface de tres líneas (PDATA, PALE, PCLK). Hay 22 registros de configuración de 8 bits, y cada uno de estos registros se direccionan utilizando 7 bits. Adicionalmente, un bit de lectura y escritura (Read/Write) se utiliza para indicar la operación a ejecutar, de manera que se tienen 7 bits para direccionar al registro de configuración, un bit que indica la operación a ejecutar y 8 bits del dato que se almacenará en el registro de configuración, dando un total de 16 bits. La configuración completa del módulo CC1000 requiere que se envíen 22 89 tramas de 16 bits cada una. En cada ciclo de escritura se envían 16 bits en la línea PDATA, donde los primeros 7 bits (A15:A9), los más significativos, se envían primero y corresponden a la dirección del registro de configuración. El siguiente bit a enviar es el de Lectura/Escritura (Read/Write; alto para escritura y bajo para lectura). Durante la transmisión de la dirección y el bit R/W, la línea PALE debe mantenerse en nivel bajo. Finalmente se envían los 8 bits que corresponden al dato iniciando con el bit más significativo, que se almacena en el registro de configuración direccionado, ver figura 5.5. Los datos de configuración se almacenan en la RAM interna del módulo CC1000, los datos se mantienen durante el modo de baja potencia (“power down”), pero no cuando el voltaje de alimentación se desconecta. Los registros de configuración pueden ser leídos por el microcontrolador por la misma interface de configuración. Los siete bits de direcciones se envían primero, después el bit R/W se pone en estado bajo para iniciar la lectura de los datos, ver figura 5.6. Figura 5.5 Operación de escritura de los registros de configuración. Figura 5.6 Operación de lectura de los registros de configuración. 5.3 Interfaz de la señal de Datos La interfaz de la señal de datos consiste en las líneas DIO y DCLK, y se usan para la transmisión y recepción de los datos. El DIO es la línea bidireccional de datos y DCLK transmite una señal de reloj síncrona durante la transmisión y recepción de datos hacia el microcontrolador. El módulo CC1000 puede usarse con los códigos de línea NRZ (Non-Return to Zero) ó Manchester. En este proyecto se utiliza el modo Manchester. Modo síncrono de codificación Manchester. En modo de transmisión el módulo CC1000 genera la velocidad del reloj para los datos, en la línea DCLK, y DIO se usa como entrada de datos. Los datos se modulan con codificación Manchester en RF. En modo de recepción el módulo CC1000 crea la sincronización con los tiempos de reloj en DCLK, y DIO se utiliza para la recepción de datos, ver figura 5.7. 90 Figura 5.7 Modo Manchester. 5.4 Parámetros configurables Para una aplicación particular se puede obtener el mejor desempeño del módulo CC1000 al establecer adecuadamente la configuración de sus registros programables, cuyos parámetros clave son: Modo recepción/transmisión. Potencia de salida RF. Frecuencia de RF, frecuencia de separación de la modulación FSK. Modo Power Down/Power UP. Velocidad de datos y formato de datos (NRZ, Manchester y UART). 5.4.1 Software y registros de configuración para el módulo CC1000 CHIPCON cuenta con un software, llamado SmartRF Studio, que genera los valores necesarios para la configuración del módulo CC1000, basados en la selección de varios parámetros que realiza el usuario. El programa genera valores hexadecimales que deben almacenarse en los registros de configuración del módulo CC1000. La configuración del módulo CC1000 se lleva a cabo programando 22 registros de 8 bits. El software también provee los valores de los capacitores y bobinas para las diferentes frecuencias programadas. En las figuras 5.8 y 5.9, se muestra un ejemplo de valores de configuración usando las interfaces del software del módulo CC1000. 91 Figura 5.8 SmartRF Studio: Ventana de Configuración y Componentes. Figura 5.9 SmartRF Studio: Ventana de Registros. Nota: Este software se encuentra en la página web www.chipcon.com. Después de un reset (al módulo CC1000) todos los registros recuperan su valor que tienen por default. La tabla 5.3 muestra el nombre, dirección, contenido y descripción de cada registro. El contenido de los 22 registros se obtuvo del software, llamado SmartRF Studio. 92 Nombre del Byte MAIN FREQ 2A FREQ 1A FREQ 0A FREQ 2B FREQ 1B FREQ 0B FSEP 1 FSEP 0 CURRENT FRONT_END PA_POW PLL LOCK Dirección 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh Contenido E1 75h A0h 00h 58h 33h 13h 01h ABh F3h 30h FFh 30h 90h CAL 0Eh 26h MODEM2 MODEM1 MODEM0 MATCH 0Fh 10h 11h 12h C1h 6Fh 54h 10h FSCTRL 13h 01h PRESCALER 1Ch 00h TEST04 42h 3Fh Descripción Registro MAIN Registro de Frecuencias 2A Registro de Frecuencias 1A Registro de Frecuencias 0A Registro de Frecuencias 2B Registro de Frecuencias 1B Registro de Frecuencias 0B Registro de Frecuencia de Separación 1 Registro de Frecuencia de Separación 0 Registro de Control de Consumo de Corriente Registro de Control de fin delantero 0 Registro de Control de Potencia de la salida PA Registro de Control de PLL Registro de Estado de bloqueo y selección de la señal de salida CHP (BLOQUEO) Registro de Estados y de control de calibración de VCO Registro de Control de módem 2 Registro de Control de módem 1 Registro de Control de módem 0 Registro de Control del capacitor de acoplamiento para la impedancia de RX y TX Registro de Control del Sintetizador de Frecuencia Registro de Control de prescalador y análisis de IF-strip Registro de análisis para PLL LOOP (debe ser actualizado específicamente) Tabla 5.3 Registros de Configuración del módulo CC1000. En las tablas 5.4 a 5.8 se describen los registros del módulo CC1000 más importantes, incluyendo sus bits, estos registros al modificarse su contenido, cambia la configuración o modo de operación del módulo CC1000. Bit MAIN<7> MAIN<6> Nombre RXTX F_REG Registro MAIN Descripción Conmuta RX/TX, RX = 0 y TX = 1 Selección de registro de frecuencia, Registro A = 0 y Registro B = 1 MAIN<5> RX_PD MAIN<4> TX_PD MAIN<3> FS_PD MAIN<2> CORE_PD MAIN<1> MAIN<0> Interfaz de recepción en bajo consumo, Activo = 1 e Inactivo = 0 Interfaz de transmisión en bajo consumo, Activo = 1 e Inactivo = 0 Sintetizador de frecuencia en bajo consumo, Activo = 1 e Inactivo = 0 Núcleo del oscilador desactivado en bajo consumo, Activo = 1 e Inactivo = 0 BIAS_PD BIAS y Buffer del oscilador en bajo consumo, Activo = 1 e Inactivo = 0 RESET_N Bit de reset, Activo = 0 e Inactivo = 1 Tabla 5.4 Registro Main. 93 Registro CURRENT Bit CURRENT<7:4> Nombre VCO_CURRENT<3:0> CURRENT<3:2> LO_DRIVE<1:0> CURRENT<1:0> PA_DRIVE<1:0> Descripción Control de corriente en el núcleo VCO para TX y RX 0000 : 150µA 0001 : 250µA 0010 : 350µA 0011 : 450µA 0100 : 950µA, usar para RX, f = 400 – 500 MHz 0101 : 1050µA 0110 : 1150µA 0111 : 1250µA 1000 : 1450µA, usar para RX, f < 400 MHz y f > 500 MHz; y TX, f = 400 – 500 MHz 1001 : 1550 µA, usar para TX, f < 400 MHz 1010 : 1650 µA 1011 : 1750 µA 1100 : 2250 µA 1101 : 2350 µA 1110 : 2450 µA 1111 : 2550 µA, usar para TX, f > 500 MHz Control de corriente en buffer VCO para drive LO 00 : 0.5 mA, usado para TX 01 : 1.0 mA, usar para RX, f < 500 MHz 10 : 1.5 mA 11 : 2.0 mA, usar para RX, f > 500 MHz Control de corriente en buffer VCO para PA 00 : 1 mA, usar para RX 01 : 2 mA, usar para TX, f < 500 MHz 10 : 3 mA 11 : 4 mA, usar para TX, f > 500 MHz Tabla 5.5 Registro Current. Registro PLL Bit PLL<7> PLL<6:3> PLL<2> PLL<1> PLL<0> Nombre EXT_FILTER Descripción 1 : Filtro de ciclo externo 0 : Filtro de ciclo interno REFDIV<3:0> Divisor de referencia 0000 : No permitido 0001 : No permitido 0010 : dividir por 2 0011 : dividir por 3 …...... 1110 : dividir por 14 1111 : dividir por 15 ALARM_DISABLE 0 : Función de Alarma habilitada 1 : Función de Alarma deshabilitada ALARM_H Sincronizar voltaje de alimentación fuera del intervalo ALARM_L Sincronizar voltaje de tierra fuera del intervalo Tabla 5.6 Registro PLL. 94 Registro CAL Bit CAL<7> CAL<6> CAL<5> CAL<4> CAL<3> CAL<2:0> Nombre CAL_START Descripción 1 : Calibración iniciada 0 : Calibración inactiva 1 : Almacena calibración en ambos A y B CAL_DUAL 0 : Almacena calibración en A o B definida por MAIN<6> CAL_WAIT 1 : Tiempo de espera de calibración normal 0 : Tiempo de espera de mitad de calibración CAL_CURRENT 1 : Calibración al doble de corriente 0 : Corriente de calibración normal CAL_COMPLETE Bit de estado define que la calibración esta completa 1 : Calibración completa 0 : Calibración en proceso CAL_ITERATE<2:0> Valor de inicio de iteración para calibración DAC 000 – 101 : No usados 110 : Valor de inicio normal 111 : No usado Tabla 5.7 Registro CAL. Registro PA_POW Bit Nombre Descripción PA_POW<7:4> PA_HIGHPOWER<3:0> Control de potencia de salida en arreglo de alta potencia. Debería ser 0000 en modo PD (Power Down) PA_POW<3:0> PA_LOWPOWER<3:0> Control de potencia de salida en arreglo de baja potencia. Debería ser 0000 en modo PD (Power Down) Tabla 5.8 Registro PA_POW. 5.5 Procedimiento de configuración del módulo CC1000 En ésta sección se describe el procedimiento básico de configuración y calibración para comenzar a operar el módulo CC1000. Cabe mencionar que el PIC16F877A (PIC de Enlace) realiza la configuración y calibración del módulo CC1000, para ello utiliza la subrutina INITCC1000, la cual se auxilia de las subrutinas RESETCC1000 y WRITETOCC1000. 5.5.1 Secuencia de inicialización y calibración del módulo CC1000 Para lograr la correcta inicialización y calibración del módulo CC1000, se sigue la siguiente secuencia. El registro A (de 24 bits: FREQ2A, FREQ1A y FREQ0A, vea tabla 5.3) es utilizado para modo RX y el registro B (de 24 bits: FREQ2B, FREQ1B y FREQ0B, vea tabla 5.3) es utilizado para modo TX. 95 Resetear el módulo CC1000. Se almacena en el registro MAIN el valor de 3Ah, vea tabla 5.4 (Configurar la recepción: MAIN<7> = RXTX = 0, registro A: MAIN<6> = F_REG = 0, interfaz de recepción en bajo consumo: MAIN<5> = RX_PD = 1, interfaz de transmisión en bajo consumo: MAIN<4> = TX_PD = 1, sintetizador de frecuencia en bajo consumo: MAIN<3> = FS_PD = 1, núcleo del oscilador desactivado en bajo consumo: MAIN<2> = CORE_PD = 0, BIAS y Buffer del oscilador en bajo consumo: MAIN<1> = BIAS_PD = 1, y activación del reset: MAIN<0> = RESET_N = 0), y después se cambia el valor del bit RESET_N a 1, por lo que el nuevo valor del registro MAIN es ahora 3Bh. Una vez hecho esto se espera 2 ms. Programar todos los registros excepto MAIN, en la tabla 5.9 se muestran éstos registros. Posición de la tabla 15h 14h 13h 12h 11h 10h 0Fh 0Eh 0Dh 0Ch 0Bh 0Ah 09h 08h 07h 06h 05h 04h 03h 02h 01h Valores de la tabla de dirección 42h 1Ch 13h 12h 11h 10h 0Fh 0Eh 0Dh 0Ch 0Bh 0Ah 09h 08h 07h 06h 05h 04h 03h 02h 01 Valores de la tabla de dato 3Fh 00h 01h 10h 54h 6Fh C1h 26h 90h 30h FFh 30h F3h ABh 01 13h 33h 58h 00h A0h 75h Nombre del registro TEST04 PRESCALER FSCTRL MATCH MODEM0 MODEM1 MODEM2 CAL LOCK PLL PA_POW FRONT_END CURRENT FSEP 0 FSEP 1 FREQ 0B FREQ 1B FREQ 2B FREQ 0A FREQ 1A FREQ 2A Tabla 5.9 Registros de Configuración del módulo CC1000. Nota: Se inicia con la posición de la tabla 0x15 y se termina con la posición de la tabla 0x01 Calibrar primero el registro de frecuencia A. Almacenar en el registro MAIN el valor 11h, vea tabla 5.4 (Configurar la recepción, registro A, interfaz RX desactivado en bajo consumo: RX_PD = 0, interfaz TX, sintetizador de frecuencia, núcleo del oscilador en bajo consumo, BIAS y Buffer del oscilador, y desactivación del reset). Actualizar los registros CURRENT y PLL para operación en modo RX, con los valores 8Ch y 40h respectivamente (Corriente en el núcleo VCO de 1450 µA: CURRENT<7:4> = VCO_CURRENT<3:0> = 1000, corriente en el Buffer VCO de 2 mA para el drive LO: CURRENT<3:2> = LO_DRIVE<1:0> = 11, y corriente en el Buffer VCO de 1 mA para el drive PA: CURRENT<1:0> = PA_DRIVE<1:0> = 00; filtro de ciclo interno: PLL<7> = 96 EXT_FILTER = 0, divisor de frecuencia a 8: PLL<6:3> = REFDIV<3:0> = 1000, alarma habilitada: PLL<2> = ALARM_DISABLE = 0, sincronizar voltaje de alimentación fuera del intervalo: PLL<1> = ALARM_H = 0, sincronizar voltaje de tierra fuera del intervalo: PLL<0> = ALARM_L = 0). Poner a “1” el bit CAL_START de inicio de calibración del registro CAL, el valor del registro CAL es ahora A6h (Inicia calibración: CAL<7> = CAL_START = 1, almacena calibración en A: CAL<6> = CAL_DUAL = 0, tiempo de espera normal en calibración: CAL<5> = CAL_WAIT = 1, corriente de calibración normal: CAL<4> = CAL_CURRENT = 0, calibración en proceso: CAL<3> = CAL_COMPLETE = 0, valor de inicio de iteración para calibración normal: CAL<2:0> = CAL_ITERATE<2:0> = 110). Esperar 34 ms y luego poner a “0” el bit CAL_START para finalizar la calibración. Calibrar después el registro de frecuencia B. Almacenar en el registro MAIN el valor E1h, actualizar los registros CURRENT y PLL para operación en modo TX, con los valores F3h y 30h respectivamente. Escribir en el registro PA_POW el valor de 00h, para prevenir emisiones parásitas. Poner a “1” el bit CAL_START de inicio de calibración del registro CAL, el valor del registro CAL es ahora A6h, esperar 34 ms y luego poner a “0” el bit CAL_START para finalizar la calibración. Configurar al módulo CC1000 en modo bajo consumo. Esto se logra almacenando en el registro MAIN el valor de 3Fh y en el registro PA_POW el valor de 00h. La implementación de ésta secuencia se detalla en la siguiente sección. 5.5.2 Descripción de la subrutina INITCC1000 La subrutina INITCC1000 comienza invocando la subrutina RESETCC1000 para iniciar la configuración del módulo CC1000. Después se llama la tabla DIRECCIONES (ver tabla 5.9) para obtener el valor de la dirección del registro a configurar del módulo CC1000, empieza extrayendo el valor de las direcciones desde el registro TEST04 al registro FREQ 2A, la dirección se almacena en el registro ADDRESS, posteriormente se llama la tabla DATOS (ver tabla 5.9) para obtener el dato que se va a guardar en el registro a programar del módulo CC1000, empieza extrayendo el valor de los datos desde la posición de la tabla 15h finalizando en la posición 01h. El dato que se obtiene de la tabla se almacena en el registro DATO. Una vez establecida la dirección (ADDRESS) y el dato (DATO) se envían al CC1000 con la ayuda de la subrutina WRITETOCC1000. Este proceso de cargar la dirección y el dato, y enviarlos al CC1000 se realiza 21 veces, que corresponde a 21 de los 22 registros que deben ser programados para que el módulo CC1000 quede configurado. El otro registro programado (para dar el conteo de 22 registros) fue el MAIN, considerado en la subrutina RESETCC1000. Le sigue la calibración del módulo CC1000 en los modos RX y TX. Primero se calibra el modo RX y esta se lleva a cabo con la modificación del dato de los registros MAIN, CURRENT, PLL y CAL del módulo CC1000. Para la calibración del modo transmisor (TX) se sigue un proceso similar al de RX, al modificar los registros MAIN, CURRENT, PLL y CAL, pero ahora con los valores requeridos para este modo TX. En estos procesos de configuración de los modos RX y TX, también se utiliza la subrutina WRITETOCC1000 para el envío de los datos al CC1000. 97 Por ultimo se configura el módulo CC1000 en bajo consumo, esto se realiza programando el registro MAIN y PA_POW. En las figuras 5.10, 5.11, 5.12 y 5.13 se muestran los diagramas de flujo de la subrutina INITCC1000. Constantes utilizadas: AMAIN = 00h APLL = 0Ch CAL = 26h APA_POW = 0Bh MAINRX = 11h PLLRX = 40h MAIN = E1h CPA_POW = 00h ACURRENT = 09h CURRENTRX = 8Ch ACAL = 0Eh CCAL = A6h CURRENT = F3h PLL = 30h CMAIN = 3Fh 5.5.3 Descripción de la subrutina RESETCC1000 La subrutina RESETCC1000 es la encargada de inicializar al CC1000, esto se lleva a cabo al modificar el registro MAIN. Primero se manda al registro MAIN el valor 0x3A (constante utilizada RESET1), que coloca a la interfaz RX y TX, al sintetizador de frecuencia, al BIAS y al Buffer en bajo consumo; además, activa el bit de reset (bit RESET_N). Ahora se manda al registro MAIN el valor 0x3B (constante utilizada RESET2), este dato desactiva el bit de reset. Por último espera 2 ms para que se termine el proceso de reset del módulo CC1000. Como antes, la subrutina WRITETOCC1000 se utiliza para mandar los datos al CC1000 (datos de dirección y datos de configuración). En la figura 5.14 se muestra el diagrama de flujo de la subrutina RESETCC1000. Después de un proceso de reset, los registros de configuración se cargan con los valores por default. Constantes utilizadas: AMAIN = 00h RESET1 = 3Ah RESET2 = 3Bh 5.5.4 Descripción de la subrutina WRITETOCC1000 La subrutina WRITETOCC1000 es la encargada de enviar una palabra de configuración, para ser almacenada en alguno de los registros de configuración del módulo CC1000. De manera que para realizar esta operación de escritura se debe transmitir al CC1000 éstos dos parámetros (dirección del registro de configuración y palabra de configuración). El primer parámetro o byte a enviar al CC1000 es la dirección y posteriormente la palabra de configuración. Para permitir cualquier combinación de bytes de dirección y palabra de configuración esta subrutina se auxilia de los dos siguientes registros, cuyo contenido debe estar previamente definido antes de que se invoque a esta subrutina: ADDRESS: Dirección o apuntador de la dirección del registro de configuración a modificar. DATO: Palabra de configuración que se almacenará en el registro de configuración direccionada por el apuntador de dirección. De manera que estos dos registros, más el bit R/W, componen una de las tramas de 16 bits requeridas para la configuración del módulo CC1000. 98 Por otra parte, para que el dispositivo CC1000 identifique que va a recibir un byte de dirección, la línea PALE debe cambiar de un estado alto a uno bajo (un frente de bajada), mientras que la recepción de un byte de palabra de configuración requiere que la línea PALE se mantenga en un estado alto. La subrutina comienza obligando a la línea PALE a un estado alto (para posteriormente generar el flanco de bajada), prepara el byte del apuntador de la dirección del registro de configuración, al que se le incluye en su bit menos significativo el indicador de una operación de escritura. Genera el flanco de bajada, colocando la línea PALE a un estado bajo, y transmite este apuntador de dirección. Espera a que termine la transmisión y pone la línea PALE a un estado alto, para que el módulo CC1000 reciba el siguiente byte como palabra de configuración. Finalmente transmite la palabra de configuración, dando por terminada la subrutina, en la figura 5.15 se muestra el diagrama de flujo de la subrutina WRITETOCC1000. 99 Figura 5.10 Diagrama de flujo subrutina INITCC1000, parte 1/4. 100 Figura 5.11 Diagrama de flujo subrutina INITCC1000, parte 2/4. 101 Figura 5.12 Diagrama de flujo subrutina INITCC1000, parte 3/4. 102 Figura 5.13 Diagrama de flujo subrutina INITCC1000, parte 4/4. 103 Figura 5.14 Diagrama de flujo subrutina RESETCC1000. 104 Figura 5.15 Diagrama de flujo subrutina WRITETOCC1000. 105 5.5.5 Descripción técnica de la Configuración de Recepción La configuración de activación y desactivación de recepción del módulo CC1000 se lleva a cabo con las subrutinas TURNONRX y TURNOFFRX respectivamente, éstas se auxilian de la subrutina WRITETOCC1000. 5.5.5.1 Descripción de la subrutina TURNONRX La subrutina TURNONRX es la encargada de activar el modo de recepción del módulo CC1000, esto se lleva a cabo al modificar el registro MAIN. Primero se manda al registro MAIN el valor 0x3B (constante utilizada TURNONMAIN1), selecciona RX y registro A, coloca a la interfaz RX y TX, al sintetizador de frecuencia, al BIAS y al Buffer en bajo consumo; además, desactiva el bit de reset (bit RESET_N). Se espera 2 ms, ahora se manda al registro MAIN el valor 0x39 (constante utilizada TURNONMAIN2), este dato desactiva al BIAS y al Buffer, por lo se vuelve a esperar otros 250 µs para volver a reprogramar el registro MAIN con el mismo dato. Luego se programan los registros MAIN, CURRENT, PLL con los valores de 11h, 8Ch y 40h, los mismo que se usaron para su calibración en la subrutina INITCC1000 y por último espera 250 µs para que se termine el proceso de activación del modo de recepción del módulo CC1000. Como antes, la subrutina WRITETOCC1000 se utiliza para mandar los datos al CC1000 (datos de dirección y datos de configuración). En la figura 5.16 se muestra el diagrama de flujo de la subrutina TURNONRX. Constantes utilizadas: AMAIN = 00h ACURRENT = 09h TURNONMAIN1 = 3Bh CURRENTRX = 8Ch TURNONMAIN2 = 39h APLL = 0Ch MAINRX = 11h PLLRX = 40h 5.5.5.2 Descripción de la subrutina TURNOFFRX La subrutina TURNOFFRX es la encargada de desactivar el modo de recepción del módulo CC1000, esto se lleva a cabo al modificar el registro MAIN. Primero se manda al registro MAIN el valor 0x3F (constante utilizada TRN_OFF_RX), selecciona RX y registro A, coloca a la interfaz RX y TX, al sintetizador de frecuencia, al núcleo del oscilador, al BIAS y al Buffer en bajo consumo; además, desactiva el bit de reset (bit RESET_N). Ahora se manda al registro PA_POW el valor 0x00 (constante utilizada CPA_POW), este dato configura el modo de bajo consumo del módulo CC1000. Como antes, la subrutina WRITETOCC1000 se utiliza para mandar los datos al CC1000 (datos de dirección y datos de configuración). En la figura 5.17 se muestra el diagrama de flujo de la subrutina TURNOFFRX. Constantes utilizadas: AMAIN = 00h TRN_OFF_RX = 3Fh APA_POW = 0Bh 106 CPA_POW = 00h Figura 5.16 Diagrama de flujo subrutina TURNONRX. Figura 5.17 Diagrama de flujo subrutina TURNOFFRX. 107 5.5.6 Descripción técnica de la Configuración de Transmisión La configuración de activación y desactivación de transmisión del módulo CC1000 se lleva a cabo con las subrutinas TURNONTX y TURNOFFTX respectivamente, estas se auxilian de la subrutina WRITETOCC1000. 5.5.6.1 Descripción de la subrutina TURNONTX La subrutina TURNONTX es la encargada de activar el modo de transmisión del módulo CC1000, esto se lleva a cabo al modificar el registro MAIN. Primero se manda al registro MAIN el valor 0x3B (constante utilizada TURNONMAIN1), selecciona TX y registro B, coloca a la interfaz RX y TX, al sintetizador de frecuencia, al BIAS y al Buffer en bajo consumo; además, desactiva el bit de reset (bit RESET_N). Se espera 2 ms, ahora se manda al registro MAIN el valor 0x39 (constante utilizada TURNONMAIN2), este dato desactiva al BIAS y al Buffer, por lo se vuelve a esperar otros 250 µs. Después configura al módulo CC1000 en modo bajo consumo. Luego se programan los registros MAIN, CURRENT, PLL con los valores de E1h, F3h y 30h, los mismo que se usaron para su calibración en la subrutina INITCC1000 y se vuelve a esperar 250 µs para después configurar al módulo CC1000 en modo bajo consumo y por último espera 250 µs para que se termine el proceso de activación del modo de transmisión del módulo CC1000. Como antes, la subrutina WRITETOCC1000 se utiliza para mandar los datos al CC1000 (datos de dirección y datos de configuración). En la figura 5.18 se muestra el diagrama de flujo de la subrutina TURNONRX. Constantes utilizadas: AMAIN = 00h CPA_POW = 00h APLL = 0Ch TURNONMAIN1 = 3Bh MAIN = E1h PLL = 30h TURNONMAIN2 = 39h ACURRENT = 09h PA_POW = FFh APA_POW = 0Bh CURRENT = F3h 5.5.6.2 Descripción de la subrutina TURNOFFTX La subrutina TURNOFFTX es la encargada de desactivar el modo de transmisión del módulo CC1000, esto se lleva a cabo al modificar el registro MAIN. Primero se manda al registro MAIN el valor 0xFF (constante utilizada TRN_OFF_TX), selecciona TX y registro B, coloca a la interfaz RX y TX, al sintetizador de frecuencia, al núcleo del oscilador, al BIAS y al Buffer en bajo consumo; además, desactiva el bit de reset (bit RESET_N). Ahora se manda al registro PA_POW el valor 0x00 (constante utilizada CPA_POW), este dato configura el modo de bajo consumo del módulo CC1000. Como antes, la subrutina WRITETOCC1000 se utiliza para mandar los datos al CC1000 (datos de dirección y datos de configuración). En la figura 5.19 se muestra el diagrama de flujo de la subrutina TURNOFFTX. Constantes utilizadas: AMAIN = 00h TRN_OFF_TX = FFh APA_POW = 0Bh 108 CPA_POW = 00h Figura 5.18 Diagrama de flujo subrutina TURNONTX. 109 Figura 5.19 Diagrama de flujo subrutina TURNOFFTX. 5.6 Antenas El módulo CC1000PP puede usar cualquier tipo de antena. Si la impedancia de la antena no está cerca de los 50 Ω, se deben usar componentes para aproximar la impedancia a 50 Ω. Un dipolo de λ/4 puede usarse directamente quitando los pines 1, 2 y 3 de P2 y soldando una pieza de la longitud correcta. La longitud de la antena esta dada por: L = 7125 / f Donde f esta en MHz y L en cm. La tabla 5.10 muestra la relación de frecuencia y la longitud de la antena. Tabla 5.10 1/4 de longitud de onda para las frecuencias comunes. 110 CAPÍTULO 6. Sensor digital de temperatura DS1621. El DS1621 es un sensor digital de temperatura de 8 pines, en la figura 6.1 se muestra la descripción de sus pines. Sus características principales son: No requiere de componentes externos para realizar la medida de la temperatura. El intervalo de temperatura que puede medir varía de -55 °C a 125 °C con resolución de 0.5 °C. La temperatura es leída como un valor de 9 bits, y se transmiten 2 bytes en los cuales va implícito el signo. Es un dispositivo que se puede comunicar con un microcontrolador mediante el protocolo I2C. Realiza la conversión de temperatura a una palabra digital en un segundo. Posee 256 bytes de memoria EEPROM para almacenar datos. Se puede alimentar con un voltaje de 2.7 a 5.5 V, siendo su valor típico 5V. Las entradas de dirección A2, Al y A0 permiten conectar varios DS1621 en el mismo circuito, variando la dirección de cada uno de ellos, ocho como máximo. SIMBOLO SDA SCL TOUT GND A2 A1 A0 VDD DESCRIPCIÓN Línea de datos de bus I2C. Línea de reloj del bus I2C. Salida del termostato. Tierra. Dirección de entrada. Dirección de entrada. Dirección de entrada. Entrada de la fuente de alimentación. Figura 6.1 Sensor de temperatura DS1621 circuito integrado. 6.1 Parámetros de configuración y de lectura Como cualquier dispositivo compatible con el protocolo o modo I2C, el DS1621 se activa cuando recibe la dirección valida indicada en la tabla 6.1. Esta dirección consta de una parte fija y otra programable. La parte programable la define la conexión de los pines A2, Al y A0. El bit de inicio siempre es seguido por un byte de dirección, el cual consta de cuatro bits con valor 1001 y tres bits que se aplican a la dirección A2, A1 y A0. El último bit determina la dirección en la que se establece la comunicación (R/W) lectura/escritura. En este proyecto se ha seleccionado A2, A1, y A0 conectados a tierra, así que la dirección es b‟10010000‟ para escritura y b‟10010001‟ para lectura. Parte fija Parte Programable bit7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 1 0 0 1 0 0 0 R/W Tabla 6.1 Dirección de DS1621 como esclavo en el protocolo I2C. 111 Los bytes de datos y de control son leídos y escritos en el DS1621 siguiendo el protocolo del I2C, de acuerdo al formato de la figura 6.2. En la escritura, después de enviar el byte de dirección, el microcontrolador maestro debe enviar al sensor alguno de los bytes de comando indicados en la tabla 6.2. Figura 6.2: Protocolo de comunicación del DS1621 mediante el bus I2C. Para realizar la lectura de la temperatura se distinguen 2 casos. En el modo de conversión continua, la conversión comienza a ejecutarse desde que se envía el comando Start Convert T. Las conversiones se realizan una detrás de otra y pueden ser leídas en cualquier momento. Para finalizar se envía el comando Stop Convert T. En el modo de conversión 1 SHOT, se debe enviar un comando Start Convert T cada vez que se desee realizar la lectura de la temperatura. Cuando acaba la conversión el DS1621 pasa a modo de bajo consumo. Una vez iniciada la conversión de temperatura mediante el comando Start Convert T, el microcontrolador maestro debe leer el bit DONE del registro de control para conocer si ha terminado la conversión y proceder a la lectura del DS1621. Esto no es necesario si la lectura se realiza en un tiempo mayor de un segundo después de iniciada la conversión. En este proyecto se realiza la lectura de la temperatura cada segundo. INSTRUCCIÓN DESCRIPCIÓN COMANDO COMANDOS DE CONVERSIÓN DE TEMPERATURA. Read Temperatura Lee la última conversión de temperatura. AAh Start Convert T Inicia la conversión de la temperatura. EEh Stop Convert T Detiene la conversión de la temperatura. 22h COMANDOS DEL TERMOSTATO Access TH A1h Lee o escribe el valor de la temperatura del límite superior en el registro TH. Access TL A2h Lee o escribe el valor de la temperatura del límite inferior en el registro TL. Access Config ACh Lee o escribe la palabra de configuración en el registro de control. En escritura, la palabra de control escrita es la siguiente al byte de comando. Tabla 6.2 Comandos del DS1621. 112 El DS1621 realiza la lectura de la temperatura mediante dos bytes (byte superior es la parte entera y el inferior la parte decimal.) en complemento a 2, en éste proyecto solo nos interesa la parte entera. Este dato es transmitido por el bus I2C, siendo primero el bit MSB en el formato que se muestra en la tabla 6.3. El bit mas alto del byte de los enteros indica el signo, siendo igual a " 0 " para temperaturas positivas e igual a " 1 " para temperaturas negativas. Parte Entera MSB 0 0 0 1 1 0 0 LSB 1 Tabla 6.3 Formato de lectura de temperatura (T = 25 °C). El DS1621 cuenta con un registro de control cuyo contenido determina el modo de trabajo del sensor y está en función de los niveles de los bits de la tabla 6.4. Basándose en la tabla 6.4 el sensor DS1621 se configura como se muestra en la tabla 6.5. De manera que la palabra de control que se envía al sensor DS1621 para su inicialización es b‟00000010‟. Al establecer el bit DONE (bit de conversión) igual a 0, DONE=0, se esta indicando que el sensado de la temperatura se encuentra en proceso. Al establecer el bit 1 SHOT (bit de modo de conversión) igual a 0, se esta indicando que el sensor trabajará en modo de conversión continua. Como este registro de control esta implementado en la memoria EEPROM, requiere de aproximadamente 10 ms para que un proceso de escritura se considere completado. Bit 7 DONE DONE THF TLF: NVB: POL: 1 SHOT: X: Registro de control Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 THF TLF NVB X X POL 1 SHOT Bit de conversión. “1”=la conversión a finalizado, “0”=la medición aun esta en proceso. Bandera de la temperatura alta. Es “1” cuando la temperatura sea mayor a TH (este valor se programa en el sensor). THF permanecerá en “1” hasta que se escriba un “0” en esta localidad o hasta que se retire la alimentación del dispositivo. Bandera de la temperatura baja. Es “1” cuando la temperatura sea menor a TL (este valor se programa en el sensor). TLF permanecerá en “1” hasta que se escriba un “0” en esta localidad o hasta que se retire la alimentación del dispositivo. Bandera de memoria ocupada. Es “1” si la escritura de la memora esta en progreso, “0” si la memoria esta libre. Bit de polaridad de salida. "1 " = activo en alto, " 0 " = activo en bajo. Este bit es no volátil. Modo de disparo simple. " 1 " = el sensor comenzara la conversión de temperatura hasta que reciba el comando de inicio de conversión Start Convert T. " 0 " = se realiza la conversión en forma continua de la temperatura. Reservado. Este registro esta implementado en EEPROM, por lo tanto, la escritura del mismo requiere de aproximadamente 10 ms para que se considere completada. Tabla 6.4 Registro de Control. 113 DONE 0 THF 0 TLF 0 NVB 0 X 0 X 0 POL 1 1 SHOT 0 Tabla 6.5 Registro de control configurado de acuerdo a las necesidades del proyecto. 6.2 Programa de configuración y de lectura El PIC16F877A se comunica con el sensor DS1621 a través de su módulo MSSP (Master Synchronous Serial Port), el cual se configura para trabajar en modo I2C. En una comunicación I2C se requiere un dispositivo maestro y un dispositivo esclavo, en este proyecto el PIC se configura como el dispositivo maestro y el DS1621 como el esclavo. La interacción entre el PIC y el DS1621 se efectúa a través de los pines SDA y SCL de cada dispositivo (ver figura 6.3 y 6.4). Estos pines se emplean para transferir datos, donde el pin SCL envía o recibe la señal de reloj y el pin SDA transmite o recibe los datos. Cuando el PIC se configurado como maestro éste genera los pulsos de reloj que permiten sincronizar la recepción o transmisión de bits con el DS1621, usando para tal fin el pin SDA. Figura 6.3 Interacción con el PIC-DS1621. Figura 6.4 Diagrama de conexión PIC-DS1621. Para iniciar la comunicación entre el PIC y el DS1621, el PIC configura al DS1621 a través de la subrutina DS1621_Inicializa. El siguiente proceso que se realiza es la lectura de la temperatura que se registra por el DS1621, esto se logra con la subrutina DS1621_LeeTemperatura. Las subrutinas DS1621_Inicializa y DS1621_LeeTemperatura se ubican en la librería DS1621.inc. A continuación se describen las correspondientes subrutinas. 114 6.2.1 Descripción técnica de la subrutina DS1621_Inicializa DS1621_Inicializa Entradas: Ninguna. Salida: Ninguna. Constantes: DS1621_DIR_ESCRITURA. COMANDO_AccessConfig. DS1621_WordControl. COMANDO_AccessTH. COMANDO_AccessTL TH_Entero. TL_Entero. COMANDO_StartConvert_T Registros: drslave Configura al DS1621 para que trabaje en modo conversión continua, las figuras 6.5, 6.6, 6.7, 6.8, 6.9, 6.10, 6.11 y 6.12 muestran el diagrama de flujo de esta subrutina. Palabra para cargar la dirección del dispositivo esclavo con la opción de escritura (H'90'). Palabra de comando para indicar que el siguiente byte es una palabra de control (H'AC'). Palabra para configurar al DS1621 en modo conversión continúa y polaridad de salida activa en alto (H'02'). Palabra de comando que permite escribir al registro TH (H'A1'). Palabra de comando que permite escribir al registro TL (H'A2'). Palabra para configurar el valor entero de la temperatura superior, 40 °C (H'28'). Palabra para configurar el valor entero de la temperatura inferior, 5 °C (H'05'). Palabra de comando para el inicio de la conversión, (H'EE'). Los registros se encuentran definidos en el Banco 0, a menos que se especifique lo contrario. Registro que almacena el byte de la dirección del esclavo DS1621. 6.2.2 Descripción técnica de la subrutina DS1621_LeeTemperatura DS1621_LeeTemperatura Valor de la temperatura en el registro DS1621_Temperatura. Las figuras 6.13, 6.14, 6.15 y 6.16 muestran el diagrama de flujo de esta subrutina. Entradas: Ninguna. Salida: La temperatura en el registro DS1621_Temperatura. Constantes: DS1621_DIR_ESCRITURA. Palabra para cargar la dirección del dispositivo esclavo con la opción de escritura (H'90'). COMANDO_ReadTemperature. Palabra de comando para iniciar la lectura de la temperatura (H'AA'). DS1621_DIR_LECTURA. Palabra para cargar la dirección del dispositivo esclavo con la opción de lectura (H'91'). Registros: Los registros se encuentran definidos en el Banco 0, a menos que se especifique lo contrario. 115 DS1621_Temperatura. drslave Registro que almacena la parte entera de la temperatura sensada. Registro que almacena el byte de la dirección del esclavo DS1621. Figura 6.5 Diagrama de flujo subrutina DS1621_Inicializa, parte1/8. 116 Figura 6.6 Diagrama de flujo subrutina DS1621_Inicializa, parte2/8. 117 Figura 6.7 Diagrama de flujo subrutina DS1621_Inicializa, parte3/8. 118 Figura 6.8 Diagrama de flujo subrutina DS1621_Inicializa, parte4/8. 119 Figura 6.9 Diagrama de flujo subrutina DS1621_Inicializa, parte5/8. 120 Figura 6.10 Diagrama de flujo subrutina DS1621_Inicializa, parte6/8. 121 Figura 6.11 Diagrama de flujo subrutina DS1621_Inicializa, parte7/8. 122 Figura 6.12 Diagrama de flujo subrutina DS1621_Inicializa, parte8/8. 123 Figura 6.13 Diagrama de flujo de subrutina DS1621_LeeTemperatura, parte 1/4. 124 Figura 6.14 Diagrama de flujo de subrutina DS1621_LeeTemperatura, parte 2/4. 125 Figura 6.15 Diagrama de flujo de subrutina DS1621_LeeTemperatura, parte 3/4. 126 Figura 6.16 Diagrama de flujo de subrutina DS1621_LeeTemperatura, parte 4/4. 127 CAPÍTULO 7. Memoria EEPROM serial 24C02. La memoria EEPROM 24C02, es una memoria de 8 pines que almacena 256 bytes y trabaja con el protocolo de comunicación I2C, en la figura 7.1 se muestra este dispositivo. Sus características principales son: Protección de escritura por hardware. Voltaje de operación de 3V a 5.5V. 1 millón de ciclos de Borrado/Escritura. Retención de Datos mayor a 200 años. Bus con interfaz de dos líneas seriales, compatible con I2C. Integrado de 8 pins. Capacidad de 2 Kbits ó 256 bytes. Señal Vcc Vss SDA SCL A2 A1 A0 WP Figura 7.1 Memoria EEPROM 24C02, circuito integrado. Función Fuente de alimentación. Tierra, GND. Línea de datos del bus I2C. Línea de reloj del bus I2C. Líneas de dirección. Líneas de dirección. Líneas de dirección. Protección contra escritura. Al conectar el pin WP (Write Protection) a GND es posible realizar operaciones de escritura. 7.1 Direccionamiento como esclavo Como cualquier dispositivo compatible con el protocolo o modo I2C, la memoria se activa cuando recibe la dirección válida indicada en la tabla 7.1, el direccionamiento se rige por el byte de control (código del dispositivo (4 bits), dirección del esclavo (3 bits) y el bit (R/W)) que debe enviar el microcontrolador maestro, después de la condición Start . Esta dirección consta de una parte fija y otra programable. La parte programable la define la conexión de los pines A2, Al y A0. código del dispositivo Bit Selección de dispositivo dirección del esclavo R/W b7 b6 b5 b4 b3 b2 b1 b0 1 0 1 0 A2 A1 A0 R/W Tabla 7.1 Dirección de memoria como esclavo en el protocolo I2C. El bit de inicio siempre es seguido por un byte de dirección, la cual consta de cuatro bits con valor 1010 y tres bits que se aplican a la dirección A2, A1 y A0. El último bit determina la dirección en la que se establece la comunicación (R/W) lectura/escritura. En este proyecto se ha seleccionado A2, A1, y A0 conectados a tierra, así que la dirección es b'10100000' para escritura y b'10100001' para lectura. 128 7.2 Escritura en la memoria 24C02 El microcontrolador maestro envía la condición de Start. Se envía el byte de control del dispositivo seleccionado (código del dispositivo (4 bits) dirección del esclavo (3 bits) y con el bit R/W = 0). El maestro envía el byte de dirección. El byte de dirección de 8 bits permite el acceso a una de las 256 localidades de la memoria. Se transmite el dato a escribir. El maestro envía la condición de Stop. Los pasos descritos arriba se muestran en la figura 7.2. Figura 7.2 Escritura en la memoria 24C02. 7.3 Lectura en la memoria 24C02 El microcontrolador maestro envía la condición de Start. El maestro envía la dirección como si fuera a escribir (bit R/W = 0) con el objeto de indicar la dirección a partir de la cual se va a proceder la lectura. El maestro vuelve a enviar la condición de Start, repetición de condición Start. El maestro envía el byte de control en modo lectura (bit R/W = 1). El maestro permite el modo de recepción. El maestro lee el contenido de la memoria. El maestro manda el NACK. El maestro envía la condición de Stop. Los pasos descritos arriba se muestran en la figura 7.3. Figura 7.3 Lectura en la memoria 24C02. 7.4 Descripción técnica de las subrutinas de interacción PIC-Memoria Para iniciar la comunicación entre el PIC y las memorias seriales, el PIC se ayuda de 2 subrutinas implementadas llamadas “writememory” y “readmemory”. La primera subrutina “writememory” se encarga de enviar los datos obtenidos del sensor de temperatura para que sean almacenados en alguna de las memorias seriales, la segunda subrutina “readmemory” se encarga de solicitar los datos que están almacenados en las memorias seriales. Las subrutinas writememory y readmemory se ubican en la librería DS1621.inc y son usadas por el 129 nodo secundario. 130 A continuación se describen las correspondientes subrutinas. 7.4.1 Descripción técnica de la subrutina writememory writememory Entradas: drslave drmemory TEMPE Salida: Escribe un dato en la localidad de la memoria direccionada. Las figuras 7.4, 7.5 y 7.6 muestran el diagrama de flujo de esta subrutina. Byte de control. Dirección de la memoria esclavo, en el intervalo de 0 a 7. Configurada a 0. Byte de dirección. Dirección de la localidad de la memoria, en el intervalo de 00h a FFh. Byte de dato. Dato a guardar en la memoria, en este caso la temperatura del sensor DS1621. Ninguna. 7.4.2 Descripción técnica de la subrutina readmemory readmemory Entradas: drslave drmemory Lee un dato de la localidad de la memoria direccionada. Las figuras 7.7, 7.8, 7.9 y 7.10 muestran el diagrama de flujo de esta subrutina. Byte de control. Dirección de la memoria esclavo, en el intervalo de 0 a 7. Configurada a 0. Byte de dirección. Dirección de la localidad de la memoria, en el intervalo de 00h a FFh. Salida: datomemory Byte de dato. Dato leído de la memoria, en este caso la temperatura del sensor DS1621. 130 Figura 7.4 Diagrama de flujo subrutina writememory, parte 1/3. 131 Figura 7.5 Diagrama de flujo subrutina writememory, parte 2/3. 132 Figura 7.6 Diagrama de flujo subrutina writememory, parte 3/3. 133 Figura 7.7 Diagrama de flujo de subrutina readmemory, parte 1/4. 134 Figura 7.8 Diagrama de flujo de subrutina readmemory, parte 2/4. 135 Figura 7.9 Diagrama de flujo de subrutina readmemory, parte 3/4. 136 Figura 7.10 Diagrama de flujo de subrutina readmemory, parte 4/4. 137 En la figura 7.11 se muestra el diagrama físico de conexiones de las cuatro memorias seriales implementadas en el nodo-S mediante un BUS I2C: Figura 7.11 Diagrama físico de conexiones entre el PIC de Protocolo del nodo-S y las memorias seriales 24C02. 138 CAPÍTULO 8. Comunicación serial UART. En el capítulo uno se estableció que el sistema de control de los nodos (nodo-P y nodo-S) está constituido por dos microcontroladores, el PIC de Protocolo y el PIC de Enlace, donde la interacción entre ellos se realiza utilizando una comunicación serial mediante el módulo UART, que está implementado físicamente en cada uno de los microcontroladores PIC. También se indicó que, en particular, el PIC de Protocolo del nodo-P se comunica con la PC utilizando esta misma comunicación serial, por consiguiente se vio la necesidad de implementar un algoritmo que permitiera generar la señalización de la comunicación con la norma RS232. A continuación se describe este algoritmo. 8.1 Descripción técnica de la subrutina envia envia Rutina encargada de enviar los datos hacia la computadora en modo serial. Comunicación asíncrona RS232. El microcontrolador manda el dato por la línea de salida comenzando por el bit menos significativo. El dato enviado será el que llegue a través del registro de trabajo, W. Entrada: W Contiene el dato que se desea enviar a la PC. Salida: Ninguna. Subrutinas empleadas retseri: Rutina que genera un retardo de 97 us para la duración del tiempo de bit. Variables utilizadas TxDt Byte que se desea enviar mediante la norma RS232. cntseri Número de bits que se desean enviar, para este caso 8. tmpseia Almacena “31” decimal para generar un retardo de 97 microsegundos dentro de la subrutina retseri. Constantes: Vtmpser equ D‟31‟ Valor para generar un retardo microsegundos. de tiempo de espera de 97 En la figura 8.1 se presenta el diagrama de flujo correspondiente a la subrutina envía y retseri. 139 Figura 8.1 Diagrama de flujo subrutina envía y retseri. 8.2 Descripción técnica de la subrutina RS23Ini La subrutina RS23Ini es la encargada de inicializar los puertos para la comunicación serial RS-232, para transmitir datos a la PC, la implementación de este protocolo de comunicación serial es desarrollado por software, ya que el PIC de Protocolo del nodo-P sólo cuenta con un módulo UART. Entrada: Ninguna. Salida: Ninguna. Subrutinas empleadas: Ninguna. 140 Definiciones: #DEFINE RXport PORTD, 3 #DEFINE RXtris TRISD, 3 #DEFINE TXport PORTD, 4 #DEFINE TXtris TRISD, 4 Puerto de entrada RS232. Puerto de entrada RS232. Puerto de salida RS232. Puerto de salida RS232. En la figura 8.2 se presenta el diagrama de flujo correspondiente a la subrutina RS23Ini. Figura 8.2 Diagrama de flujo IniUART PIC de Enlace nodo-P y nodo-S. 8.3 Descripción técnica de las subrutinas IniUART De las cuatro subrutinas de inicialización de la UART, dos de ellas, las de los PIC de Enlace, inicializan de igual manera la UART, las otras dos restantes difieren entre si, sólo en que una habilita la interrupción por recepción y la otra habilita la interrupción por transmisión. Además las subrutinas IniUART de los PIC de Enlace trabajan con un cristal de 16MHz y la de los PIC de Protocolo con uno de 4 MHz; por lo que el contenido del registro SPBRG es distinto, ya que el valor de este registro es utilizado para generar la frecuencia en baudios (bits por segundo) que en este proyecto es de 9600 bps, observando la tabla 8.1, para una Fosc = 16 MHz el valor en decimal del registro SPBRG debe ser de 103 y para una Fosc = 4 MHz el valor en decimal del registro SPBRG debe ser de 25. 140 Tabla 8.1 Valores decimales para generar el Baud Rate modo asíncrono. Configuración de registros involucrados en la UART, modo asíncrono. En las figuras 8.3 y 8.4 se muestran estos registros. Configuración del registro RCSTA. Figura 8.3 Registro RCSTA y sus bits. 141 Configuración del registro TXSTA. Figura 8.4 Registro TXSTA y sus bits. La subrutina IniUART es la encargada de inicializar la UART en modo asíncrono para transmitir y recibir datos entre los PIC‟s de cada nodo. En las figuras 8.5, 8.6 y 8.7 se presentan los diagramas de flujo correspondientes a las subrutinas IniUART. Figura 8.5 Diagrama de flujo IniUART PIC de Enlace nodo-P y nodo-S. Figura 8.6 Diagrama de flujo IniUART PIC de Protocolo nodo-P. 142 Figura 8.7 Diagrama de flujo IniUART PIC de Protocolo nodo-S. 143 CAPÍTULO 9. Protocolo de capa física: KeeLoq. En éste capítulo se da una descripción del protocolo de la capa física que permite la comunicación entre los nodos mediante una conexión inalámbrica en la banda de RF. Se puede decir que este protocolo está compuesto a su vez de dos protocolos, el protocolo KeeLoq y el protocolo PIUAMI, uno montado sobre el otro (P1UAMI montado sobre KeeLoq). El protocolo P1UAMI se utiliza para brindar una codificación particular de la trama, personalizando de ésta forma al proyecto realizado. Primero se describe el protocolo P1UAMI, debido a que las particularidades que brinda repercuten directamente sobre el protocolo KeeLoq; después se detallará el protocolo KeeLoq, describiendo la conformación de los niveles de señalización y los criterios de detección en la validación de la trama a nivel del protocolo. Las últimas dos secciones del capítulo exponen a los algoritmos utilizados, uno para la generación de la trama para la transmisión y otro para la decodificación de tramas en la recepción, respectivamente. En ambos casos se realiza una descripción técnica con ayuda de diagramas de flujo (los algoritmos generados en el programa son: TRANSMITIR y RECIBIR). 9.1 Protocolo P1UAMI Este protocolo fue implementado con el objetivo de brindar una mayor confiabilidad en la detección por RF, ya que el protocolo KeeLoq es muy utilizado, y este hecho podría ocasionar interferencia en la comunicación entre los nodos de la red, provocando errores. El protocolo P1UAMI, como se indicó con anterioridad, está montado en el Protocolo KeeLoq y establece que el paquete de datos a transmitir consta de los siguientes elementos: Bytes de Preámbulo Inicial. Bytes de Datos del Buffer. Bytes de Preámbulo Final. Los bytes de preámbulo inicial y preámbulo final, son la etiqueta inicial y final de la trama, respectivamente, y toman sólo dos valores, los 2 bytes de preámbulo inicial son iguales a los 2 bytes de preámbulo final, y estos son establecidos por el diseñador de dicha red (en este proyecto los valores para los bytes de preámbulo son: PREAMB1 = AAh y PREAMB2 = 55h), el envío de los bytes de preámbulo se realiza alternando éstos dos valores, y son colocados antes de los bytes que transmiten datos (bytes de información que desea ser comunicada dentro de la red) y al final de la trama. El valor de estos dos bytes es igual en todos los nodos que conforman la red (nodo primario y nodos secundarios), éste detalle es el que brinda particularidad a la red desarrollada en éste proyecto. La peculiaridad de éste protocolo es que permite fijar cualquier valor como el número de bytes de preámbulo inicial y final, es decir de longitud variable, sin alterar la funcionalidad en la recepción. Sin embargo, una vez fijo para transmisión en cada nodo de la red, siempre se enviarán el mismo 144 número de bytes de preámbulo (el número de bytes es fijado por el diseñador de la red). La flexibilidad en la longitud de bytes de preámbulo inicial y final, se puede observar cuando actúa algún nodo en modo receptor, el nodo espera recibir al menos 2 bytes de preámbulo, de ser más, sólo verifica que se cumpla la alternancia de los dos bytes elegidos como bytes de preámbulo para la red (PREAMB1 y PREAMB2), dejando a un lado cuantos bytes de preámbulo se reciban; cuando ya no se cumpla la condición de alternancia significará que ha comenzado a recibir datos. En la figura 9.1 se muestra como está constituido el paquete de datos que se transmite por RF. Figura 9.1 Partes que conforman el paquete de datos del protocolo P1UAMI. El mínimo de bytes de los preámbulos inicial y final que se deben enviar es de dos, ya que de lo contrario el receptor no detectara el formato de la trama como válido. Se recomienda enviar muy pocos bytes de preámbulo inicial y final para maximizar los tiempos de intercambio de datos entre los nodos. En este proyecto se envía el mínimo permitido, es decir, dos bytes de preámbulo inicial y dos bytes de preámbulo de final. 9.2 Protocolo KeeLoq El protocolo KeeLoq establece que la trama de datos está compuesta por los pulsos de preámbulo, el Header, los pulsos de datos codificados y el Guarda. En la figura 9.2 se muestra como está configurada la trama de datos. Figura 9.2 Configuración de la trama de datos del protocolo KeeLoq. Pulsos de Preámbulo: Es el inicio de la transmisión y se compone de un conjunto de pulsos. El número mínimo es de 1 (01h) y el máximo es de 255 (FFh). Los pulsos de preámbulo se componen por un pulso alto y uno bajo, el ancho del pulso alto es igual al ancho del pulso bajo, tienen una duración de una unidad de tiempo elemental, denominada Te, en este proyecto Te es de 200us. En la figura 9.3 se muestra la sección de los pulsos de preámbulo. En el programa diseñado el número de pulsos se establece mediante el valor asignado al registro PULSPREA. 145 Header: Figura 9.3 Pulsos de Preámbulo del protocolo KeeLoq. Es un nivel bajo de duración de 10 veces el ancho de pulso Te, por ejemplo, en la red construida en este proyecto la duración de Header es 2ms para un ancho de pulso de 200us, ver Figura 9.4. El tiempo de Header es fundamental para la calibración de la velocidad de transmisión en el receptor. Figura 9.4 Header del protocolo keeloq. Pulsos de Datos Codificados: Es el conjunto de pulsos que contiene los bits de información a transmitir, aquí se encuentra desarrollado el protocolo P1UAMI (ver sección 9.1). El envío ó codificación de cada bit de dato consta de tres partes: bit 1/3, bit 2/3 y bit 3/3, cada uno tiene una duración Te, como se muestra en la figura 9.5. La asignación para cada uno de los bits que conforma un bit de dato codificado es la siguiente: Figura 9.5 Bit de Dato Codificado del protocolo KeeLoq. Bit 1/3: es el bit de encendido ó bit ON, es un pulso alto. Bit 2/3: es el bit dato, es un pulso alto o bajo que depende del valor que tiene el bit del dato de información, como se muestra en la figura 9.6. Si el bit vale 0, la señal enviada es un pulso alto. Si el bit vale 1, la señal enviada es un pulso bajo. Bit 3/3: es el bit de apagado ó bit OFF, es un pulso bajo. 146 Figura 9.6 Valor del bit 2/3 dependiendo del valor del bit de dato. Con este tipo de codificación, para el envío de información, por cada byte de datos se transmiten 24 pulsos (1 byte tiene 8 bits, así que 8 bits x 3 pulsos/bit = 24 pulsos). El bit menos significativo (LSB), el bit 0, es el primer bit del byte de dato en ser transmitido y el ultimo bit es el bit 7, es decir el bit más significativo (MSB). En la figura 9.7 se muestra el orden de transmisión de los bits para un byte de dato. Figura 9.7-a Codificación y transmisión de un byte de datos. Figura 9.7-b Codificación y transmisión de un byte de datos. Guarda: Es un pulso bajo de duración mayor a la del Header, sirve para indicar el final de la trama y por lo tanto permite separar una trama de otra cuando se envía una ráfaga (varias tramas juntas). El tiempo de Guarda utilizado en este proyecto es de 3ms para un Te de 200us, ver Figura 9.8 (tiempo de Header de 2ms, ver figura 9.4). Figura 9.8 Tiempo de Guarda de la Trama en el protocolo Keeloq. 147 Criterios en la detección: Los puntos de muestreo para la detección de tramas en protocolo KeeLoq se muestran en la figura 9.9, en ésta se observa que la primer muestra es tomada en un tiempo Te/2 después de ser detectado un flanco de subida, y las siguientes muestras son tomadas cada intervalo de tiempo Te subsecuente a la última muestra, de esta forma el protocolo permite cierto error en el tamaño de los bits. Además se cuenta con un tiempo de tolerancia para la detección de Header, el cual es de ±30% del valor del Header. Figura 9.9 Muestreo de bits en el protocolo Keeloq. 9.3 Generación de tramas en protocolo KeeLoq La conformación de la señalización o los niveles de voltaje de la señal para generar la trama basado en el protocolo KeeLoq (se ha supuesto que éste tiene montado lo que se ha llamado el protocolo P1UAMI) es generada por el PIC de Enlace y para ello se consideran todas las especificaciones establecidas con anterioridad. Sin embargo, por conveniencia en esta sección se mencionan las más importantes. El algoritmo implementado en este proyecto para la generación de la señalización para el protocolo KeeLoq es la subrutina TRANSMITIR y a continuación se da una descripción de ésta. 9.3.1 Descripción técnica de la subrutina TRANSMITIR En ésta sección se da una descripción técnica de la subrutina TRANSMITIR, los registros y constantes presentes, para posteriormente presentar el algoritmo mediante diagramas de flujo. Ésta subrutina utiliza variables o registros que deben ser previamente definidos con un valor particular, tales como el referente al número de pulsos de preámbulo para el protocolo KeeLoq (PULSPREA), el número de bytes de preámbulo inicial y final planteado por el protocolo P1UAMI (NPREAMI y NPREAMF) y los valores que son usados como bytes de preámbulo para la red y que se van alternando (PREAMB1 y PREAMB2). Además, los datos de información a transmitir deben encontrarse almacenados previamente en el buffer de transmisión del PIC de Enlace (que son recibidos del PIC de Protocolo), ver capítulo 1. El PIC de Enlace utiliza la terminal llamada DIO (ó Tx, terminal del puerto C, bit 1) para conectarse físicamente a la entrada de datos del módulo CC1000. 148 El algoritmo de la subrutina TRANSMITIR comienza con el envío de los N pulsos de preámbulos indicados por el registro PULSPREA, con N pulsos altos y N-1 pulsos bajos, la ultima transición al estado bajo se toma como parte del Header, ver figura 9.10. El ancho de los pulsos es de duración Te igual a 200µs, se utiliza un loop de 4 instrucciones que tardan 1us en ejecutarse (4 x Tcyc = 4 x 250ns = 1µs), el loop se repite 200 veces para lograr el tiempo de 200µs (el PIC de Enlace se encuentra operando a una frecuencia de 16MHz). A la constante de 200 se le define como _TE. Figura 9.10 Pulsos de Preámbulo. Terminado de enviar el último pulso alto de preámbulo se transmite el Header, durante un tiempo de 10Te, es decir de 2ms, que corresponde a un nivel bajo, el cual sirve al receptor para calibrar la velocidad de transmisión. Para contabilizar el tiempo de Header se utiliza un loop de 20 instrucciones que se repite 200 veces (a la constante de 200 se le denomina _HEADER), y esto se repite dos veces para obtener 2ms, a continuación se muestra el cálculo: tHeader = (20 x Tcyc x _HEADER) x 2 = (20 x 250ns x 200) x 2 = 2ms. Al mismo tiempo a la generación del Header se inicializan los registros: CNTBIT y CNTAUX1. El primero es el contador de bits por byte de información transmitido, cada que se va a transmitir un byte el registro se inicializa a “0”. El segundo es un contador auxiliar y se inicializa con el valor contenido en el registro NPREAMI, el cual indica el número de bytes de preámbulo inicial a transmitir, el valor del nivel del bit 0 de éste contador se utiliza como referencia para cargar en el buffer auxiliar el valor contenido en el registro PREAMB1 (cuando el bit 0 vale 0) ó el valor de PREAMB2 (cuando el bit 0 vale 1), ver figura 9.11. Figura 9.11 Elección del valor del byte de preámbulo a transmitir. Después de enviar el tiempo de Header se transmite un pulso alto, que corresponde al bit 1/3 (bit ON) del primer bit de información a transmitir. La duración de este pulso se logra con un loop similar al empleado para los pulsos de preámbulo. Una vez transcurrido el tiempo requerido (el contador de loop llega a cero), se transmite el bit 2/3 (bit DATO) el cual corresponde al bit 149 almacenado en la posición 0 del buffer auxiliar, de manera que: si el bit 0 del buffer auxiliar vale 0, se transmite un pulso alto y si el bit 0 vale 1 se transmite un pulso bajo, ver figura 9.12, la duración del pulso se obtiene con un loop, al igual que en el pulso de preámbulo, pero con un ajuste debido a las instrucciones que son utilizadas. Mientras transcurre el tiempo del pulso, se ejecutan instrucciones para preparar el siguiente bit de información a transmitir, al realizar un corrimiento a la derecha sobre el buffer auxiliar, ver figura 9.13, y se incrementa el contador de bits CNTBIT. Figura 9.12 Transmisión del bit DATO. Figura 9.13 Posicionamiento del próximo bit a transmitir. Si el contador de bits (CNTBIT) no llega a 8, aún no se han transmitido los 8 bits, por lo que espera a que termine el tiempo del pulso, y comienza la transmisión del bit 3/3 (bit OFF), el cual es un pulso bajo que tiene una duración de Te; durante el envío de este pulso se evalúa el estado de la bandera FFIN del registro FLAGSRF, la bandera indica el estado de la transmisión de bytes en la trama. Si la bandera esta levantada se procede a enviar el tiempo de Guarda, ya que se ha completado el envío de todos los bytes, es decir, se han enviado los bytes de preámbulo inicial, los bytes de datos y los bytes de preámbulo final. Si la bandera esta abajo entonces se espera a que termine el tiempo del pulso para volver a enviar un nuevo bit 1/3, proceso que se repite hasta enviar la totalidad de los bytes de la trama. Si el contador de bits (CNTBIT) llega a 8 se decrementa en uno el contador de bytes (CNTAUX1), se analiza si ya se terminaron de enviar todos los bytes del mismo tipo, es decir si se terminaron de enviar los bytes de preámbulo inicial ó los bytes de datos ó los bytes de preámbulo final. Si el contador de bytes aún no llega a cero continua enviando el mismo tipo de byte, es decir si se estaba transmitiendo bytes de preámbulo, se almacena en el buffer auxiliar el valor del registro PREAMB1 ó PREAMB2 determinado por el valor del bit 0 del contador del bytes (con la misma filosofía del inicio de la subrutina). Si se transmiten bytes de datos se almacena en el buffer auxiliar el valor contenido en la siguiente localidad del buffer de transmisión (la asignación se realiza por medio de direccionamiento indirecto). Terminada estas instrucciones espera la terminación del tiempo del pulso del bit 2/3 para enviar el bit 3/3. 150 El direccionamiento indirecto se realiza de la siguiente manera: Para apuntar a una localidad de memoria se coloca en el registro FSR la dirección deseada y se pone a 0 ó a 1 el bit IRP del registro STATUS dependiendo del banco en donde se encuentre ubicada esta localidad de memoria (el bit IRP es 0 para las localidades de memoria que se ubiquen en el banco 0 ó 1, y es 1 para las que se ubiquen en el banco 2 ó 3). Para leer ó modificar el valor que está contenido en esta localidad de memoria se hace uso del registro INDF, todas las operaciones que se realicen sobre este registro afectara al valor contenido en la dirección a la que apunta el registro FSR. Para pasar un valor almacenado en el buffer de transmisión al buffer auxiliar (BUFFAUX) utilizando el direccionamiento indirecto se realiza lo siguiente: Se pone a 1 el bit IRP (recuerde que el buffer de transmisión esta en el banco 2), luego se apunta al inicio del buffer al colocar en el registro FSR el valor de 10h (este valor está definido como la constante BUFFERT) y se le suma, al valor del registro FSR, el valor del índice del buffer que se desea acceder (un valor entre 0 a 95), luego el contenido del registro direccionado por FSR se transfiere al buffer auxiliar, utilizando el registro INDF. Ver figura 9.14. Figura 9.14 Direccionamiento indirecto al buffer de transmisión. Si el contador de bytes CNTAUX1 está en cero, entonces es necesario realizar el cambio de dato, por ejemplo si se está transmitiendo los bytes de preámbulo inicial, se comenzara a enviar los bytes de datos del buffer de transmisión; si se está transmitiendo bytes de datos se cambia a transmitir bytes de preámbulo final y si se está transmitiendo bytes de preámbulo final entonces se activa la bandera FFIN para indicar que éste fue el último byte a transmitir y se está transmitiendo el último bit, faltando solamente el bit 3/3. Si se están transmitiendo bytes de preámbulo inicial, para cambiar a transmitir bytes de datos se procede de la siguiente forma: Se accede a la localidad 2 del buffer de transmisión, que corresponde al dato NUMDAT, que contiene el número de datos que se van a transmitir (recuerde que este valor no contabiliza al dato D0 ni al dato NUMDAT). El valor de NUMDAT se almacena en el contador de bytes y se le suma el valor de dos para incluir en el conteo a D0 y a NUMDAT. Se direcciona la primera localidad del buffer de transmisión y el valor almacenado ahí se copia al buffer auxiliar, utilizando el direccionamiento indirecto, luego se procede a esperar el termino del tiempo del bit 2/3 para enviar el bit 3/3. 151 Si se está transmitiendo bytes de datos, para conmutar y empezar a transmitir bytes de preámbulo final, se hace lo siguiente: El contador de bytes se inicializa con el valor que contiene el registro NPREAMF. Dependiendo del valor del bit 0 del contador de bytes, se almacena en el buffer auxiliar el valor del registro PREAMB1 (si el bit 0 del contador de bytes vale 0) ó el valor del registro PREAMB2 (si el bit 0 del contador de bytes vale 1). Se espera a la terminación del tiempo del pulso del bit 2/3, para transmitir el bit 3/3. Una vez que se ha enviado el ultimo bit 3/3 del último byte de preámbulo final, se manda a transmitir el tiempo de Guarda que mantiene a la terminal DIO en estado bajo durante un tiempo aproximadamente de 3ms, el TIMER auxilia en el proceso de generación del tiempo de GUARDA, y posteriormente se finaliza la subrutina TRANSMITIR. La subrutina TRANSMITIR transmite como máximo 100 bytes (para una trama válida), que se distribuyen de la siguiente manera: 2 bytes de preámbulo inicial, 96 bytes de datos y 2 bytes de preámbulo final. El mínimo de bytes de una trama (para que se considere válida) es de 7 bytes, que se distribuyen de la siguiente forma: 2 bytes de preámbulo inicial, 3 bytes de datos y 2 bytes de preámbulo final. 9.3.2 Descripción con diagramas de flujo de la subrutina TRANSMITIR Subrutina: TRANSMITIR Esta subrutina envía una trama de datos por el pin DIO, envía un mínimo de 3 bytes de datos (DESTINATARIO, NUMDAT Y REMITENTE) y un máximo de 96 bytes (D0, NUMDAT, D1, D2,..., D94) almacenados en el Buffer de transmisión, BUFFERT. Configuración: PULSPREA Número de pulsos de preámbulo del protocolo KeeLoq. NPREAMI Número de bytes del preámbulo inicial del protocolo P1UAMI. NPREAMF Número de bytes del preámbulo final del protocolo P1UAMI. PREAMB1 Valor del primer byte del preámbulo del protocolo P1UAMI. PREAMB2 Valor del segundo byte del preámbulo del protocolo P1UAMI. Entrada: Salida: BUFFERT [0...95] Datos de 1 byte que se van a transmitir por RF, desde 3 hasta 96 datos, BUFFERT [0], BUFFERT [1] y BUFFERT [2] obligatorios. Ninguna. Definiciones: #define DIO PORTC, 1 Pin configurado como entrada y salida digital, recibe o proporciona el estado (Alto/Bajo) que presenta el módulo de RF CC1000. Constantes: _TE equ .200 Constante que se emplea en algunos loops para establecer el ancho del pulso Te. Te = _TE x 4 x Tcyc 152 _HEADER equ .200 _GUARDA equ .47 Te = 200 x 4 x 250ns = 200us. Constante que se emplea para llevar a cabo el tiempo de Header. T_header = 10Te = 10 x 200us = 2ms. 10Te = (_HEADER x 20 x Tcyc) x 2 = (200 x 20 x 250ns) x 2 = 2ms. Constante que se emplea para llevar a cabo el tiempo de Guarda de 3ms, usando el Timer 0. T_Guarda = _GUARDA x PRESCALER x Tcyc T_Guarda = 47 x 256 x 250ns = 3ms Registros: Los registros se encuentran dentro del banco 0, a menos que se especifique otro banco. PULSPREA NPREAMBI NPREAMBF PREAMB1 PREAMB2 CNTAUX1 CNTAUX2 CNTLOOP CNTBIT BUFFAUX FLAGSRF BUFFERT Registro que almacena el número de pulsos altos de preámbulo que se envían al inicio de cada trama de datos. Registro que almacena el número de bytes de preámbulo inicial. Registro que almacena el número de bytes de preámbulo final. Registro que contiene el valor del byte de Preámbulo 1, también es utilizado por la subrutina RECIBIR. Registro que contiene el valor del byte de Preámbulo 2, también es utilizado por la subrutina RECIBIR. Contador auxiliar 1: Registro de usos múltiples para las subrutinas TRANSMITIR; en la subrutina RECIBIR es la parte baja del contador de 16 bits para el conteo del tiempo del Header. Contador auxiliar 2: registro de usos múltiples para las subrutinas TRANSMITIR, en la subrutina RECIBIR es la parte alta del contador de 16 bits para el conteo del Header. Contador de loops: registro contador para los loops, también es utilizado por la subrutina RECIBIR. Contador de bits: registro que lleva la cuenta de los bits del byte que se transmiten ó reciben en las subrutinas TRANSMITIR y RECIBIR, respectivamente. Buffer auxiliar: registro que almacena el byte actual que se transmite o se recibe en las subrutinas TRANSMITIR y RECIBIR, respectivamente. Registro de banderas de RF, también es utilizado por la subrutina RECIBIR. Buffer de Transmisión: se encuentra en el banco 2, marca la primera localidad del buffer. Se utiliza en las subrutinas TRANSMITIR y RECIBIR y queda disponible para las demás subrutinas, se accede por medio del direccionamiento indirecto. La longitud del buffer es de 96 bytes, es decir, abarca de la localidad de memoria 10h (LSB) hasta la localidad 6Fh (MSB). Bits del Registro FLAGSRF: FFIN equ 1 FPREA equ 2 Bandera que indica, cuando vale 1, que ya se han enviado todos los bytes de datos y de preámbulo. Bandera que indica, cuando vale 1, que se han transmitido todos los bytes del preámbulo inicial en la subrutina TRANSMITIR. Y bandera que indica el valor 153 del byte del preámbulo esperado en la subrutina RECIBIR. FDATO equ 3 Bandera que indica el tipo de byte que se está transmitiendo en la subrutina TRANSMITIR. 0 para bytes de preámbulo y 1 para bytes de datos. Y bandera que indica que tipo de byte se espera recibir en la subrutina RECIBIR. 0 para byte de preámbulo y 1 para byte de datos. En las figuras 9.15, 9.16, 9.17, 9.18, 9.19, 9.20, 9.21, 9.22, 9.23, 9.24 y 9.25 se presentan los diagramas de flujo correspondiente a la subrutina TRANSMITIR. 154 Figura 9.15 Diagrama de flujo subrutina TRANSMITIR, parte 1/11. 155 Figura 9.16 Diagrama de flujo subrutina TRANSMITIR, parte 2/11. 156 Figura 9.17 Diagrama de flujo subrutina TRANSMITIR, parte 3/11. 157 Figura 9.18 Diagrama de flujo subrutina TRANSMITIR, parte 4/11. Figura 9.19 Diagrama de flujo subrutina TRANSMITIR, parte 5/11. 158 Figura 9.20 Diagrama de flujo subrutina TRANSMITIR, parte 6/11. 159 Figura 9.21 Diagrama de flujo subrutina TRANSMITIR, parte 7/11. 160 Figura 9.22 Diagrama de flujo subrutina TRANSMITIR, parte 8/11. 161 Figura 9.23 Diagrama de flujo subrutina TRANSMITIR, parte 9/11. 162 Figura 9.24 Diagrama de flujo subrutina TRANSMITIR, parte 10/11. 163 Figura 9.25 Diagrama de flujo subrutina TRANSMITIR, parte 11/11. 9.4 Detección de tramas en protocolo Keeloq Existe el proceso de recepción en el nodo primario y en el nodo secundario. En el nodo primario la recepción es continua ya que debe estar al pendiente de la información entregada por parte del nodo secundario, para después dar un reporte de esta información al usuario mediante la PC para su futuro procesamiento. En el nodo secundario existe sólo un periodo de recepción, éste es post-transmisión (esto en cada ciclo de transmisión) y se encuentra limitado en tiempo, en éste periodo se espera recibir el acuse enviado por el nodo primario, lo cual es un aviso de que la trama que previamente se envío ha llegado con éxito, de no recibir el correspondiente acuse se tendrá que efectuar una nueva transmisión. 9.4.1 Descripción técnica de la subrutina RECIBIR En ésta sección se da una descripción técnica de la subrutina RECIBIR, los registros y constantes, para posteriormente presentar el algoritmo mediante diagramas de flujo. 164 La recepción de un paquete de datos se realiza por medio de la subrutina RECIBIR. Antes de invocar a la subrutina por primera vez se tienen que asignar valores a los registros PREAMB1 y PREAMB2, estos registros contienen el valor de los bytes de preámbulo del protocolo P1UAMI y deben tener el mismo valor que los de la subrutina TRANSMITIR, en este proyecto los valores que toman son: 55h y AAh. La salida del dato en el módulo de Recepción de RF está conectada a la terminal DIO definida en el PIC de Enlace, ver capítulo 1. La subrutina RECIBIR comienza con la inicialización del perro guardián para evitar el reset por desbordamiento del Timer, si es que esta activado, después se realiza la búsqueda del Header, para ello se evalúa el nivel de la terminal DIO (ó RX, en éste caso), si se encuentra en un nivel bajo termina la subrutina y regresa los indicadores de trama no válida. Si el nivel en DIO es alto se busca el flanco de bajada durante un tiempo máximo de 3ms (tiempo de tolerancia), si durante el transcurso de este tiempo no se encontró el flanco de bajada la subrutina termina y regresa los indicadores de trama no válida. Si el flanco de bajada se encuentra antes de la terminación del tiempo de tolerancia se comienza el conteo del tiempo de Header, como se muestra en la figura 9.26. En el momento que es detectado el flanco de bajada comienza el conteo del tiempo de Header. Se termina el conteo cuando la entrada DIO pasa del estado bajo al estado alto (flanco de subida) o cuando el tiempo de Header alcanza el tiempo máximo que es: Header + 30%. Si se alcanza el tiempo máximo de Header la subrutina termina y regresa formato no válido; si se encuentra el flanco de subida se compara el tiempo registrado con el tiempo mínimo de Header que es: Header – 30%; si el tiempo registrado es mayor o igual al tiempo mínimo continua con la subrutina, de lo contrario finaliza la subrutina y regresa formato no válido, como se muestra en la figura 9.27. Figura 9.26 Búsqueda del inicio del Header. 165 Figura 9.27 Búsqueda del fin del Header. Si el tiempo registrado esta dentro de la tolerancia permitida (Header ± 30%), entonces se ha conseguido calibrar la velocidad de transmisión, es decir, la duración del ancho de los pulsos de los datos reales. Una vez que se cuenta con un Header válido, se inicializa a cero el contador de bits (CNTBIT) y se bajan todas las banderas del registro de FLAGSRF. Desde el momento en que se ha encontrado el flanco de subida indicador del fin del Header, se espera un tiempo de Te/2 para leer la entrada DIO, esto se hace para tomar la muestra a la mitad del pulso. El valor que se debe registrar en la entrada DIO es un estado alto, ya que se trata del bit 1/3 “ON”, el cual siempre es un pulso alto; si el estado de la entrada DIO no corresponde al valor esperado entonces se termina la subrutina y se envían los indicadores de formato de trama no válida. Si la muestra es un nivel alto, entonces la siguiente muestra se tomara después de un intervalo de tiempo Te, muestreando a la mitad del pulso del bit 2/3 que corresponde al bit “DATO”; si el estado leído en la entrada DIO es un estado alto se introduce un 0 ó si el estado es bajo se introduce un 1 en el bit más significativo (MSB) del buffer auxiliar (BUFFAUX), recorriendo los bits una posición a la derecha y desechando el bit menos significativo (LSB), porque es “basura”. El contador de bits se incrementa en uno. Desde la última lectura en la entrada DIO debe transcurrir un tiempo de Te para tomar la siguiente muestra a la mitad del bit 3/3 “OFF”. El valor que debe ser registrado en DIO es un estado bajo, si no coincide con este valor termina la subrutina y se regresan los indicadores de formato de trama no válida, si el valor muestreado es un nivel bajo se continua con el algoritmo y se dispone con un tiempo de Te/2 para hacer diversas operaciones de validación del bit, antes de que aparezca el siguiente bit 1/3. Las operaciones de validación están dirigidas dependiendo si se está recibiendo un bit que forma parte de bytes de preámbulo o bytes de datos. La recepción del siguiente bit 1/3 permite sincronizar de nuevo la señal, ya que se sincroniza con el flanco de subida que se encuentra entre el bit 3/3 anterior y el bit 1/3 que se espera recibir, como se muestra en la figura 9.28. 166 Al inicio del intervalo de sincronización, se encuentran las instrucciones que deberán validar el bit recibido así como las condiciones que deberán cumplirse para que la trama de datos sea dada como válida. Cada vez que se recibe un bit DATO (bit 2/3) se incrementa en uno el contador de bit, después de que el bit 3/3 resulto válido (un bit OFF) se verifica si el contador de bits llego a 8, en caso de que aún no llegue se continua con la búsqueda del siguiente bit; si el contador de bits ya llego a 8 entonces el byte almacenado en el buffer auxiliar debe ser distinguido entre byte de preámbulo o byte de datos. Si se recibe un byte y el anterior byte recibido fue de preámbulo, entonces se verifica si el valor del byte recibido coincide con uno de los dos valores preestablecidos para bytes de preámbulo, de ser así, se compara con el byte de preámbulo anterior, ya que estos bytes deben venir alternados y se deben recibir por lo menos una pareja de estos bytes, si no cumple con alguna de estas restricciones la trama se da como no válida, y todos los bytes de preámbulo se desechan. Figura 9.28 Muestreo del la terminal DIO. Si el byte recibido no concuerda con alguno de los dos valores de preámbulo inicial establecido y ya se han recibido por lo menos una pareja de bytes de preámbulo, entonces el byte que se encuentra en el buffer auxiliar (BUFFAUX) es considerado el primer byte de datos, D0, y se debe guardar en la primera posición del buffer de recepción (BUFFERR[0]), el siguiente byte que se reciba, NUMDAT, contiene el número de bytes de datos que se van a recibir y se guarda en la siguiente posición del buffer de recepción (BUFFERR[1]); con este último byte recibido se inicializa el registro CNTAUX2, para llevar a cabo un conteo de los siguientes datos a recibir. El número debe ser menor o igual a 90 y mayor a 1, si no es así la subrutina termina y regresa trama no válida. Los siguiente bytes que se reciban corresponden a los datos propios de la trama, D1 hasta D ≤ 90, ver capítulo 1, y son almacenados consecutivamente en el buffer de recepción, hasta que el contador de bytes llegue a cero. Una vez que se han recibido todos los bytes de datos, el siguiente byte que llega pertenece al preámbulo final, por lo que debe ser comparado con alguno de los dos valores de preámbulo (son 167 los mismos valores que los del preámbulo inicial). Si no coincide sale de la subrutina y regresa formato no válido, en caso de que sea alguno de los dos valores de preámbulo ya solo se recibe un byte más, ya que en este proyecto sólo es necesario la validación de 2 bytes de preámbulo final. El byte recibido debe ser un byte de preámbulo diferente al recibido anteriormente, de ser así, se termina la subrutina y se regresa los indicadores de trama válida, es decir se regresa un 0 en el registro W y se baja la bandera de FRX del registro FLAGSRF, en caso de que el byte no sea el esperado, se termina la subrutina y se regresa los indicadores de trama no válida, valor uno en W y se levanta la bandera de FRX. La subrutina RECIBIR da como válida una trama de datos si se detectan por lo menos una pareja de bytes de preámbulo inicial, de 3 a 92 (como máximo) bytes de datos y una pareja de bytes de preámbulo final. 9.4.2 Descripción técnica con diagramas de flujo de la subrutina RECIBIR RECIBIR: Esta subrutina recibe una trama de datos con el protocolo P1UAMI, los datos los almacena en el buffer de recepción, BUFFERR, Devuelve 0 en el bit FRX del registro FLAGSRF al recibir una trama válida y 1 si no es válida. Configuración: PREAMB1 Valor del primer byte del preámbulo del protocolo P1UAMI. PREAMB2 Valor del segundo byte del preámbulo del protocolo P1UAMI. Entrada: Ninguna. Salida: W FRX BUFFERR [0...95] 0 para recepción válida, 1 para recepción inválida. 0 para recepción válida, 1 para recepción inválida. Arreglo que almacena hasta 96 bytes. Definiciones: #define DIO PORTC, 1 ver sección 9.3.2. Constantes: _HEADERMIN equ .70 Constante para establecer el límite del valor de tiempo de Header mínimo. Theader_min = Header - 30% = 2ms – 30% = 1.4ms Theader_min = _HEADERMIN x 8 x 10 x Tcyc Theader_min = 70 x 8 x 10 x 250ns = 1.4ms 168 Registros: Los registros se encuentran dentro del banco 0, a menos que se especifique otro banco. BUFFERR Buffer de Recepción, se encuentra en el banco 3, marca la primera localidad del buffer, Se utiliza en las subrutinas TRANSMITIR y RECIBIR y queda disponible para las otras subrutinas, se accede por medio del direccionamiento indirecto. La longitud del buffer es de 96 bytes, es decir, abarca de la localidad de memoria 90h (LSB) hasta la localidad EFh (MSB). Para los siguientes registros ver sección 9.3.2. PREAMB1 PREAMB2 CNTAUX1 CNTAUX2 CNTLOOP CNTBIT BUFFAUX FLAGSRF Bits del Registro FLAGSRF: FPREA equ 2 FDATO equ 3 FBINI equ 4 F1PRE equ 5 F2PRE equ 6 FRX equ 7 ver sección 9.3.2. ver sección 9.3.2. Bandera que indica, cuando vale 1, que ya se recibió el primer byte de datos o de preámbulo. Bandera que indica, cuando vale 1, que ya se recibieron todos los bytes del preámbulo inicial. Bandera que indica, cuando vale 1, que ya se recibieron todos los bytes del preámbulo final. Bandera que indica si se ha recibido una trama de datos válidos por el módulo de RF. 0 para trama de datos válida y 1 para trama de datos no válida. En las figuras 9.29, 9.30, 9.31, 9.32, 9.33, 9.34, 9.35, 9.36, 9.37, 9.38, 9.39, 9.40, 9.41, 9.42, 9.43 y 9.44 se presentan los diagramas de flujo correspondiente a la subrutina RECIBIR. 169 Figura 9.29 Diagrama de flujo, subrutina RECIBIR, parte 1/16. 170 Figura 9.30 Diagrama de flujo, subrutina RECIBIR, parte 2/16. 171 Figura 9.31 Diagrama de flujo, subrutina RECIBIR, parte 3/16. 172 Figura 9.32 Diagrama de flujo, subrutina RECIBIR, parte 4/16. 173 Figura 9.33 Diagrama de flujo, subrutina RECIBIR, parte 5/16. 174 Figura 9.34 Diagrama de flujo, subrutina RECIBIR, parte 6/16. 175 Figura 9.35 Diagrama de flujo, subrutina RECIBIR, parte 7/16. 176 Figura 9.36 Diagrama de flujo, subrutina RECIBIR, parte 8/16. 177 Figura 9.37 Diagrama de flujo, subrutina RECIBIR, parte 9/16. Figura 9.38 Diagrama de flujo, subrutina RECIBIR, parte 10/16. 178 Figura 9.39 Diagrama de flujo, subrutina RECIBIR, parte 11/16. Figura 9.40 Diagrama de flujo, subrutina RECIBIR, parte 12/16. 179 Figura 9.41 Diagrama de flujo, subrutina RECIBIR, parte 13/16. 180 Figura 9.42 Diagrama de flujo, subrutina RECIBIR, parte 14/16. Figura 9.43 Diagrama de flujo, subrutina RECIBIR, parte 15/16. 181 Figura 9.44 Diagrama de flujo, subrutina RECIBIR, parte 16/16. 182 Anexo 1. Diagrama de conexiones entre el PIC de Protocolo y el PIC de Enlace, nodo-S. La comunicación entre el PIC de Protocolo y el PIC de Enlace en el nodo-S se lleva a cabo por medio de algunos de sus puertos bidireccionales (I/O) de comunicación, tal y como se describió en el capitulo 2. La figura a1 muestra el diagrama de conexiones entre el PIC de Protocolo y el PIC de Enlace : Figura a1 Diagrama de conexiones entre el PIC de Protocolo y el PIC de Enlace del nodo-S. Anexo 2. Diagrama de conexiones entre el PIC de Protocolo y el PIC de Enlace, nodo-P. La comunicación entre el PIC de Protocolo y el PIC de Enlace en el nodo-P se lleva a cabo por medio de algunos de sus puertos bidireccionales (I/O) de comunicación, tal y como se describió en el capitulo 3. La figura a1.1 muestra el diagrama de conexiones entre el PIC de Protocolo y el PIC de Enlace : Figura a1.1 Diagrama de conexiones entre el PIC de Protocolo y el PIC de Enlace del nodo-P. 183 Conclusiones Mi aportación personal al proyecto original “Red Inalámbrica de Sensores” consta de varias etapas, una de ellas fue implementar correctamente la lectura y escritura desde un PIC -16F877A hacia un conjunto de memorias con BUS serial EEPROM- 24C02 conectadas a un bus de datos tipo serial por medio del protocolo de comunicación I2C, para posteriormente implementar físicamente un nodo-S, con la adición de cuatro memorias externas tipo serial, en cuyo capítulo 7 se presenta y detalla su funcionamiento. Como material de apoyo fundamental, utilice los reportes mencionados en la bibliografía, así como las hojas de datos de los componentes electrónicos implementados en cada nodo. La idea de integrar memorias externas al nodo-S, es debido a lo que mas comúnmente aqueja a todo dispositivo electrónico que maneja datos, y es la de aumentar la capacidad de memoria, debido a que en este caso, como parte de la mejora a la funcionalidad del proyecto, fue necesario almacenar digitalmente los muestreos de temperatura hechos por un sensor de temperatura digital a cierto intervalo de tiempo, para posteriormente enviarlos de forma inalámbrica a un nodo-P, de tal forma que los datos recibidos por dicho nodo son enviados mediante una interface de comunicación serial DB-9 hacia un ordenador, en donde finalmente los datos recibidos serán persistidos, centralizados y finalmente procesados a discreción por el usuario. Para lograr la integración exitosa de las memorias seriales al proyecto existente fue necesario hacer uso del protocolo de comunicaciones I2C, el cual es ideal para el acoplamiento de componentes que requieren comunicación serial. Con la infraestructura planteada en el proyecto original y como parte de mi proyecto, también implemente físicamente un nodo-P, de tal modo que logramos la integración de un mayor número de nodos a la red ya existente y comprobamos el funcionamiento aleatorio de comunicación, implementado en el protocolo UAMI con las técnicas básicas de acceso al medio que dictan los protocolos de redes. Como complemento adicional a la documentación de esta red inalámbrica de sensores, se agregaron algunos anexos al documento, los cuales describen las conexiones físicas entre el PIC de Protocolo y el PIC de Enlace, tanto en el nodo-P, como en el nodo-S. El desarrollo de este proyecto fue de gran importancia para mi preparación profesional, ya que permitió ampliar mis conocimientos en el área de aplicación de los micro controladores, así como aplicar extensivamente los conocimientos de electrónica y computación adquiridos durante toda la carrera. El uso de lenguaje ensamblador y la implementación del protocolo de comunicación I2C fue de gran relevancia, ya que ayudo a complementar mis conocimientos en el desarrollo de software embebido, ejercitar la depuración (debugging) de software, además de que complementa mi formación universitaria. Tengo la seguridad de que este trabajo será de utilidad para proyectos futuros, ya que con la ayuda de mi asesor, los trabajos previos y el presente reporte, se pretende que el proyecto de la red inalámbrica de sensores este bien documentada, para fines de minimizar los problemas típicos de un proyecto mal documentado, tal como ambigüedades, omisión de diagramas, falta de información, etc. 184 Bibliografía Flores Barrera Nemesio, Gaona Cruz Germán, Lira Cervantes Luis Manuel, “Red Inalámbrica de Sensores” reporte de proyecto de Ingeniería Electrónica en Comunicaciones, Universidad Autónoma Metropolitana – Unidad Iztapalapa, Noviembre 2009. Monroy Casimiro Julio Cesar, “Adecuación de una memoria externa a un nodo de una red de sensores inalámbrica.” Proyecto terminal de ingeniería electrónica, Universidad Autónoma Metropolitana – Unidad Iztapalapa Noviembre 2012. PIC16F87XA Data Sheet 28/40/44-Pin Enhanced Flash Microcontrollers. http://www.microchip.com/downloads/en/DeviceDoc/39582b.pdf Chipcon CC1000 Single Chip Very Low Power RF Transceiver. http://focus.ti.com/lit/ds/symlink/cc1000.pdf CC1000PP Plug and Play Module User Manual (rev. 1.22) 2003-0203. http://focus.ti.com/lit/ug/swru060/swru060.pdf DS1621 Digital Thermometer and Thermostat. http://www.datasheetcatalog.org/datasheet/maxim/DS1621.pdf ST24/25C02, ST24C02R, ST24/25W02 SERIAL 2K (256 x 8) EEPROM. http://www.datasheetcatalog.org/datasheets/150/501070_DS.pdf 185