Mostrando entradas con la etiqueta Documentación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Documentación. Mostrar todas las entradas

Comunicación: El protocolo

Para la comunicación inalámbrica, el objetivo principal es el bajo consumo por lo que el protocolo se debe adaptar a él además las interferencias del canal hacen necesario incluir elementos de varificación de datos.

Configuración de la comunicación

El transceptor permite configurar diversos aspectos de la comunicación.

Se trabajará en modo ShockBurst dadas sus ventajas (ver la entrada del transceptor). En este modo, la velocidad de la comunicación se puede configurar de 1Mbps o de 250Kbps. Puesto que la velocidad no es crítica en la aplicación, se ha decidido establecerla a 250Kbps dado que su consumo en transmisión y en recepción es algo menor y la sensibilidad es -10dBm mayor.

Protocolo de comunicación

El protocolo se puede dividir en dos partes, el inicio de conexión y la comunicación.

El inicio de conexión es la parte del protocolo que define el mecanismo de la unión de un sensor a la red. Se parte de que cada nodo sensor dispone de una dirección única establecida durante la programación. Este mecanismo se inicia cuando el sensor envía un paquete de inicio de conexión al nodo de adquisición. Una vez el paquete es enviado, el sensor entra en modo de recepción, escucha del canal, esperando un paquete de confirmación de la conexión por parte del nodo de adquisición. Una vez el nodo sensor ha recibido este paquete, se considera que está conectado.

Puesto que los nodos sensores son autónomos y requieren un bajo consumo son los que fijan el protocolo de comunicación. El transceptor es el componente que supone un mayor consumo, es por esto que se debe intentar que esté activo el menor tiempo posible.

Tal y como se ha descrito en entradas anteriores, la comunicación la fija el funcionamiento del nodo sensor; el nodo de adquisición se encuentra siempre a la escucha y es tras una medida del nodo sensor cuando el nodo de adquisición tiene un breve espacio de tiempo para enviarle un comando al sensor. Este funcionamiento supone que el nodo de adquisición no podrá enviar un comando al nodo sensor hasta que este le envíe una medida. Hay que tener en cuenta que el tiempo entre medidas es configurable entre 5 segundos y 21 minutos.

Topología de los paquetes o tramas

Tal y como se ha comentado, el paquete en el modo Shockburst se puede dividir en tres partes; la dirección, los datos y el CRC. En total el tamaño del paquete no debe superar los 256 bits (32 bytes) puediendo tener la dirección un tamaño de hasta 40 bits (5 bytes) y el CRC un tamaño de 8 o 16 bits (1 o 2 bytes).

Actualmente la banda ISM es muy utilizada, es por esto que el sistema se encontrará con multitud de interferencias. Para hacer más robusta la comunicación y evitar la recepción de paquetes erróneos, se ha tomado una dirección y un CRC de 2 bytes, 65536 combinaciones posibles.

