Comunicación: Tipos y necesidades

Tal y como se mostró en la entrada de descripción del proyecto, el sistema precisa de dos tipos de comunicaciones bidireccionales, una inalámbrica y otra por cable. Al ser bidireccionales, cada tipo de comunicación se puede dividir en dos comunicaciones unidireccionales entre dos implicados. Es decir:

  • Comunicación inalámbrica: Sensor ↔ Maestro

    • Sensor → Maestro

    • Maestro → Sensor

  • Comunicación por cable: Maestro ↔ PC

    • Maestro → PC

    • PC → Maestro

De este modo cada parte de la división se puede simplificar como una comunicación unidireccional que suple unas necesidades de comunicación:

  • Comunicación inalámbrica: Sensor ↔ Maestro

    • Sensor → Maestro

      • Medidas de Humedad relativa y de Tª. Contiene las medidas realizadas sin procesar, es decir en "ticks".
      • Palabra de configuración del sensor. El maestro lo utilizará para verificar cambios realizados sobre la configuración del sensor.
      • Penúltima palabra de configuración del transceptor. Contiene la potencia de transmisión. El maestro lo utilizará para verificar cambios.
      • Inicio de transmisión. Contiene la dirección del sensor, la configuración del transceptor y del sensor. De este modo el maestro conoce el sensor y le asigna una ID.
      • Dato recibido correctamente.
      • Batería baja.
      • Errores.

    • Maestro → Sensor

      • Respuesta al comando inicio de transmisión.
      • Cambia la potencia de transmisión.
      • Cambia la configuración del sensor.
      • Cambia de canal.
      • Ajuste del tiempo entre medidas.
      • ¿Cuál es tu potencia de transmisión?.
      • ¿Cuál es la configuración del sensor?.
      • Duerme durante X tiempo.
      • Entra en modo test.
      • Apágate.

  • Comunicación por cable: Maestro ↔ PC

    • Maestro → PC

      • He recibido la siguiente medida de tal sensor.
      • Tal sensor tiene la siguiente configuración del sensor.
      • Tal sensor tiene la siguiente configuración del transceptor.
      • Tal sensor indica batería baja.
      • Esta es la dirección de tal sensor.
      • Se ha conectado un nuevo sensor.

    • PC → Maestro

      • Dime la configuración del sensor de tal sensor.
      • Dime la configuración del transceptor de tal sensor.
      • Dime la dirección de tal sensor.
      • Duerme al sensor tal durante tanto tiempo.
      • Ajusta el tiempo entre medidas del sensor tal a este valor.
      • Cambia el canal de los sensores en lista.
      • Cambia la potencia de transmisión de tal sensor.
      • Apaga tal sensor.
      • Modo test.

Estas necesidades forman el protocolo ya que el protocolo debe ser capaz de suplirlas todas.

Funcionamiento global

Antes de empezar a programar he pensado que es conveniente definir completamente la comunicación inalámbrica ya que es el punto central del proyecto y al ser nexo entre maestro y esclavo condiciona totalmente el funcionamiento de estos. Es por esto que esta entrada define en esencia el funcionamiento tanto del sensor como del transceptor y en algunos casos detalles del software de representación de datos.

Comunicación inalámbrica

Para reducir el consumo la comunicación debe evitar largos periodos de "polling" en el canal. Es por esto que se ha decidido que la comunicación se realizará acorde al funcionamiento del sensor.

El funcionamiento básico consiste en que el sensor realiza una medida cada periodo configurable (este periodo es muy prolongado respecto a la velocidad de funcionamiento de los microcontroladores por lo que la mayor parte de ese tiempo el microcontrolador se encuentra en modo de bajo consumo) ,envía el dato medido y entra en modo de bajo consumo esperando a realizar otra medida. Lógicamente este funcionamiento descrito muestra un tipo de comunicación unidireccional, el sensor no puede recibir datos. Por supuesto se necesita una comunicación bidireccional por lo que se debe añadir al funcionamiento del sensor la acción de ver si le han enviado algo, recibirlo y procesarlo.

No es eficiente dedicar el tiempo entre medidas al "muestreo" (polling) del canal debido al elevado consumo que introduciría. Es por esto que se ha decidido que el polling del canal se realizará durante un instante de tiempo cuya duración sea la necesaria para que el tiempo de procesado y respuesta del maestro permita la recepción del paquete. Para advertir al maestro de cuándo podrá realizar el envío de los datos, el polling se realizará tras enviar las medidas el sensor, es decir, el sensor enviará las medidas y dejara un tiempo ajustado para recibir datos.

De este modo, la dinámica de la comunicación consistirá en el envío de las medidas al maestro por parte del sensor; el sensor se mantendrá un tiempo a la escucha, tiempo que el maestro aprovechará para enviar los comandos oportunos al sensor. Una vez el sensor recibe los datos, inmediatamente deja de estar a la escucha, procesa los datos y entra en modo de bajo consumo esperando la medida siguiente. Esto se aprecia en la tabla siguiente.

Mapa de funcionamiento y consumo.
Estado t medida HR t medida Tª envio datos t en el aire t espera recepción espera medida
Micro duerme lee duerme lee envía duerme pon RX duerme
Transceptor duerme carga datos transmite duerme recibe apagado
Sensor mide mide duerme

Esta tabla muestra gráficamente la función de cada dispositivo del sensor en cada estado resaltando las funciones a razón del consumo que suponen. El consumo se muestra en forma de gradiente, siendo el azul el de menor consumo y el rojo más oscuro el de mayor.

Tal y como se aprecia, para reducir el consumo estático del nodo, se ha decidido desconectar el transceptor durante el tiempo entre medidas ya que su consumo estático, en modo reposo 12µA, es elevado en proporción al resto.

Iniciar la conexión inalámbrica:

Se debe permitir la conexión en caliente por lo que el proceso de conexión de un nuevo sensor a la red se muestra a continuación.

El maestro está escuchando (polling) contínuamente por el canal en el que esté trabajando. El sensor se sitúa junto al maestro y se enciende. Una vez encendido, el sensor envía el paquete de "conexión inicial" el cual contiene su dirección y la configuración de su sensor y de su transceptor.

Cuando el maestro recibe dicho paquete, actúa asignando a la dirección recibida, la del sensor, un número de identificación (ID) de menor tamaño que la dirección y posteriormente se la envía al sensor. A partir de ahora la comunicación del sensor con el maestro contendrá la ID que le indicará al maestro quién le está enviando el paquete. En el caso en el que el sensor no reciba respuesta del maestro, cambiará de canal y lo volverá a intentar. Si esto tampoco funcionase, se podría intentar hacer un cambio de potencia y volver a realizar el barrido de canales. Si todo esto falla, el sensor entrará en reposo y lo indicará con su indicador luminoso LED.

