Sie sind auf Seite 1von 9

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:

1.while (!Serial_Disponible())
2.;
3.
4.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:

01.LIST p = p16F84 ; Directive,


02.; Programa ejemplo
03.;
04.#INCLUDE <P16F84.INC> ; Microchip Device Header File
05.;
06.; Bits de configuracíon:
07.;
08.__CONFIG _XT_OSC & _PWRTE_ON & _BODEN_OFF & _CP_OFF & _WDT_ON
09.;
10.org 0x00 ; Inicio de programa
11.... ;El resto del programa
12.
13.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:

01.#include <htc.h>
02.
03./* Palabra de configuracion para el PIC16F876A con el compilador PICC
v9.83 */
04.__CONFIG(LVP_OFF & BOREN_OFF & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO);
05.
06.void main(void)
07.{
08.// Resto del código
09.
10.}

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:
01.// Config Register: CONFIG
02.#define CONFIG 0x2007
03.// Oscillator Selection bits
04.// ER oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, Resistor on
RA7/OSC1/CLKIN
05.#define FOSC_ERCLK 0xFFFF
06.// ER oscillator: I/O function on RA6/OSC2/CLKOUT pin, Resistor on
RA7/OSC1/CLKIN
07.#define FOSC_ERIO 0xFFFE
08.// INTRC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O
function on RA7/OSC1/CLKIN
09.#define FOSC_INTOSCCLK 0xFFFD
10.// INTRC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function
on RA7/OSC1/CLKIN
11.#define FOSC_INTOSCIO 0xFFFC
12.// EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
13.#define FOSC_ECIO 0xFFEF
14.// HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and
RA7/OSC1/CLKIN
15.#define FOSC_HS 0xFFEE
16.// XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and
RA7/OSC1/CLKIN
17.#define FOSC_XT 0xFFED
18.// LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and
RA7/OSC1/CLKIN
19.#define FOSC_LP 0xFFEC
20.// Watchdog Timer Enable bit
21.// WDT enabled
22.#define WDTE_ON 0xFFFF
23.// WDT disabled
24.#define WDTE_OFF 0xFFFB
25.// Power-up Timer Enable bit
26.// PWRT disabled
27.#define PWRTE_OFF 0xFFFF
28.// PWRT enabled
29.#define PWRTE_ON 0xFFF7
30.// RA5/MCLR pin function select
31.// RA5/MCLR pin function is MCLR
32.#define MCLRE_ON 0xFFFF
33.// RA5/MCLR pin function is digital input, MCLR internally tied to VDD
34.#define MCLRE_OFF 0xFFDF
35.// Brown-out Reset Enable bit
36.// BOD Reset enabled
37.#define BOREN_ON 0xFFFF
38.// BOD Reset disabled
39.#define BOREN_OFF 0xFFBF
40.// Low-Voltage Programming Enable bit
41.// RB4/PGM pin has PGM function, low-voltage programming enabled
42.#define LVP_ON 0xFFFF
43.// RB4/PGM pin has digital I/O function, HV on MCLR must be used for
programming
44.#define LVP_OFF 0xFF7F
45.// Data Code Protection bit
46.// Data memory code protection off
47.#define CPD_OFF 0xFFFF
48.// Data memory code protected
49.#define CPD_ON 0xFEFF
50.// Code Protection bits
51.// Program memory code protection off
52.#define CP_OFF 0xFFFF
53.// 0400h-07FFh code protected
54.#define CP_50 0xEBFF
55.// 0200h-07FFh code protected
56.#define CP_75 0xD7FF
57.// 0000h-07FFh code protected
58.#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.

Das könnte Ihnen auch gefallen