Para definir la longitud de los datos se debe tener en cuenta los elementos que forman la trama de datos. Estos elementos son la identificación, los comandos y los argumentos.

  • La identificación

    Cuando el sensor se comunica con el nodo de adquisición, el sensor debe indicar su dirección o algún dato que lo identifique ya que el paquete no incluye ninguna información acerca del origen del mismo. Se podría pensar en incluir la totalidad de la dirección del enviante pero esto supondría incluir 2 bytes a los datos con el consiguiente aumento del tiempo en el aire, y por tanto consumo, que esto supone. Por ello se emplea el siguiente modo que reduce la información de la dirección a un único byte al que he nombrado identificación o ID.

    Básicamente lo que se hace es repetir la información; se divide la dirección en dos, obteniéndose un byte de mayor peso (MSB, most significative byte) y un byte menor peso (LSB, least significative byte). Se establece que el byte de mayor peso es el byte de menor peso negado, la figura siguiente muestra un ejemplo.

    De este modo, con un solo byte se puede obtener la dirección completa negándolo bit a bit. Al haber un solo byte único, el de menor peso, el sistema permitiría introducir hasta 256 sensores lo cual es excesivo para el propósito del proyecto.Por ello, este byte de menor peso a su vez se divide en dos, teniéndose por un lado los 4 bits más significativos (MSb) y los 4 bits menos significativos (LSb). De este modo son los cuatro bits menos significativos los que realmente contienen un número único que identifica cada sensor. Los 4 bits más significativos pueden contener cualquier valor y se utilizan para evitar direcciones poco robustas como por ejemplo 0xFF00. Se deduce entonces que la red podrá disponer de hasta 16 sensores (24), valor óptimo para el propósito del proyecto.

    Se concluye entonces que el tamaño de la identificación es de un byte.

  • Los comandos y los argumentos

    Los comandos son identificadores únicos que indican una acción a realizar al nodo destino. Algunos comandos pueden necesitar de argumentos que son datos que lo complementan.

    Los comandos se han diseñado de modo que se pueda realizar una verificación del mismo rápida. De este modo al recibir un comando incorrecto se detendrá el procesado y se continuará con el funcionamiento normal.

    Dado que las necesidades de comunicación no son extensas, se ha decidido que se puedan definir hasta 16 comandos. Esto es debido a que el mecanismo de verificación empleado consiste en que los comandos son de un byte y que los cuatro bits más significativos son los cuatro bits menos significativos negados. Por lo tanto, para comprobar el comando se ha implementado la función siguiente.

       
    unsigned char verify_cmd(unsigned char command)
    {
            return((command&0x0F)==((~command)&0xF0)>>4);
    }

Los comandos y los argumentos establecen en gran medida la trama de los datos, se pueden distinguir las siguientes tramas.

  • Trama de envío de medidas.

    Esta trama la utilizan únicamente los nodos sensores. Es la trama más importante al ser la más utilizada. Es por esto que es la que fija la longitud máxima de la trama de datos. A máxima resolución, las medidas suponen 12 bits para la HR y 14 bits para la temperatura que, para simplificar el procesado, se envían en 16 bits de modo que ambas medidas suponen 4 bytes.

  • Trama de inicio de conexión.

    Esta trama la utilizan únicamente los nodos sensores. Se puede observar que la trama incluye toda la información posible acerca del sensor para que el nodo de adquisición conozca el estado del sensor. Es decir, se incluye la dirección completa del nodo sensor (de este modo se verifica la trama), los dos bytes de configuración del transceptor (uno contiene el canal y el otro la potencia de transmisión) y el byte de configuración del sensor (contiene la resolución a la que opera, el estado del calentador y el estado de la batería). Esta trama no contiene identificación ya que esta la fija el nodo de adquisición.

  • Trama de confirmación de la conexión.

    Esta trama la utiliza únicamente el nodo de adquisición. Mediante esta trama se confirma la conexión a la red y se establece la identificación.

  • Trama de configuración

    Esta trama puede ser utilizada por ambos tipos de nodos y permite el envío de dos comandos a la vez. Se observa que la longitud máxima de cada argumento es de un byte. Esto es así debido a que los argumentos de la mayoría de los comandos, que precisan de argumentos, son de este tamaño.

Las necesidades de comunicación entre el nodo sensor y el nodo de adquisición no son las mismas que entre el nodo de adquisición y el sensor, es por esto que se definen dos listados de comandos.

  • Nodo sensor → nodo de adquisición

    • CMD_MEAS_DATA 0xF0. Indica que los argumentos son las medidas realizadas.
    • CMD_MY_NAME_IS 0xE1. Pide la
  • Nodo de adquisición → nodo sensor

Bloque sensor: Diseño Software para bajo consumo.

El microcontrolador tiene líneas que pueden configurarse como entradas analógicas o como entradas/salidas digitales. Hay que tener en cuenta las señales que se aplican a estos pines ya que pueden suponer un consumo de corriente elevado.