Una vez el maestro ha recibido el dato MY_NAME_IS del sensor y le ha respondido, manda la configuración, la dirección y la ID asignada al sensor al PC para ser procesada y mostrada por el software de representación.

Cuando el software de representación recibe los datos del sensor enviados por el maestro, este crea una nueva clase que contiene los paneles que se mostrarán para cada sensor pasándole los datos recibidos al constructor. Esto produce una ventana la cual contiene una gráfica donde se muestran los datos de HR y Tª y una serie de etiquetas y botones que permiten mostrar los datos del sensor y configurar el sensor.

Configurar el sensor:

Una vez establecida la conexión, para configurar el sensor el usuario interactúa mediante el software de representación. El software envía un comando que contiene la ID del sensor a modificar al maestro, el cual almacena en el "buffer FIFO" de la ID el comando a enviar para que el sensor actúe como se ha pedido. El "buffer" consiste en un array donde se van almacenando los comandos que se le quieren enviar a una ID (sensor) determinada; esto es así debido a la naturaleza de la comunicación.

Cuando un dato del sensor es recibido por el maestro, el maestro mira si el buffer correspondiente está vacío, en caso contrario, manda todos los comandos posibles (cada paquete puede contener hasta dos comandos) contenidos en el buffer.

Cuando el sensor recibe el dato, actúa en consecuencia y envía un paquete de respuesta el cual es interpretado por el maestro como cambio realizado correctamente y es comunicado al software de representación.

Una vez el sensor ha contestado, continúa con el funcionamiento normal. Esto supone una modificación del tiempo entre lecturas.

Bloque sensor: Software

Seleccionado el microcontrolador que se empleará en el bloque sensor, resta comenzar a programarlo. Para ello es preciso seleccionar algunos aspectos de la programación del microcontrolador:

Entorno de desarrollo y lenguaje de programación

Como se comentó, el lenguaje de programación que se utilizará es C ya que permite una comprensión del código mejor que ensamblador y una migración del código relativamente fácil para otras familias de microcontroladores y muy fácil para otros modelos de PIC.

Microchip no facilita ningún compilador de C para la familia PIC16 por lo que se debe recurrir a compiladores comerciales o libres. Existen diversos compiladores de C y entornos de desarrollo, a destacar:

  • CCS: Disponen de una versión de demo por 30 días además limitado. Como ventaja, incluye diversas bibliotecas que facilitan la programación pero el C que implementa no cumple completamente con el estándar ANSIC.
  • HI-TECH PICC: Dispone de una versión gratuita (LITE) la cual puede programar sin restricciones todos los microcontroladores de las familias PIC10/12/16. También disponen de una versión de evaluación sin restricciones de 45 días de su versión PRO la cual se diferencia de la LITE en que incluye un optimizador de código que, según dicen, mejora el código un 50%. Este compilador incluye un entorno de programación (IDE) gratuito basado en Eclipse, por lo que tanto el compilador como el entorno son multiplataforma.
  • Como alternativa libre, existe un porting a la familia PIC16 del compilador libre GCC hecho por Pedro José Ramírez Gutiérrez, estudiante de la Universidad de Málaga.

Pese a existir otros compiladores, no disponen de versiones de evaulación ilimitadas como PICC-PRO o gratuitas como PICC-LITE ni mucho menos libres. Es por esto que de entre las alternativas expuestas, el compilador PICC y el porting son las mejores soluciones.

Mi experiencia programando PIC es nula por lo que el entorno de desarrollo del que dispone el compilador PICC ayudará, ya que, entre otras cosas, permite simular el código. Entonces, se utilizará para el proyecto la versión de evaluación del compilador PICC-PRO dado que 45 días son más que suficientes para realizar el código. No obstante, una vez realizado el código y ganada expieriencia en la programación de PIC, se intentará migrar al porting de GCC dada su gran ventaja que es la libertad.

Programador

Dado que no se dispone de un programador de PIC, se deberá realizar uno o adquirirlo. Como se utilizará para el módulo maestro un PIC de la familia 18, el programador deberá ser capaz de programar ambos. El programador económico de Microchip (37.9€ en Farnell) PicKit2, soporta las familias PIC10/12/16/18/24 dsPIC30/33/32. Microchip facilita el esquemático y el firmware (en binario) del programador pero la compra de los componentes tiene aproximadamente el mismo coste que el programador por lo que se adquirirá.

El programador se muestra en la imagen de la derecha. Utiliza la programación en circuito (ICSP) utilizando dos líneas y el reset, permitiendo también el depurado en circuito (ICD) para los microcontroladores que lo permitan. Mediante el software que incluye se puede utilizar el programador como analizador lógico para bajas tasas de bits y como puerto serie.

Para programar un dispositivo, las líneas que se deben conectar al microcontrolador se muestran en el esquema siguiente:

Referencias

Microchip PICkit 2 Programmer/Debugger User's Guide.

Estudio preliminar: El software de control en el PC

Se realizará una aplicación para configurar los nodos de la red y para mostrar los valores de cada nodo. Esta aplicación debe ser preferentemente gráfica y debe ser capaz, como mínimo, de permitir al usuario acceder a toda la información de la red de medida, temperatura y humedad relativa en cada uno de los puntos de medición, así como modificar el período de actualización de los datos o ver un histórico de medidas.

En primer lugar, es importante seleccionar el lenguaje de programación con el que se realizará. Existe multitud de lenguajes de programación que permiten programación de entornos gráficos. Son los lenguajes orientados a objetos los que permiten programación de entornos gráficos, tales como C++, C#, Java, Phyton, MSVisualBasic, etc. Sin embargo, hay lenguajes no orientados a objetos que también lo permiten como por ejemplo C haciendo uso de la librería GTK y libglade.

Dado que normalmente se utilizan APIs intermedias entre el sistema operativo y la aplicación para facilitar la programación gráfica, como por ejemplo las API de BorlandC++, la aplicación resultante queda ligada a un único sistema operativo. No obstante, los lenguajes de programación interpretados como Java y Phyton, mantienen una relativa independencia con sistema operativo. Sin embargo, los lenguajes interpretados son típicamente más "lentos". Puesto que la velocidad en esta la aplicación no es crítica, se optará por un lenguaje interpretado dada la ventaja de ser multiplataforma.

De los lenguajes interpretados se ha optado por el lenguaje de programación Java por poseer mejores herramientas para su desarrollo.

