Mostrando entradas con la etiqueta μC. Mostrar todas las entradas
Mostrando entradas con la etiqueta μC. Mostrar todas las entradas

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.

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.

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.