Una línea de entrada digital consume la mayor cantidad de corriente cuando la tensión de entrada está entre la tensión de alimentación y la referencia. Esto es debido a que si la tensión de entrada está próxima al punto medio entre la alimentación y la referencia, los transistores que forman el buffer de entrada se polarizan en la región lineal lo que introduce un consumo de corriente considerable. Esto se puede evitar si cada línea puede configurarse como una entrada analógica, ya que este buffer se desconecta reduciendo así la corriente de la línea. Esto es debido a que las entradas analógicas tienen una impedancia de entrada muy elevada por lo que su consumo es mínimo.

Es por esto que si una línea no se utiliza, puede dejarse desconectada y configurada como línea de salida con un nivel lógico definido o se puede configurar como una entrada fija, externamente, a un nivel lógico definido.

También se debe tener en cuenta a la hora de inicializar un puerto, que tras un Power-on Reset, reset al alimentar al dispositivo, algunos registros como los PORT, los registros que contienen el valor de la línea, tienen un valor desconocido. Si los registros TRIS, los registros que configuran la dirección de la línea, se configuran antes que los PORT, es posible que se generen pulsos de corriente durante la inicialización del puerto. Por ejemplo, una forma segura de inicializar un puerto es primero borrar el contenido del registro PORT y luego configurar las líneas del puerto como salidas.

Referencias

Microchip Low Power solutions: Tips'n'Tricks.

Bloque sensor: Software, módulos principales

Seleccionadas las herramientas, he procedido a realizar el programa del sensor.

Antes de programar la funcionalidad completa del módulo sensor, se ha realizado la programación de los módulos de comunicación con el transceptor y con el sensor. De este modo, se puede verificar su funcionamiento independientemente. Así se reducen los problemas de depurado.

Comunicación con el transceptor

Tal y como se comentó en la entrada del transceptor, el protocolo de comunicación utiliza una línea de reloj y otra de datos, a parte de las líneas de configuración. Donde la frecuencia de la línea de reloj no podía ser superior a 1Mbps, es decir la duración mínima de cada bit debe ser de 1µs. Para reducir el tiempo de comunicación durante el cual el microcontrolador y el transceptor están activos, es decir suponen un consumo de corriente, se intentará operar a la frecuencia máxima.

Revisando la entrada del transceptor, se deduce que este módulo necesitará de, como mínimo, las siguientes funciones:

  • Enviar un paquete de datos a una dirección.
  • Entrar en modo recepción durante un tiempo y obtener el paquete recibido si es el caso.
  • Configurar el transceptor. Ya sea configurar la palabra completa (15bytes) o sólo una parte.

Donde se observa que a la función de enviar se le manda un paquete de datos y la de recibir lo devuelve. Este paquete que se enviará consiste en una serie de bytes que contienen la dirección y el dato. Para realizar un código más inteligible, se ha realizado una estructura que contiene un vector de bytes para la dirección y otro para los datos:

 
struct package
{
        unsigned char address[LEN_ADDR];
        unsigned char data[LEN_DATA];
};

Donde LEN_ADDR y LEN_DATA son macros que contienen la longitud de la dirección y de los datos respectivamente.

Tal y como se observa en la figura siguiente, el módulo dispone de tres funciones de uso interno o privadas (con fondo gris) cuya función se muestra a continuación. Son de alcance privado porque implementan una funcionalidad que se utiliza en más de una ocasión.

  • void RF_putByte(unsigned char databyte)

    Esta función le pasa bit a bit el byte al transceptor. Para ello, se le aplica al byte una máscara de un bit que se va desplazando.

  • void RF_configTx(void) y void RF_configRx(void)

    Estos métodos configuran al transceptor con un único bit el cual fija el modo de operación; en transmisión o en recepción.

Entonces, a la función enviar (RF_send) se le pasa la estructura package que contiene la dirección y los datos a enviar. Esta función configura el transceptor en modo transmisión (usa el método RF_configTx) y le pasa los datos del paquete al transceptor (mediante la función RF_putByte).

La función recibir (RF_receive) se le pasa un puntero con la estructura package donde almacenará los datos recibidos y un byte el cual fija el tiempo durante el cual el transceptor estará recibiendo. Durante este tiempo el microcontrolador está en modo de bajo consumo y es despertado por el perro guardián. Entonces el byte que hace configurable el tiempo fija el valor del prescaler del perro guardián. Al igual que para la función enviar, esta función hace uso de las funciones RF_putByte y RF_configRx.

