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

No hay comentarios: