Universidad Autónoma Metropolitana Unidad Iztapalapa

Anuncio
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
Descargar