Para configurar el transceptor está la función RF_configure, a la cual se le pasa un vector de bytes con los bytes de configuración y un byte que indica la longitud del vector. De este modo, se pueden configurar el número de bytes que se desee, 15 como máximo, teniendo en cuenta que el primer byte, posición 0 del vector, deberá ser el más significativo. Esta función hace uso de la función RF_putByte.

Para configurar de forma más cómoda los 15bytes del transceptor, se han creado una serie de macros o etiquetas que se encuentran en el fichero de cabecera transceiver.h. Se muestra un ejemplo a continuación.

 
const unsigned char transceiver_config[15]={DATA2_W,DATA1_W,ADDR2_4,ADDR2_3,ADDR2_2,ADDR2_1,
ADDR2_0,ADDR1_4,ADDR1_3,ADDR1_2,MY_ADDRESS_H,MY_ADDRESS_L,ADDR_W_16b|CRC_16b|CRC_EN_ENABLE,
RX2_EN_DISABLE|CM_SHOCKBURST|RFDR_SB_250KB|XO_F16MHZ|RF_PWR_20,RF_CH|RXEN_TX};

Comunicación con el sensor

La comunicación con el sensor se realiza mediante dos líneas, una de reloj y otra de datos. Como se ha visto, el sensor dispone de un registro de estado de un byte, que puede ser leído y escrito, y de una serie de comandos que permiten escritura/lectura de el registro de estado, realizar una medida de temperatura/humedad relativa y realizar un reset "suave".

Las funciones implementadas se muestran en la figura siguiente. Las de fondo gris son de uso interno o privadas. Su funcionalidad es la siguiente:

  • void S_putByte(const unsigned char databyte)

    Esta función gestiona la línea de datos y la de reloj enviándole al sensor el byte bit a bit. Para ello hace uso de una máscara con la que se obtiene el contenido del byte bit a bit.

  • unsigned char S_getByte(const unsigned char ack)

    Realiza el proceso inverso de la función anterior. Se comprueba la línea de datos y se va desplazando una máscara de un bit cada flanco de la línea de reloj. De este modo, cuando la línea de datos tenga el nivel lógico 1, su posición en el byte a obtener viene indicada por la máscara. El parámetro ack indica si se debe confirmar o no la recepción del byte. Mediante este parámetro se puede controlar el leer o no el CRC al confirmar o no la recepción del dato completo.

  • void S_transStart(void)

    Es un método que realiza la secuencia de inicio de transmisión. Esta secuencia se realiza cada vez que se desea comunicarse con el sensor.

De la figura se observa que existen dos métodos accesibles por el programador, el método S_resetConnection y S_softReset. Ambos realizan un reset del sensor con la diferencia de que el método S_resetConnection resetea únicamente la comunicación, y el método S_softReset resetea la comunicación y el registro de estado.

En cuanto a las funciones, la función S_read_status obtiene el registro de estado del sensor ( un byte). La función S_write_status envía al sensor el registro de estado que se le indica. Para facilitar la escritura del registro de estado, el fichero de cabecera sensor.h dispone de diversas macros. A continuación se muestra un ejemplo de su uso.

 
S_write_status(HEATER_OFF|OTP_NO_RELOAD|T14b_HR12b);    //Sensor wont reload OTP mem

La función más importante es S_measure, la encargada de realizar las medidas. Se le pasan como argumentos un puntero a una estructura del tipo measures, que se describe a continuación, y un parámetro que indica el tipo de medida; de humedad relativa o de temperatura. Para este último argumento se han definido dos macros, TEMP y RHUM, los cuales facilitan su uso. Respecto a la estructura del tipo measures se trata de una estructura que contiene un vector de dos bytes. Esto se ha realizado de este modo, para hacer más eficiente la función al operar con un puntero. A continuación se muestra la definición de la estructura measures.

 
struct measures
{
        unsigned char data[2]; //2 bytes because the maximum measure resolution is 14bits
};

