Imprimir

Entendiendo los Bits de Configuración en el PIC16 de Microchip

Escrito por Raúl Alvarez.

 

PIC16F628 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:

while (!Serial_Disponible())
 ;

caracter = Leer_Serial();

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:

 LIST p = p16F84 ; Directive,
; Programa ejemplo
;
 #INCLUDE <P16F84.INC> ; Microchip Device Header File
;
; Bits de configuracíon:
;
 __CONFIG _XT_OSC & _PWRTE_ON & _BODEN_OFF & _CP_OFF & _WDT_ON
;
 org 0x00 ; Inicio de programa
...    ;El resto del programa

end

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:

#include <htc.h>

/* Palabra de configuracion para el PIC16F876A con el compilador PICC v9.83 */
__CONFIG(LVP_OFF & BOREN_OFF & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO);

void main(void)
{
 // Resto del código

}

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:
// Config Register: CONFIG
#define CONFIG               0x2007
// Oscillator Selection bits
// ER oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, Resistor on RA7/OSC1/CLKIN
#define FOSC_ERCLK           0xFFFF
// ER oscillator: I/O function on RA6/OSC2/CLKOUT pin, Resistor on RA7/OSC1/CLKIN
#define FOSC_ERIO            0xFFFE
// INTRC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
#define FOSC_INTOSCCLK       0xFFFD
// INTRC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
#define FOSC_INTOSCIO        0xFFFC
// EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
#define FOSC_ECIO            0xFFEF
// HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
#define FOSC_HS              0xFFEE
// XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
#define FOSC_XT              0xFFED
// LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
#define FOSC_LP              0xFFEC
// Watchdog Timer Enable bit
// WDT enabled
#define WDTE_ON              0xFFFF
// WDT disabled
#define WDTE_OFF             0xFFFB
// Power-up Timer Enable bit
// PWRT disabled
#define PWRTE_OFF            0xFFFF
// PWRT enabled
#define PWRTE_ON             0xFFF7
// RA5/MCLR pin function select
// RA5/MCLR pin function is MCLR
#define MCLRE_ON             0xFFFF
// RA5/MCLR pin function is digital input, MCLR internally tied to VDD
#define MCLRE_OFF            0xFFDF
// Brown-out Reset Enable bit
// BOD Reset enabled
#define BOREN_ON             0xFFFF
// BOD Reset disabled
#define BOREN_OFF            0xFFBF
// Low-Voltage Programming Enable bit
// RB4/PGM pin has PGM function, low-voltage programming enabled
#define LVP_ON               0xFFFF
// RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming
#define LVP_OFF              0xFF7F
// Data Code Protection bit
// Data memory code protection off
#define CPD_OFF              0xFFFF
// Data memory code protected
#define CPD_ON               0xFEFF
// Code Protection bits
// Program memory code protection off
#define CP_OFF               0xFFFF
// 0400h-07FFh code protected
#define CP_50                0xEBFF
// 0200h-07FFh code protected
#define CP_75                0xD7FF
// 0000h-07FFh code protected
#define CP_ALL               0xC3FF

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.

Pregunta anti spam. Ingresa abajo las últimas 4 letras de: asteroide
Nombre:
Email:

Productos Relacionados en Nuestra Tienda Virtual

Programador PICkit 3 Puerto USB

PICkit_3_4bc0e4437317d.jpg

Detalles del Producto

$us 89.90

Programador En Sistema Atmel ATAVRISP2 USB 2.0

atavrisp2

Detalles del Producto

$us 75.00

Microcontrolador PIC16F628A-I/P

PIC16F628A_I_P_4bc0e0aa3b224.jpg

Detalles del Producto

$us 3.60

PIC16F876A-I/SP

PIC16F876A_I_SP_4bc0dcd33f116.jpg

Detalles del Producto

$us 9.50

Microcontrolador ATMEGA324PA-PU-ND

453-40-dip_sml

Detalles del Producto

$us 11.76