El lenguaje de programación Java fue desarrollado por Sun Microsystems a principio de los 90. En el lenguaje de programación Java, el código fuente, de extensión .java, se compila, mediante el compilador de java (javac), obteniéndose un fichero de extensión .class. Estos ficheros no contienen código nativo de la plataforma del compilador; en su lugar contienen bytecodes, el lenguaje máquina de la máquina virtual Java (Java VM).

Es esta máquina virtual la encargada de convertir el lenguaje bytecodes a el lenguaje máquina específico de la arquitectura en la que sea ejecutado, por tanto la máquina virtual es específica de la arquitectura, tal y como muestra la figura siguiente.

Como la máquina virtual está disponible para diferentes sistemas y arquitecturas, el mismo fichero compilado .class, puede ser ejecutado en distintas arquitecturas.

Personalmente, desconozco el lenguaje de programación Java. No obstante tengo nociones básicas de programación orientada a objetos por lo que no espero que me sea complicado aprender a programar Java. Una de las ventajas de Java es su documentación, Sun tiene unos tutoriales muy completos (ver referencias) y existe multitud de bibliografía sobre el lenguaje. Además NetBeans, un entorno multiplataforma iniciado por Sun y ahora libre es muy cómodo y completo para la programación, soporta completamente todas las versiones de Java (Java SE, Java EE, Java ME), y dispone de diversas herramientas como un constructor de interfaces gráficas o soporte para el depurado línea a línea.

Referencias

Sun Microsystems The Java Tutorials.

Selección de componentes: Microcontrolador (μC) del bloque maestro

Antes de seleccionar el microcontrolador que se utilizará en el nodo maestro, se debe seleccionar el modo en el que este se comunicará con el ordenador.

Comunicación con el PC

Para la comunicación del nodo maestro con el PC se han barajado distintas alternativas. Actualmente, los ordenadores disponen principalmente de dos formas accesibles de comunicación; estas son el puerto serie y el puerto USB.

El puerto serie o RS-232, se caracteriza por ser el más sencillo de utilizar. Permite un rango bastante ámplio de velocidades, de 2400bps a 115200bps, y se encuentra implementado en multitud de microcontroladores con un coste bajo. No obstante, hoy en día está siendo desplazado por el USB y está cayendo en desuso; actualmente está limitado a ordenadores de escritorio, habiendo desaparecido prácticamente de los ordenadores portátiles. Esta situación desaconseja su uso.

El puerto USB (Universal serial bus) es un estándar para las comunicaciones serie. Inicialmente ideado para reemplazar a los puertos serie y paralelo, su uso ha ido creciendo hasta haberse convertido hoy en día en el estandar de comunicación entre el PC y cualquier otro dispositivo. Este puerto es fácil de usar para el usuario ( PnP o Plug and Play), es fácilmente expandible ( como se muestra más adelante) y permite la alimentación del dispositivo mediante el bus eliminando así la alimentación externa. En cuanto a la velocidad, la especificación USB 2.01 contempla tres modos de operación: Low Speed (LS) a 1.5Mb/s, Full Speed (FS) a 12Mb/s y High Speed (HS) 480Mb/s. Dada esta versatilidad, su topología es mucho más complicada que la de un puerto serie o paralelo. Su uso es mucho más complicado para el diseñador que el uso del puerto serie ya que debe implementar una serie de drivers propios o los definidos por alguna clase estándar. Una clase provee las especificaciones de un grupo de drivers comunes a distintos periféricos, es decir cómo se comunica el periférico con el maestro o host. El estándar contempla diversas clases entre las cuales se encuentra la clase CDC, Communications Device Class, que permite, entre otras cosas, emular un puerto serie, es decir físicamente es un puerto USB pero de cara al sistema operativo se comporta como un puerto serie. No obstante, la implementación de esta clase no es sencilla y precisa de conocimientos avanzados del estándar.

Por lo tanto el uso del USB supone las siguientes ventajas para el proyecto:

  • El nodo maestro no necesita de una fuente de alimentación externa pues se puede alimentar mediante el bus USB. El bus USB proporciona, según el estándar, una tensión de 5V y una corriente comprendida entre 100mA y 500mA dependiendo del host y del número de dispositivos conectados.
  • Facilita la conexión y el uso del nodo maestro por el usuario.
  • Permite el uso del nodo maestro en ordenadores portátiles de nueva generación.

Según lo expuesto, se concluye que el uso del puerto USB es recomendable frente al del puerto serie. Es por esto que se utilizará una comunicación USB entre el maestro y el PC. Esta comunicación utilizará la clase CDC para virtualizar un puerto serie lo que implica un desarrollo sencillo al disponer los sistemas operativos actuales del driver y un software para el PC sencillo pues deberá comunicarse con un puerto serie.

Se pueden encontrar en el mercado dispositivos que contienen dos transceptores, uno USB y otro RS-232. El dispositivo implementa la clase CDC simplificando así la conexión entre el microcontrolador y el ordenador a una conexión RS-232. También existen microcontroladores con un transceptor USB integrado. Estos últimos suponen un menor costo pero la implementación de la clase CDC la debe realizar el programador.

El componente que se utilizará es un microcontrolador de Microchip de la gama PIC18 con un transceptor USB integrado puesto que Microchip proporciona las implementaciones de las clases estándar HID (Human Interface Device) utilizada principalmente para ratones y teclados, CDC (Communications Device Class) y MSD (Mass Storage Device) utilizada para memorias o discos duros externos. Esta implementación está soportada por los microcontroladores PIC18F2455/2550/4455/4550. Las diferencias entre estos se muestra a continuación.

Dado que las necesidades del proyecto no son elevadas, la solución de compromiso es el microcontrolador PIC18F2455 dado que dispone del menor número de lineas de entrada/salida y del menor número de memoria Flash.

Para hacer uso de la implementación de Microchip de la clase CDC no se precisan demasiados conocimientos sobre el USB, no obstante, se puede encontrar información en el estándar o en páginas en castellano.

Notas
1

La especificación USB 1.1 unicamente contempla los modos LS y FS.

Referencias

Microchip AN956 Migrating Applications to USB from RS-232 UART with Minimal Impact on PC Software.

Microchip USB design center.

Microchip PIC 18F2455/2550/4455/4550 Datasheet.

USB.org USB 2.0 Specification.

Craig Peacock USB in a NutShell.

Selección de componentes: Batería.

Principalmente las baterías se pueden dividir en dos grupos, las recargables y las no recargables.

Las baterías no recargables, también conocidas como primarias, son aquellas que se desechan cuando se agotan. Las baterías recargables, también conocidas como secundarias, son aquellas que pueden ser recargadas una vez se han agotado. En general, su principal característica es la máxima corriente de descarga, que es mayor para las recargables, y el ciclo de funcionamiento, siendo mayor en las recargables.