Tal y como se comentó en la entrada del sensor, éste tarda un tiempo considerable en realizar las medidas. Es por esto que ese tiempo, para reducir el consumo, el microcontrolador se encuentra en modo de bajo consumo. Para sacar del modo de bajo consumo al microcontrolador una vez la medida esté disponible, se utiliza la interrupción ante un cambio de nivel (InterruptOnChange) que implementan las líneas del puerto A del microcontrolador. Este cambio de nivel es realizado por el sensor sobre la línea de datos; cuando la medida ha finalizado, pone la línea de datos a nivel bajo tal y como se comentó en la entrada del sensor.

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.

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

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

Una vez presentadas las alternativas, solo queda decantarse por una. Por su reducido consumo y la versatibilidad de la familia completa, he decidido seleccionar la gama media (PIC16) de la familia PIC de Microchip. Durante el estudio se ha observado que algunos dispositivos de la gama alta de la familia PIC (PIC18) disponen de las características necesarias para el bloque maestro, en concreto la comunicación con el PC. Esto supone una serie de ventajas como facilidad al programar dado que previamente se ha estudiado la familia media y reducción de las herramientas puesto que los programadores hardware suelen programar dispositivos de todas las gamas.

La gama media de la familia PIC de Microchip

  • Consumo

    Algunos dispositivos de esta familia contienen una tecnología propietaria llamada nanoWatt, la cual consigue un menor consumo y permite gestionar la potencia consumida de forma dinámica mediante diversos módulos.

    Como se ha comentado en entradas anteriores, en el consumo influyen, principalmente, la tensión de alimentación y la frecuencia de funcionamiento. Como se observa en la figura siguiente, dicha tecnología tiene dos relojes internos, uno de 8MHz y otro de 31kHZ, a los que permite un escalado dinámico de la frecuencia entre ocho diferentes (8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz y 31kHz) logrando así un rango de consumo de corriente dinámica entre 700µA@8MHz y 16µA@31kHz a 3V.

  • Periféricos

    La gama de PIC16 con tecnología nanoWatt pueden integrar los siguientes periféricos: uno o dos comparadores analógicos, 128 o 256 bytes de memoria EEPROM, un conversor analógico-digital de 10 bits con hasta 14 canales y periféricos de comunicación USART/ I2C/ SPI.

  • Número de pines

    Dentro de la gama PIC16 con tecnología nanoWatt, se pueden encontrar dispositivos con 6,12,16,18,25 y 36 pines de entrada/salida. Como se comentó en la entrada anterior, un dispositivo de 12 pines suple con creces las necesidades del sistema.

Selección del dispositivo

Conocida la famila, falta seleccionar el dispositivo de la misma más adecuado para el proyecto.

En concreto, el microcontrolador seleccionado de dicha familia, es el modelo PIC16F636 (coste 0.91€ PDIP y 0.82€ SOIC para el mínimo de unidades) dado que, como se muestra en la siguiente tabla1, es el que mejor se ajusta a las necesidades del proyecto. Se observa como el modelo PIC16F631 es similar, se diferencian en el número de pines de entrada/salida y en el tamaño de la memoria FLASH, de la memoria RAM y de la memoria EEPROM; ambos son totalmente intercambiables por lo que, para dimensionar mejor el sistema, en el caso de que el programa diseñado sea inferior a la memoria disponible del PIC16F631, se migrará a este.

Como se observa en la tabla, el microcontrolador seleccionado dispone de dos comparadores analógicos que no son útiles en el bloque sensor, toda la familia excepto dos dispositivos, disponen de uno como mínimo, siendo desactibables. También se observa que dispone de 256 bytes de memoria EEPROM, la cual será utilizada para almacenar medidas en caso de un fallo en la comunicación con el bloque maestro.

Notas
1

Se ha omitido el resto de la tabla puesto que los dispositivos siguientes contienen diversos periféricos no útiles para el sistema. No obstante, la tabla completa se puede consultar en la 5ª hoja de este enlace.

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

