Entendiendo los Bits de Configuración en el PIC16 de Microchip
Los bits de configuración, llamados también colectivamente "palabra de configuración" permiten reconfigurar ciertos aspectos generales del funcionamiento del microcontrolador, estos bits de configuración se guardan en una localización específica de la memoria de programa del PIC y se graban al mismo momento que el código de programación.
En este artículo se explica brevemente:
- Qué son los bits (palabras) de configuración
- Su función y uso
- Su inclusión en código ensamblador y el lenguaje C.
En la ejecución normal del programa estos bits no son accesibles y no pueden cambiarse (solo al momento de la grabación de la memoria de programa). El estado por defecto de los bits de configuración cuando no han sido programados es de "1" lógico; por consiguiente programar los bits de configuración del PIC equivale a asignarles un valor de "0" lógico.
Bits en la Palabra de Configuración
No todos los PICs tiene exactamente los mismos bits de configuración, tampoco la misma cantidad, sin embargo ciertos bits son comunes a la mayoría de ellos y son esos los que se detallan en este artículo.
Bits de Protección de Código (Code Protection bits): CP1..CP0
11 = Protección de código deshabilitada
10 = Depende de cada dispositivo, ver hoja de datos
01 = Depende de cada dispositivo, ver hoja de datos
00 = Toda la memoria de programa protegida
Algunos dispositivos usan solamente un bit (CP0) para determinar la protección de código según la siguiente descripción:
1 = Protección de código deshabilitada
0 = Protección de código habilitada
Recomendaciones
Cuando se ha activado la protección de código en un dispositivo, la memoria de éste ya no puede ser re-leída para verificación; de ahí que al verificar el código programado se obtenga un mensaje de error que haría suponer que el código de programa no se ha grabado correctamente, sin embargo éste no es el caso.
Bit de Protección de Memoria EEPROM de Datos (Data EEPROM Memory Code Protection bit): DP
Este bit está presente solamente cuando el dispositivo posee memoria EEPROM de datos, adicionalmente a su memoria ROM (flash) de programa.
1 = Protección de código deshabilitada
0 = Protección de memoria EEPROOM de datos habilitada
* Bit de Habilitación de Reinicio por Apagón (Brown-out Reset Enable bit): BOREN
1 = BOR habilitado
0 = BOR deshabilitado
Al habilitar el Reinicio por Apagón (Brown-out Reset) éste habilita automáticamente el Temporizador de Encendido (Power-up Timer /PWRTE), es así que se recomienda directamente habilitar este bit (/PWRTE) siempre que se habilite el Reinicio por Apagón.
¿Qué es el Reinicio Por Apagón?
Es una característica de autoprotección en la que un circuito interno en el PIC monitorea el voltaje de alimentación que recibe; cuando por alguna falla de la fuente de voltaje el valor de éste baja por debajo de un cierto umbral (establecido en la hoja de datos de cada dispositivo), se produce un reinicio en hardware automático del microcontrolador, en este proceso se activa también el Temporizador de Encendido que deja pasar cierto tiempo antes de que el microcontrolador se habilite nuevamente, proveyendo un tiempo de resguardo hasta que el valor del voltaje de alimentación suba nuevamente a un valor seguro por encima del umbral establecido, si esto no sucede, el microcontrolador permanece en estado de reinicio hasta que se cumpla esa condición.
El Reinicio por Apagón es entonces una medida de seguridad para prevenir un funcionamiento erróneo o errático en el microcontrolador debido a bajones breves en el valor del voltaje de alimentación.
Recomendaciones
- En aplicaciones simples que no requieren alta confiabilidad generalmente es más práctico dejarlo deshabilitado (especialmente para los principiantes).
- Se ha visto empíricamente que algunos microcontroladores diseñados para trabajar con voltajes bajos (3.3V por ejemplo), podrían no fucionar del todo si se habilita el Reinicio por Apagón. Por ejemplo, en el caso del PIC16LF628A (al menos las primeras versiones), por diseño éste puede funcionar con voltajes desde 2 hasta 5.5V, sin embargo con Reinicio por Apagón habilitado sólo funcionara con voltajes arriba de 4V debido a que éste es típicamente el voltaje de umbral definido en su hoja de datos.
Bit de Habilitación de Temporizador de Encendido (Power-up Timer Enable bit): /PWRTE
1 = PWRT desabilitado
0 = PWRT habilitado
Al habilitar el Reinicio por Apagón (Brown-out Reset) se recomienda habilitar también el Temporizador de Encendido (Power-up Timer /PWRTE)debido a que este último es requerido también para el funcionamiento del Reinicio por Apagón.
Nota: Algunos microcontroladores PIC originales tienen invertida la polaridad de este bit.
¿Qué es el Temporizador de Encendido?
Es un temporizador que permite retardar por cierto tiempo (como ejemplo, son 72 ms de duración en el PIC16F628A) el encendido del microcontrolador como medida de protección hasta que al fuente de alimentación se estabilice. (Algunas fuentes de alimentación especialmente caseras pueden llegar a tener una rampa de acenso del valor de su voltaje demasiado lenta).
Recomendaciones
Es muy recomendable dejar siempre habilitado el Temporizador de Encendido.
Bit de Selección de Función del Pin /MCLR (MCLR Pin Function Select bit): MCLRE
1 = La función del pin es /MCLR
0 = La función del pin es de E/S digital. /MCLR está internamente conectado a VDD.
Recomendaciones:
- En microcontroladores que multiplexan (comparten) en un mismo pin la función /MCLR con un bit de E/S u otra función, se debe tener cuidado al deshabilitar /MCLR debido a que algunos programadores (especialmente los llamados "clonados") encuentran problemas en volver a programar un microcontrolador cuyo /MCLR ha sido deshabilitado.
- Por precaución dejar en lo posible habilitado el /MCLR.
Bit de Habilitación de "Perro Guardián" (Watchdog Timer Enable bit): WDTE
1 = WDT habilitado
0 = WDT desabilitado
¿Qué es el "Perro Guardián"?
El "Perro Guardián" (algunos prefieren llamarle simplemente "Guardián") es otra característica de seguridad en los microcontroladores cuyo objeto es prevenir que el microcontrolador se quede indefinidamente bloqueado o "colgado" debido a fallas en la lógica del software y en algunos casos debido a fallas de hardware causadas, entre otras cosas, por ruido electromagnético (impulsos) en ambientes de alto riesgo.
Vamos a ilustrar brevemente como ejemplo el primer caso:
Bloqueo en Código: Consideremos la siguiente porción de código:
La pieza de código anterior evalúa la función Serial_Disponible() para saber si hay un nuevo byte de recepción serial listo para ser leído; si no hay ningún byte disponible, la instrucción condicional "while" se repite indefinidamente hasta encontrar un nuevo byte disponible. Cuando se encuentra el nuevo, el programa avanza recién a la siguiente instrucción en la cual se lee el mismo y se lo almacena en la variable "caracter".
La lógica del algoritmo asume que tarde o temprano llegará el nuevo byte que uno espera, pero ¿qué pasa si por alguna falla externa el nuevo byte nunca llega? El microcontrolador se queda permanentemente bloqueado produciendo una falla catastrófica irrecuperable en la aplicación. No por nada a este tipo de código se le llama "código de bloqueo", pues bloquea al procesador temporalmente hasta que una determinada condición se cumple, pero puede bloquearlo también permanentemente si la condición nunca se cumple; en este caso, solamente un reinicio puede sacar al microcontrolador de su condición de bloqueo.
Es aquí donde el "Perro Guardián" juega su papel. El "Perro Guardián" es simplemente un temporizador que en su operación normal genera un reinicio general del microcontrolador una vez que su conteo ha sobrepasado el limite máximo (por ejemplo, alrededor de 18 ms como mínimo en el PIC16F628A). Para evitar este reinicio automático uno debe reiniciar el contador continuamente antes de que éste alcance su conteo máximo, para lo cual se hace uso de la instrucción especial en los PICs llamada CLRWDT (Clear Watchdog Timer, en ensamblador). A esta operación de reinicio de este temporizador se le dice coloquialmente "patear al perro". (La metáfora aquí es que el perro guardián sale de su casa a ladrar cada vez que un determinado tiempo se cumple; para que eso no pase, uno "patea" -con cariño, para los amantes de los animales- al perro para que entre nuevamente a su casa)
A fin de que el temporizador del "Guardían" sea reiniciado apropiadamente, la instrucción CLRWDT debe incluirse en el bucle principal que se repite indefinidamente y debe ejecutarse antes de los 18 ms (o lo que se especifique en la hoja de datos de cada dispositivo), de ese modo en cada repetición del bucle el temporizador será reincializado apropiadamente.
Volviendo a nuestro ejemplo anterior, ¿qué pasa si el código se bloquea permanentemente por alguna falla en el software o hardware? En este caso el temporizador del "Guardián" nunca se reinicia y cuando el conteo llega a su máximo se produce efectivamente el reinicio de todo el sistema, dándole al mismo la posibilidad de restaurarse a su funcionamiento normal.
Por supuesto que para empezar, la mejor solución es evitar de entrada utilizar este tipo de "código de bloqueo" en nuestros programas y dejar el "Perro Guardián" para otras circunstancias más inesperadas, sin embargo usamos el mencionado ejemplo por su simplicidad.
Recomendaciones
En sistemas sencillos que no requieran alta confiabilidad, o simplemente cuando uno está en etapa de desarrollo y prueba, se puede dejar deshabilitado el "Perro Guardián". Es más algunos recomiendan posponer la habilitación del mismo hasta las últimas etapas de desarrollo del sistema y alguno expertos van más allá y recomiendan evitar siempre el uso del "Perro Guardian" en el entendido de que uno debe prever en el desarrollo todas las posibles fallas que pudieran ocurrir y no dejar que el uso del "Guardián" se convierta en una "muleta" donde apoyar las malas prácticas de diseño. El uso del "Guardián" no es obligatorio, sin embargo en mi opinión se deben combinar ambas estrategias: Prever en el diseño las fallas que pudiera ocurrir proveyendo estrategias de recuperación de fallas en el sistema y finalmente incluir también el "Perro Guardián" como una última línea de defensa.
Bits de Selección de Oscilador (Oscillator Selection bits): FOSC1..FOSC0
11 = Oscilador RC (malla externa resistor-capacitor)
10 = Oscilador HS (cristal/resonador de alta velocidad)
01 = Oscilador XT (cristal/resonador)
00 = Oscilador LP (cristal de baja frecuencia y baja potencia)
Selección de Oscilador con Tres Bits
111 = Oscilador EXTRC con CLKOUT (externo RC con salida de reloj)
110 = Oscilador EXTRC (externo RC)
101 = INTRC con CLKOUT (interno RC con salida de reloj)
100 = INTRC (interno RC)
011 = Reservado
010 = Oscilador HS
001 = Oscilador XT
000 = Oscilador LP
Recomendaciones
- La malla RC externa es generalmente más económica, pero la frecuencia de oscilación no es muy estable y varía en función a factores como la precisión de los componentes, el desgaste por su uso y la temperatura ambiente.
- Los osciladores HS, XT y LP representan básicamente el uso de la misma técnica con la diferencia de que el tipo HS requiere mayor consumo de potencia; esto debido a que la ganancia del inversor en el circuito interno del oscilador es mayor, lo cual es necesario a fin de lograr frecuencias más altas. En cambio, el tipo LP (Low Power) es el que menor ganancia requiere y por lo tanto tiene menor consumo de potencia y como consecuencia sólo se alcanzan frecuencias relativamente bajas. El tipo XT es un tipo intermedio entre los dos anteriores.
Algunos de los microcontroladores más nuevos traen un oscilador RC interno cuyo bit de configuración está típicamente representado como:
INTRC: Oscilador interno de malla resistor-capacitor.
Típicamente un oscilador RC externo implementado con componentes muy baratos no provee mucha estabilidad y precisión en frecuencia y no son confiables como señal de referencia para la implementación de relojes o también protocolos de comunicación asíncrona con velocidad estándar predefinidas como es el caso con los dispositivos UART; simplemente porque la variación o desvío de la frecuencia es excesiva. Sin embargo los modelos de microcontroladores más recientes traen osciladores internos RC cuya precisión ha ido mejorando sustancialmente desde unos años atrás, su frecuencia es muy estable y permiten lograr comunicaciones tipo UART muy confiables, aunque obviamente la precisión todavía no se acerca a la de los cristales.
En suma, si lo que se busca es bajar costos, la elección es usar una malla RC externa o mejor aún el oscilador RC interno que muchos microcontroladores actuales traen incorporados y evitar así el uso de componentes externos adicionales. Si lo que se requiere es precisión, la elección es el cristal; si adicionalmente se requiere bajo consumo de potencia, un cristal LP de bajo consumo de potencia, y si lo que se requiere es velocidad, un cristal HS, pero tengamos siempre presente como regla general que, a mayor frecuencia es también mayor el consumo de corriente.
Ajuste de los Bits de Configuración en Programa
Existe la posibilidad de ajustar los bits de configuración directamente en el software de programación (como en el "PICkit Programmer" por ejemplo), o en una opción de menú en el entorno de desarrollo MPLAB (sólo las versiones 8.0 y anteriores permiten esto), sin embargo es mucho más recomendable incluir el ajuste de los bits de configuración directamente en el código.
Directiva de Configuración CONFIG en el MPASM
El ensamblador MPASM de Microchip permite especificar los bits de configuración directamente en código usando la directiva CONFIG como en el siguiente ejemplo:
Los símbolos usados en la directiva config hacen posible la configuración de cada bit con la polaridad correcta, están definidos en el archivo incluido con la directiva #INCLUDE. Para cada dispositivo se debe consultar específicamente los símbolos que están definidos y su nomenclatura correcta.
Símbolos de la Directiva __CONFIG
Los siguientes son algunos de los símbolos sacados de los archivos de cabecera (header files) de Microchip, hay que tomar en cuenta que no todos los símbolos está disponibles en un determindo dispositivo.
Osciladores:
_RC_OSC
_EXTRC_OSC
_EXTRC_OSC_CLKOUT
_EXTRC_OSC_NOCLKOUT
_INTRC_OSC
_INTRC_OSC_CLKOUT
_INTRC_OSC_NOCLKOUT
_LP_OSC
_XT_OSC
_HS_OSC
Temporizador de "Perro Guardián" (Watch Dog Timer):
_WDT_ON
_WDT_OFF
Temporizador de Encendido (Power-up Timer):
_PWRTE_ON
_PWRTE_OFF
Reinicio por Apagón (Brown-out Reset):
_BODEN_ON
_BODEN_OFF
Habilitación o Reinicio Maestro (Master Clear Enable)
_MCLRE_ON
_MCLRE_OFF
Protección de Código (Code Protect)
_CP_ALL
_CP_ON
_CP_75
_CP_50
_CP_OFF
Protección de Memoria EEPROM (Code Protect Data EEPROM):
_DP_ON
_DP_OFF
Protección de Memoria de Configuración (Code Protect Calibration Space):
_CPC_ON
_CPC_OFF
Directiva de Configuración CONFIG con el Compilador PICC de Hi-Tech
Con este compilador se pueden especificar los bits de configuración usando también una directiva CONFIG, veamos en el siguiente ejemplo:
Todos los símbolos para los bits de configuración se encuentran definidos también en los archivos de inclusión de este compilador para cada dispositivo. En el caso del PIC16F628A por ejemplo, éstos se encuentran definidos en el archivo "pic16f628.h" que se encuentra en el directorio "include" del compilador y especifica los siguientes símbolos:
Directiva de Configuración con Otros Compiladores
El formato de la directiva de configuración, así como los símbolos definidos pueden variar de un compilador a otro, pero escencialmente son muy similares al ejemplo mencionado; los detalles precisos se encuentran en los manuales de usuario respectivos de cada compilador.
Raúl Alvarez Torrico
www.TecBolivia.com
Suscríbete a Nuestro Boletín de Noticias
Y te notificaremos de la publicación de otros artículos similares.