De este modo, se utilizan las baterías recargables en aplicaciones que precisan extraer corriente relativamente elevada durante largos periodos de tiempo. No obstante, debido a su elevado precio, se utilizan cuando el coste de reemplazamiento en el caso de utilizar baterías no recargables es inviable.

Parámetros característicos

Las baterías no recargables se dividen a su vez en varios grupos dependiendo de su composición química, de este modo existen baterías de litio, alcalinas, de óxido de plata, óxido de níquel, de zinc-carbón, zinc-aire y muchas otras. Para poder realizar una comparativa es necesario conocer una serie de parámetros acerca de las baterías.

Capacidad de corriente

La capacidad de corriente es la cantidad de corriente entregada por una batería bajo unas determinadas condiciones. Se expresa como el producto de la corriente de descarga y el tiempo de descarga por lo que viene dado por Ah o más comúnmente en mAh. Por lo tanto se expresa como la cantidad de corriente que se puede extraer de la batería antes de que se descargue.

Entonces, para determinar la duración de la batería ante una corriente de descarga constante, basta con dividir la capacidad de corriente por la corriente de descarga aplicada, obteniéndose así las horas de duración de la batería.

Máxima corriente de descarga y tensión de operación

La tensión de operación en las baterías depende de la composición química de las mismas. En la práctica, esta tensión varía conforme se descarga y depende de la carga aplicada a la batería, es decir la corriente de descarga a la que es sometida la batería. Cuando la resistencia de carga disminuye, aumenta la corriente de descarga, la tensión de operación y la capacidad de la batería disminuyen. Estas variaciones dependen de la composición química de la batería y de la temperatura de operación (tienden a ser menores a menor temperatura).

La gráfica siguiente proporcionada por el fabricante Maxell muestra todos sus productos en función de la tensión de operación frente a la capacidad de corriente. Pese a que muestra sólo sus productos, se puede tomar como referencia.

Donde:

  • LR:Alcalina (tamaño micro).
  • SR:Óxido de plata.
  • TC:Titanio-Carbón-Litio recargable.
  • ML:Litio-Dióxido de Manganeso recargable.
  • ER:Litio-Thionyl-Chloride.
  • CR:Litio-Dióxido de Manganeso.
  • ICSP:Litio-ion recargable
Descarga de una batería

Una batería se puede descargar de diferentes formas dependiendo del tipo de carga, que tendrá un efecto directo en la vida de la batería. Los modos típicos de descarga son:

  • Resistencia constante. Es cuando la carga mantiene una resistencia constante a lo largo del ciclo de descarga. Al ser una carga resistiva, conforme se va descargando la batería, la corriente y la tensión decaen. Por lo tanto, la batería se descargará de forma rápida lo que implica una vida corta.

  • Corriente constante: Cuando la carga extrae la misma corriente durante la descarga. En este modo la vida de la batería es mayor que para la resistencia constante ya que se extrae siempre la misma corriente independientemente de la caída de la tensión de operación.

  • Potencia constante: La corriente de descarga aumenta mientras la tensión de operación decrece. Es el modo más eficiente ya que la batería se puede descargar más allá de su tensión final (tensión a la cual se supone que se ha agotado la batería) dado que se aumenta el consumo de corriente para compensar.

Generalmente, el fabricante facilita la característica de descarga para una resistencia constante.

Tamaño
(referencia http://data.energizer.com/SearchResult.aspx)

Las baterías presentan distintas formas y tamaños dependiendo de su composición química y de su capacidad de corriente. Principalmente, las baterías no recargables se presentan en tres encapsulados distintos; cilíndrico, de botón y rectangular.

En general, las baterías más voluminosas poseen una mayor capacidad de corriente. De este modo, los encapsulados más voluminosos son el cilíndrico (AA 50x14.5 y AAA 44.5x10) y el rectangular (9V 48.5x26.5) y las baterías de botón son mucho menos voluminosas (CR2025 2.5x20 y CR2450 5x24). Del mismo modo, la capacidad de corriente típica de una batería cilíndrica AA alcalina es de 2850mAh y de una AAA alcalina es de 1250mAh mientras que para las baterías de botón, la capacidad de corriente típica de una batería CR2025 es de 160mAh y para una CR2450 es de 620mAh. Hay que destacar que las baterías de botón son mayoritariamente de litio, cuya principal característica es que su tensión de operación es de 3V a diferencia del resto de composiciones químicas cuya tensión es de 1.5V.

Selección del tipo de batería

Las necesidades del proyecto respecto a los parámetros anteriores se muestran a continuación.

El sensor descargará la batería mediante una corriente constante ya que, para descargarla mediante una potencia constante, se precisaría de un regulador conmutado (DC-DC) el cual ajuste la corriente conforme caiga la tensión y este supondría un consumo superior al del sistema en reposo disminuyendo la autonomía.

Los resultados de la estimación de consumo muestran una corriente promedio del orden de 60µA en el peor de los escenarios. Es por esto que para que los dispositivos tengan, en el peor de los escenarios, una autonomía de como mínimo medio año, la capacidad de corriente necesaria vendrá dada por:

En cuanto a la tensión de operación, el dispositivo que precisa de la mayor mínima tensión de operación es el sensor, capaz de operar en un rango comprendido entre 2.4V y 5.5V. Es por esto que la tensión mínima de operación del nodo sensor es de 2.4V.

Por lo que respecta a la máxima corriente de descarga, se debe tener en cuenta que se precisan de breves pulsos de corriente del orden de 10mA. No obstante, la duración de estos pulsos es muy breve, centenares de microsegundos, por lo que la corriente promedio puede considerarse la de descarga.

También se debe tener en cuenta que se busca el menor tamaño posible y las dimensiones de la batería son las más significantes respecto el resto de componentes. No obstante, este no es un parámetro crítico, primando la capacidad de corriente (autonomía).

Conocidos los parámetros, la tabla siguiente muestra las principales características de las distintas baterías según su composición química.

Tal y como se ha estimado, el consumo de corriente es de unos 40µA en el peor de los escenarios por lo que la capacidad de corriente necesaria para asegurar un funcionamiento durante al menos medio año, en el peor de los escenarios, es de unos 173mA. Se observa que cualquier familia contempla la capacidad necesaria dentro del rango soportado. Es por esto que este parámetro no permite discriminar entre un tipo de batería u otro.

Atendiendo a la tensión de operación, la elección lógica son las baterías de litio ya que su tensión de operación es de 3V por lo que sólo se precisaría una batería. En el caso de utilizar otro tipo de batería como la alcalina, sería necesaria la asociación en serie de dos de ellas, con el consiguiente aumento de tamaño y coste que esto supone.

Considerando la corriente de descarga, Maxell facilita la tabla siguiente, en la que se muestran los distintos tipos de batería con las máximas corrientes de descarga que soportan (en verde).

En las tablas de la estimación del consumo se observa como la corriente de pico máxima es de unos 18mA. Esta corriente se mantiene durante un breve instante de tiempo por lo que en promedio es mucho menor. Es por esto que una batería comprendida entre 1mA y 10mA debería ser suficiente aunque someter a este estrés a la batería puede mermar su capacidad de corriente y su vida útil.

En cuanto al tamaño, las baterías más pequeñas son las de tipo botón. Las baterías CR de litio están en formato botón y como se ha comentado, al ser de litio, sólo se necesitaría una.

Por lo que respecta al coste, en la tabla se observa como las baterías alcalinas y las zinc-carbón son las de menor coste relativo. No obstante, se debe tener en cuenta que serían necesarias dos baterías en serie, debido a su tensión de operación, duplicando el coste y el tamaño.

Se concluye que la solución de compromiso es el uso de una batería de litio de botón. Además, su coste relativo alto no lo es tanto para las baterías de menor capacidad de corriente (CR2025 0.73€y CR3032 1.05€ de Panasonic).

Selección de la batería

Dentro de la gama de baterías de lítio de botón (gama CR) existen distintos modelos de batería que difieren del resto en su capacidad de corriente y en sus dimensiones. Por ejemplo, el fabricante Energizer facilita la siguiente tabla en la que se muestran sus productos de la gama CR.

Se han marcado con fondo gris las baterías que no cumplen la condición de almenos medio año de autonomía, de este modo cualquiera de las que tiene el fondo blanco asegura una autonomía mayor al medio año en el peor de los escenarios. La tabla siguiente muestra la vida de la batería en el peor de los escenarios para los distintos modelos.

La vida de la batería aumenta considerablemente al aumentar el tiempo entre medidas. Por ejemplo, si consideramos el escenario descrito anteriormente pero con un tiempo entre medidas de 60 segundos, el promedio de consumo es de 9.31µA tomando los valores máximos, por lo que la duración de la batería se muestra en la tabla siguiente.

Se pueden comprobar los cálculos realizados mediante la gráfica que proporciona Maxell, que muestra el consumo de corriente en función de la duración de la batería para toda la gama CR.

Dado que la vida útil es muy dependiente de la configuración del sensor, en concreto del tiempo entre muestras, se ha decidido que la batería sea seleccionada por el usuario dependiendo del uso que vaya a darle, de este modo se ahorran costes pues la batería CR2025 tiene un coste inferior a 1€ y la batería CR2450 tiene un coste de unos 3€.

Referencias

Maxell Batteries Product Lineup.

Microchip AN606 Low Power Design Using PICmicro Microcontrollers.

Selección de componentes: Batería, estimación de consumo.

Se han seleccionado todos los componentes que forman el nodo sensor salvo la batería. Para poder seleccionar la batería, es preciso realizar una estimación preliminar del consumo que tendrá el sistema. Esta estimación se ha realizado con los datos disponibles, los facilitados por el fabricante, y ha precisado un esbozo del funcionamiento del nodo sensor y de los componentes que lo forman.

Funcionamiento del nodo sensor

Una primera aproximación al funcionamiento del nodo sensor se puede observar en la figura siguiente.

Se trata de un funcionamiento cíclico y se puede describir en los siguientes pasos:

  1. El sensor realiza una medida de humedad relativa.
  2. El sensor realiza una medida de temperatura.
  3. El microcontrolador alimenta al transceptor y lo configura.
  4. El transceptor envía los datos medidos.
  5. El transceptor entra en modo de recepción durante un tiempo determinado.
  6. El microcontrolador procesa el dato recibido y le corta la alimentación al transceptor.
  7. El microcontrolador entra en modo reposo durante múltiplos de cinco segundos.

Estos estados se han agrupado según el estado de los componentes. De este modo se tiene:

  1. Medida de HR y de Temperatura. El transceptor no está alimentado, no supone un consumo de corriente, el sensor está midiendo y el microcontrolador está en modo reposo.
  2. Transmisión. El transceptor se encuentra en modo de transmisión, el sensor y el microcontrolador en reposo.
  3. Recepción. El transceptor se encuentra en modo de recepción, el sensor y el microcontrolador en reposo.
  4. Configuración del transceptor. El transceptor y el sensor se encuentran en reposo y el microcontrolador se encuentra activo.
  5. Activo. En este estado se han agrupado las instrucciones ejecutadas por el microcontrolador a lo largo del funcionamiento. En este estado el transceptor y el sensor están en reposo y el microcontrolador se encuentra activo.
  6. Reposo. El transceptor no está alimentado, el sensor y el microcontrolador estan en reposo.

Para la estimación, se ha tomado el peor escenario posible, es decir el transceptor transmitiendo a la máxima potencia a una tasa de 250KB, el sensor midiendo a la máxima resolución y realizándose una medida cada cinco segundos. El microcontrolador se supone alimentado a 3 voltios, activo a 4MHz, con el watchdog activo durante el reposo y con el resto de periféricos desactivados.

Para obtener la duración del estado de transmisión, se ha supuesto que se enviarán 10bytes, 2 de dirección, 2 de CRC y 6 de datos donde 4 son las medidas de HR y Temperatura y los otros dos uno para el comando y el otro para la identificación del nodo. De este modo, se ha podido obtener el tiempo de transmisión utilizando la fórmula, facilitada por el fabricante, 1/250Kbps * (10+1).

Para el estado de Configuración del transceptor se ha supuesto una comunicación con el microcontrolador a 1Mhz.

Con este escenario, se han obtenido dos estimaciones, una para los valores facilitados por el fabricante denominados típicos y otra para los denominados máximos. Estas estimaciones se han realizado obteniendo la carga que supone cada estado que se define como la corriente que consume el sistema durante por su duración(Amperios por segundo). Estas cargas individuales se han sumado obteniéndose la carga total, la cual, dividida por la duración total del ciclo de estados, indica el consumo promedio de corriente. Esto se ha representado en las tablas siguientes.

Valores típicos

Valores máximos

En resumen, se ha estimado que el consumo promedio de corriente estará comprendido entre los 35µA y los 39µA.

Componentes: Microcontrolador (μC) del bloque sensor

Como se ha justificado, el microcontrolador seleccionado es el PIC16F636 de Microchip. Para comenzar a programar es necesario conocer las características disponibles y el uso de las mismas. Se van a presentar las características útiles para el sistema.

Arquitectura

En el diagrama de bloques se puede observar como la arquitectura interna del PIC consiste en una arquitectura Harvard. El bus y la memoria de datos (en amarillo) son independientes de los de instrucciones (en azul), permitiendo así que cada bus tenga el tamaño más apropiado. En este caso, la gama media PIC16, los datos tienen una longitud de 8bits y las instrucciones tienen una longitud de 14bits.

  • La memoria de instrucciones es de tipo FLASH con un tamaño de 3,5 Kbytes (2Kx14bits), es decir 2048 posiciones donde las posiciones $0000h (reset) y $0004h (vector de interrupción) están reservadas. La arquitectura del PIC establece que en funcionamiento la memoria de instrucciones es de solo lectura, dado que en el diagrama de bloques no se observa ningún bus de entrada de datos, sólo de salida.

  • La memoria de datos es de tipo RAM y contiene los registros de propósito general (General Purpose Registers) y los registros de funciones especiales (Special Function Registers). Los registros de propósito general son para uso del programador y tienen un tamaño de 128 bytes. Los registros de funciones especiales son todos los objetos (puertos, comparadores, temporizadores, memoria EEPROM ...), ya que se manejan como si estuviesen físicamente implementados por registros. También se puede observar como todos los registros pueden ser direccionados de forma directa o indirecta, tal y como muestra el diagrama de bloques.

    Todos los registros, exceptuando el Contador de programa que es de 13bits, son de 8bits y están organizados en cuatro bancos de registros, como muestra la tabla siguiente.

La total independencia entre los accesos a las dos memorias permite realizar accesos simultáneos a las mismas.

También hay que destacar que los microcontroladores PIC implementan un procesador RISC (Reduced Instruction Set Computer) es decir, un procesador con un conjunto de instrucciones reducido. En concreto, se dispone de un juego reducido de instrucciones (35), las cuales tienen en su totalidad la misma longitud (14bits), pueden utilizar cualquier objeto como operando fuente o destino (ortogonalidad) y excepto las de salto que se ejecutan en 2 ciclos de instrucción, se ejecutan en un ciclo de instrucción (Pipeline1).

Otro detalle importante del diagrama de bloques es que la ALU realiza las operaciones aritméticas con dos operandos, el registro W y otro que puede provenir de cualquier registro interno. Observar también, que el resultado se puede depositar en cualquier registro interno.

El Contador de programa (Program Counter) es el que proporciona la dirección de la instrucción en curso. Dicho contador tiene a su disposición una pila (Stack) de 8 registros de 13 bits, capaces de contener íntegramente el contador, que se comporta como un buffer LIFO (Last input, first output es decir, último en entrar, primero en salir) y se utiliza de forma automática para realizar saltos concatenados.

Oscilador

El módulo del oscilador tiene una amplia variedad de fuentes de reloj y de características seleccionables que le permiten adaptarse a distintas aplicaciones minimizando el consumo. Las fuentes de reloj pueden seleccionarse entre diversos tipos de osciladores externos (cristales de cuarzo, cristales cerámicos y circuitos RC). Además, la fuente de reloj del sistema puede ser configurada como uno de los dos osciladores internos con una amplia selección de velocidades vía software (como se comentó en entradas anteriores). El módulo también permite:

  • La selección de la fuente de reloj interna o externa mediante software.

  • Arranque en dos velocidades, lo que minimiza la latencia entre el oscilador externo y el inicio de la ejecución de código.

  • Monitorizado de fallo del reloj externo, diseñado para que al detectar un fallo del reloj externo, cambie automáticamente al oscilador interno.

La tabla siguiente muestra con fondo blanco todos los bits de los registros que afectan al módulo del oscilador. Los registros más importantes son el registro OSCCON y el registro CONFIG. De los registros INTCON, PIE1 y PIR1 se hablará más adelante pues son los encargados de gestionar el servicio de interrupciones (en este caso indican la interrupción al detectar un fallo en el oscilador externo). El registro OSCTUNE se utiliza para calibrar el oscilador interno de alta frecuencia (8MHz-125kHz).

La figura siguiente muestra la configuración del módulo del oscilador.

Se observa que se puede seleccionar entre las diferentes fuentes externas (LP,XT,HS,RC,RCIO,EC) o entre la fuente interna (INTOSC) mediante los bits FOSC del registro CONFIG. El bit SCS del registro OSCCON permite el cambio mediante software entre la fuente interna (1) y la externa (0). Los bits FOSC del registro CONFIG establecen la fuente del oscilador dependiendo de los valores que tomen. Dicho registro se comentará más adelante.

También se puede observar como los bits IRCF del registro OSCCON permiten seleccionar la frecuencia de la fuente de reloj interna.

El registro OSCCON también dispone de tres bits que indican el estado del módulo del oscilador, son los bits OSTS, HTS y LTS. El bit OSTS indica si el dispositivo está funcionando con el reloj externo (1) o interno (0). El bit HTS indica si el oscilador interno de alta frecuencia (8MHz-125kHz) es estable (1) o no (0). El bit LTS indica si el oscilador interno de baja frecuencia (31kHz) es estable (1) o no (0).

Configuración del dispositivo

El dispositivo se configura mediante la palabra de configuración CONFIG la cual se escribe durante la programación y cuyos bits se encuentran localizados en la dirección $2007h de la memoria de instrucciones. Dicha palabra está formada por los siguientes bits:

  • WURE: activar la generación de una señal de reset al despertarse (0).
  • FCMEN: habilitar la monitorización del fallo de reloj (1).
  • IESO: habilitar el modo de arranque a dos velocidades (1).
  • BOREN(1:0): activar el reset ante un corte breve de la alimentación. Soporta distintas configuraciones.
  • CPD: habilitar la protección del código de la memoria de datos (0).
  • CP: habilitar la protección del código de la memoria de programa (0).
  • MCLRE: función del pin MCLR como RA3 (0) o como MCLR (1).
  • PWRTE: habilitar el contador al arranque del pic (0).
  • WDTE: habilitación del perro guardián (1). En caso de estar deshabilitado, se puede habilitar mediante software modificando el bit SWDTEN del registro WDTCON como se verá más adelante.
  • FOSC(2:0): selección del oscilador tal y como muestra la figura siguiente.

Interrupciones

Una interrupción consiste en la detención del programa en curso y la ejecución de una rutina ante una determinada causa. Tras la terminación de la rutina de interrupción, se retorna al programa principal en el punto en el que se detuvo.

En este dispositivo, las causas que originan una interrupción son las siguientes:

  1. Desbordamiento del temporizador 0.
  2. Desbordamiento del temporizador 1.
  3. Interrupción externa (ante una señal externa). Se puede seleccionar el flanco de la señal externa que la activa mediante el bit INTEDG del regsitro OPTION (1 subida, 0 bajada).
  4. Ante un cambio de estado del puerto A.
  5. Escritura en la memoria EEPROM completada.
  6. Detección de bajo nivel de voltaje en la alimentación.
  7. Comparación completa del comparador 1.
  8. Comparación completa del comparador 2.
  9. Fallo del oscilador interno.

Cada causa de interrupción está controlada por dos bits; uno actúa como señalización (flag) que indica si se ha producido o no la causa y el otro es el permiso de la interrupción, la habilitación. Además, todas las causas de interrupción están sujetas a una habilitación global (GIE de INTCON), en caso de estar esta deshabilitada, ninguna causa generará una interrupción aunque localmente esté habilitada. Sin embargo si localmente está habilitada y se produce una interrupción, se producirá una señal de salida del modo de bajo consumo y se continuará con la ejecución del programa. La figura siguiente muestra de forma esquemática la lógica de las interrupciones.

Una vez producida una interrupción, como puede producirse por diversas causas, se debe explorar cuál ha sido la causa que la ha provocado observando los bits de señalización o banderas (flags). Una vez atendida la interrupción, se deben borrar los bits de señalización o banderas para prevenir falsas interrupciones.

Las interrupciones se regulan mediante los registros INTCON, PIE1 y PIR1; estos registros contienen los bits de señalización y de habilitación. El registro INTCON contiene los de los generales (temporizador 0, externa, cambio en el puerto A) y los registros PIE1 y PEIR1 contienen los de los periféricos. Para una misma causa el nombre de ambos bits es igual a excepción de la última letra; los de señalización finalizan con la letra F y los de habilitación con la letra E. Además, el registro INTCON contiene el bit de habilitación global GIE y el bit de habilitación de las interrupciones de los periféricos PEIE.

Puertos Entrada/Salida

Las líneas digitales mediante las cuales el microprocesador se comunica con el exterior son los puertos de entrada/salida. El microprocesador dispone de hasta 12 líneas de entrada/salida, dependiendo de qué periféricos están habilitados o no. Dichas líneas son capaces de suministrar hasta 25mA. En este caso, el microprocesador dispone de dos puertos, el puerto A y el puerto C.

  • Puerto A

    El puerto A está formado por seis líneas (RA5-RA0) y dispone de funciones adicionales que le permiten generar una interrupción al cambiar de estado y establecer resistencias de pull-up y de pull-down (excepto RA3). Además la línea RA0 dispone de la opción de implementar un temporizador de muy bajo consumo (ULPWU).

    Los registros que afectan al puerto A se muestran en la tabla siguiente. Dicha tabla incluye los de los periféricos que comparten líneas con el puerto; estos periféricos son el temporizador 0 y el comparador 1 y se comentan más adelante. El bit RAPU del registro OPTION habilita (0) o deshabilita(1) el uso de las resistencias de pull-up/down; en caso de estar activadas (0) se activarán las seleccionadas en el registro WPUDA.

    Los registros más importantes son

    • PORTA: Registro bidireccional que contiene los estados del puerto A.
    • TRISA: Registro que fija la dirección de las líneas del puerto A. Un 1 indica entrada, un 0 indica salida. Como RA3 es sólo de entrada, su correspondiente se lee siempre 1.
    • WDA: Mediante este registro se configura para cada línea el tipo de resistencia interna que se le establece a cada línea. Un 1 indica una resistencia de pull-up, un 0 de pull-down. Recuérdese que la línea RA3 es de sólo entrada, por lo que no puede implementar una resistencia interna.
    • WPUDA: Mediante este registro se habilitan o no las resistencias de pull-up/down para cada línea. Un 1 indica que la resistencia de pull-up/down está habilitada, un 0 que está deshabilitada.
    • IOCA: Como se ha comentado, el puerto A dispone de una fuente de interrupción configurable individualmente al cambio de valor, esto se habilita mediante este registro.
  • Puerto C

    El puerto C está formado por seis líneas (RC0-RC5). Los registros que afectan al puerto C se muestran en la siguiente tabla. Esta tabla incluye los registros del comparador 2, el cual comparte líneas con el puerto C.

    Los registros más importantes son PORTC y TRISC, donde PORTC contiene los estados y TRISC fija la dirección de las líneas.

Los comparadores analógicos comparten línea con ambos puertos. Como no se van a utilizar, se pueden desactivar para reducir el consumo y para obtener el máximo de líneas de entrada/salida digitales posible. Esto se hace poniendo los bits CM del registro CMCON0 como muestra la figura siguiente.

Para reducir el consumo, se deben desactivar las tensiones de referencia de los comparadores. Para ello, en el registro VRCON el bit VREN debe ser desactivado (0), el bit VRR debe activarse (1) y los bits VR deben ponerse a cero.

Temporizadores

El microcontrolador dispone de dos temporizadores, uno de 8bits y otro de 16bits. Ambos pueden funcionar como temporizadores o como contadores ante una señal externa. Se describen a continuación

  • Temporizador 0 (Timer 0)

    EL temporizador 0 se puede configurar como contador o temporizador de 8 bits el cual; puede ser escalado para obtener mayores cuentas, puede generar una interrupción cuando se desborda, se puede configurar para que trabaje con una fuente de reloj interna o externa, se puede configurar el tipo de flanco del reloj externo que lo incrementa.

    Si se utiliza como temporizador, el módulo incrementará cada ciclo de instrucción (4 ciclos de reloj) si no se le aplica el escalado. Si se utiliza como contador, el módulo incrementará cada flanco de subida o de bajada, según se configure, de la línea T0CKI.

    Los registros que le afectan se muestran a continuación.

    Para seleccionar el modo de operación del módulo, se utiliza el bit T0CS del registro OPTION: si es 0 se comporta como un temporizador y si es 1 como un contador. Para seleccionar el tipo de flanco que incrementará en el modo contador, se utiliza el bit T0SE: 1 incrementa en los flancos de bajada y 0 en los de subida.

    El registro que contiene el valor de la cuenta es el registro TMR0, dicho registro puede ser leído y escrito, por ejemplo puede ser cargado a un valor inicial antes de iniciar la cuenta.

    El escalado para obtener mayores cuentas se le puede aplicar al perro guardián (watchdog) o al temporizador 0, dependiendo del valor del bit PSA del registro OPTION (1 al Watchdog y 0 al Timer0). El escalado se configura mediante los bits PS del registro OPTION, que se muestran en la tabla siguiente.

  • Temporizador 1 (Timer 1)

    El temporizador 1 es un contador de 16bits al que se accede mediante dos registros, TMR1H y TMR1L. La escritura en cualquiera de ellos actualiza el contador. Cuando se utiliza con una fuente interna se comporta como un temporizador y cuando se utiliza con una fuente externa se puede comportar como un temporizador o como un contador.

    Cuando funciona como contador con una fuente externa, se incrementa cada flanco de subida aplicado a la línea T1CKI. Además, se puede sincronizar con el reloj del sistema o funcionar de forma asíncrona.

    Hay que destacar que durante el modo de operación de bajo consumo sólo permanecerá activo si opera con una fuente externa, además podrá interrupirlo, o con el oscilador interno de baja frecuencia con el cual no podrá generar interrupciones.

    La tabla siguiente muestra los registros que afectan al temporizador 1. El más importante es el registro T1CON.

    Al temporizador 1 se le puede aplicar un escalado de 1,2,4 o 8 divisiones de la fuente de reloj. El valor se configura mediante los bits T1CKPS del registro T1CON.

    El bit TMR1CS del registro T1CON selecciona la fuente de reloj. Cuando es 0 la fuente es el ciclo de instrucción (Fosc/4) y cuando es 1 el reloj está suministrado externamente.

    Para activar/desactivar el temporizador se utiliza el bit TMR1ON del registro T1CON.

El Watchdog o perro guardián

El perro guardián consiste en un contador que funciona con los pulsos del oscilador interno de baja frecuencia (31kHz) y provoca una señal de reset cuando se desborda en funcionamiento normal. Si el desbordamiento se produce en el modo de bajo consumo (SLEEP), el microcontrolador se despierta y sigue con su funcionamiento normal. Las instrucciones CLRWDT y SLEEP resetean el valor de la cuenta.

Se le pueden aplicar hasta dos escalados; el escalado compartido con el temporizador 0, ajustable mediante los bits PS del registro OPTION y asignable al perro guardián mediante el bit PSA del mismo registro, y un escalado propio de 16bits. La combinación de ambos escalados produce un tiempo de desbordamiento muy versátil, de hasta 268 segundos. Además, sus posibilidades de uso son muy amplias dado que el watchdog puede ser activado y desactivado mediante software cuando no ha sido activado previamente en la palabra de configuración CONFIG. Esto permite el uso del perro guardián como un temporizador con una gran base de tiempos y con un bajo consumo (2µA@3V) .

Los registros que afectan al módulo son los siguientes.

El watchdog se configura mediante el registro WDTCON el cual contiene el bit SWDTEN, que activa/desactiva el watchdog si el bit WDTE del registro config está deshabilitado, y los bits WDTPS, que fijan el valor del escalado de 16bits, tal y como muestra la figura siguiente.

Detector programable de baja tensión (PLVD)

El microcontrolador dispone de un módulo encargado de comparar la tensión de alimentación con una tensión de referencia. Si la tensión de alimentación es inferior a la referencia, el módulo genera una interrupción. Este módulo es útil para sistemas alimentados por batería, los cuales tienen una tensión constante salvo cuando se les demanda más corriente de la que pueden suministrar. Esto sucede cuando empiezan a estar agotadas las baterías.

La tabla siguiente muestra los registros que afectan al módulo.

Para su configuración, se utiliza el registro LVDCON. El bit LVDEN habilita (1) o deshabilita (0) el módulo. Para conocer la estabilidad de la referencia de tensión, dicho registro dispone del bit IRVST que indica si la referencia es estable (1) o no(0).

El módulo permite un ajuste de la tensión de referencia entre varios niveles. Dicho ajuste se realiza mediante los bits LVDL del registro LVDCON. La figura siguiente muestra los niveles en función del valor de dichos bits.

Hay que tener presente que el consumo típico de este módulo es de 25µA@3V, por lo que se debe realizar un uso prudente del mismo.

Memoria EEPROM

El microcontrolador dispone de una memoria EEPROM de 256 bytes que permite la lectura y escritura de un byte y puede ser leída o escrita para todo el rango de alimentación. Este tipo de memoria permite una mayor cantidad de ciclos de lectura y escritura que la memoria FLASH. Además, al ser independiente de la memoria de instrucciones, la escritura en esta memoria no afecta al funcionamiento del microcontrolador. La duración de la programación es de aproximadamente 10ms por byte. Esta programación está controlada automáticamente por un temporizador interno. Al escribir en una dirección, su contenido es borrado antes de introducir en nuevo dato.

Los registros que afectan al módulo son los siguientes.

El registro EEDAT es el usado para leer y escribir el dato, el registro EEADR es el usado para indicar la dirección del dato (se especifica una de las 256 posiciones de la memoria).

El registro EECON1 controla la lectura y la escritura (bits RD y WR), la habilitación de la escritura (bit WREN) y el error durante la escritura (bit WRERR).

Para realizar una lectura, se debe cargar la dirección a leer en el registro EEADR y se debe activar el bit RD del registro EECON1. Una vez hecho esto, en el siguiente ciclo de instrucción, el dato leído se encontrará en el registro EEDAT.

Para realizar una escritura se debe seguir una secuencia concreta:

  1. Se establece el dato a escribir y la dirección en los registros EEDAT y EEADR.
  2. Se habilita la escritura activando el bit WREN del registro EECON1.
  3. Se carga 0x55 en el registro EECON2.
  4. Se carga 0xAA en el registro EECON2.
  5. Se activa el bit WR del registro EECON1.
  6. Pasados aproximadamente 10ms, la escritura estará completada.

En el siguiente ejemplo se muestra el proceso de escritura en la memoria.

Resumen

Para trabajar más fácilmente he realizado un documento pdf donde se resume esta entrada. He pretendido que sea una hoja de consulta rápida a la hora de programar. Si se desea profundizar en los distintos aspectos, conviene remitirse al datasheet. Para facilitar la consulta del datasheet, cada parte del documento lleva indicado, entre paréntesis, el número de página correspondiente al datasheet donde se encuentra descrita esa parte.

Notas
1

Pipeline o segmentación es una técnica de ejecución simultánea de varias instrucciones. Esta técnica permite que una instrucción puede empezar a ejecutarse antes de que haya terminado la anterior. Es por esto que las instrucciones de salto suponen dos ciclos de instrucción, ya que no se conoce la instrucción siguiente hasta una vez realizado del salto. Más información.

Referencias

Microchip PIC 16F636 datasheet.

MARTÍN CUENCA, E.;ANGULO USATEGUI, J.M.;ANGULO MARTÍNEZ, I. Microcontroladores PIC, la clave del diseño.
Madrid: Thomson, 2003. 452 p.
ISBN:8497321995