Se conocen perfectamente los componentes más importantes del bloque sensor: el sensor y el transceptor. Por lo tanto, ya se puede seleccionar el microcontrolador, el cual será el encargado comunicarse con ambos dispositivos y procesar los datos.

Características necesarias

Las características que debe cumplir el microcontrolador son:

  • Número de pines necesarios

    Esta característica la fijan en gran medida los componentes que forman el bloque sensor. Como se ha mostrado en entradas anteriores, el sensor necesita dos líneas para la comunicación (DATA y SCK) y el transceptor necesita cinco para un solo transceptor (CLK1, DR1, DOUT1, CS y CE) y ocho para dos (CLK2, DR2 y DOUT2). En el módulo sensor sólo se utilizará un transceptor de los dos disponibles, por lo que el número total de líneas estrictamente necesarias es de siete. Es importante especificar las características de cada línea pues hay microcontroladores con líneas de sólo entrada, de sólo salida y bidireccionales. La tabla siguiente muestra las líneas con el tipo de estas.

    Además de estas líneas, puede ser interesante utilizar una línea más conectada a la alimentación del transceptor, para alimentarlo o no según el uso. De este modo se reduciría el consumo estático del sistema dado que el consumo en reposo del transceptor es relativamente alto.

    También son necesarias otras líneas para interactuar con el usuario, tales como LED o pulsadores; por ello las líneas disponibles del microcontrolador deben ser algo mayores de siete.

  • Periféricos

    Actualmente los microcontroladores disponen de diversos periféricos que dotan al microcontrolador con diversas funcionalidades adicionales, tales como: conversores analógico-digital y/o digital-analógico, comparadores, periféricos de comunicación específica como USART, I2C, SPI, USB, etc. Normalmente estos periféricos son activables y desactibables durante la programación por lo que no suponen un consumo en el caso de no ser utilizados. No obstante se intentará utilizar un microcontrolador con los periféricos estrictamente necesarios.

    En un principio, la aplicación puede necesitar de periféricos y/o modos que permitan una gestión del consumo.

  • Consumo

    Al tratarse de un sistema alimentado por batería, es necesario obtener el mínimo consumo posible. En concreto, para el bloque sensor se prioriza el consumo, ya que se pide un dispositivo sensor autónomo e independiente durante el máximo tiempo posible. Es por esto que el microcontrolador debe consumir el mínimo posible de corriente y debe disponer de modos de ahorro de energía.

    El consumo de un componente electrónico digital se puede dividir en consumo en estado estacionario y en estado dinámico.

    • El consumo en estado estacionario es el consumo que se produce por el mero hecho de alimentar al dispositivo. Este consumo es debido a la corriente de fugas vinculada a los transistores que forman la lógica CMOS.
    • El consumo en estado dinámico es el consumo que se produce cuando el dispositivo está en funcionamiento. Este consumo es debido principalmente a la corriente de conmutación de los CMOS las cuales son sensibles a la tensión de operación y a la frecuencia de conmutación.

    Entonces, la potencia total consumida de un circuito integrado viene dada por la expresión siguiente:

    Es decir, el consumo total es la suma del consumo en estado estacionario, en estado dinámico y el debido a las pérdidas de conmutación. Tal y como se ha comentado, se observa que el consumo en estado estacionario depende de la corriente de fugas y de la tensión de alimentación. El consumo en estado dinámico, al estar causado por los procesos de carga y descarga de capacidades, depende de la capacidad, de la frecuencia y de la tensión de alimentación. El consumo de las pérdidas de conmutación es debido al pico de corriente producido durante la transición de estados, es por esto que depende de los tiempos de subida y de bajada, de la corriente de pico producida, de la frecuencia y de la tensión de alimentación.

    Entonces, se observa como una medida eficaz para reducir el consumo del circuito integrado consiste en reducir la tensión de alimentación. También es interesante reducir la frecuencia de operación aunque, para determinadas aplicaciones, compensa en promedio trabajar con altas frecuencias durante cortos periodos de tiempo. También se debe tener en cuenta fijar estados claros en las entradas del microcontrolador, ya que un estado indeterminado produciría un cierto consumo por pérdidas.

  • Tensión de operación

    Como se ha comentado anteriormente, el consumo está relacionado con la tensión de alimentación por lo que se forzará a la mínima posible. Para ello, se consideran las tensiones mínimas de alimentación de los dispositivos que forman el módulo sensor. Como se ha comentado en entradas anteriores, la tensión de alimentación del transceptor puede comprender valores entre 1.9 y 3.6 V, y la tensión de alimentación del sensor puede comprender valores entre 2.4 y 5.5 V. Por lo que se tomará una tensión de alimentación de 2.5 Voltios ya que el sensor tiene el rango más restrictivo.

  • Frecuencia de funcionamiento

    La frecuencia de funcionamiento, en esta aplicación, viene determinada únicamente por los componentes que forman el bloque sensor ya que la velocidad sólo es necesaria en la comunicación con ambos componentes.

    Como se ha expuesto en entradas anteriores. Tanto el sensor como el transceptor pueden llegar, como máximo, a comunicarse a una frecuencia de 1MHz sin tener un mínimo. Teniendo en cuenta que una señal de reloj, normalmente, supone dos instrucciones; estrictamente el ciclo de instrucción debe ser de 500ns. Lo que según la arquitectura del microcontrolador implica una frecuencia de reloj distinta. No obstante, se puede trabajar a una frecuencia menor.

Alternativas

Los siguientes dispositivos cumplen con las características necesarias para el proyecto; se han destacado sus características principales para encontrar la solución óptima:

  • La familia S08QE de Freescale. [ver datasheet]

    Es la familia de bajo consumo de Freescale; típicamente a 1MHz y con todos los periféricos funcionando consume una corriente de 800µA@3V y con todos los periféricos detenidos consume una corriente de 510µA@3V. Además dispone de varios modos de operación de bajo consumo. Por otra parte, estos dispositivos suelen integrar diversos periféricos la mayoría de los cuales no son útiles en este diseño, exceptuando el módulo RTC (Real Time Counter, contador en tiempo real) el cual supondría precisión en el tiempo entre medidas. También hay que destacar la falta de un oscilador interno integrado.

  • La familia MSP430 de Texas Instruments. [ver datasheet]

    Es una familia de muy bajo consumo de Texas Instruments; típicamente a 1MHz consume una corriente de 300µA@3V. Además dispone de varios modos de operación de bajo consumo. Esta familia suele integrar periféricos como conversores analógico-digital de varios tipos, comparadores analógicos y periféricos de comunicación UART o USI (ISP o I2C). En concreto todos los dispositivos de esta familia disponen de un periférico de conversión analógico-digital. En este sentido el dispositivo no es óptimo para el sistema. Otra característica a tener en cuenta es el oscilador interno de frecuencia seleccionable.

  • La gama media de la familia PIC de Microchip. [ver datasheet]

    En general, es la familia de rango medio microcontroladores de Microchip. Dicha familia contiene dispositivos que integran una tecnología propietaria de muy bajo consumo llamada nanoWatt. Los dispositivos que integran dicha tecnología consumen típicamente a 1MHz una corriente de 220µA@3V. Además, dicha tecnología supone la integración de periféricos de bajo consumo como un oscilador interno seleccionable dinámicamente entre ocho frecuencias distintas y como un temporizador de muy bajo consumo (Ultra Low Power Wake Up Timer, temporizador despertador1 de muy bajo consumo). Esta familia de microcontroladores es muy amplia (gama baja,media y alta), oferta una gran diversidad de modelos con prestaciones y recursos muy diferentes, lo que facilita un cambio de dispositivo en caso de futuras necesidades. En cuanto a los periféricos la familia contiene dispositivos con periféricos muy variados y, al tratarse de una familia tan extensa, adaptables para diversas aplicaciones.

Notas
1

Normalmente, al modo de operación bajo consumo de los microcontroladores se le conoce como dormir (Sleep), entonces el término despertador se entiende como salir del modo de bajo consumo.