Los bits de configuración (Device Configuration Bits) tienen importancia capital en la operación de un proyecto. Sin la configuración adecuada el diseño jamás funcionará. Muchos diseñadores se esmeran por escribir un código fuente con las mejores características técnicas y estéticas, dedican largas horas al diseño del esquema eléctrico, del circuito impreso y multitud de detalles, pero suelen pasar por alto uno de los puntos de mayor significado: la selección de los bits de configuración. La omisión de este detalle les acarrea muchos dolores de cabeza, intentando hallar alguna falla en el lugar equivocado; es por eso que recomendamos que como paso previo a la escritura del código fuente, primero se configuren los bits del dispositivo para establecer el modo correcto de funcionamiento..
A continuación se detalla la configuración básica de los microcontroladores PIC16F84A, 16F628A, 16F88, 16F877A, 16F887, 18F2550 y 18F4550 tal como se realiza en el compilador mikroC PRO for PIC. Estas configuraciones garantizan el funcionamiento correcto cuando se trabaja con los puertos digitales. Como se puede ver, a medida que se incrementan las prestaciones de los microcontroladores PIC, también se incrementa el número de bits de configuración, y para su establecimiento correcto es imprescindible el estudio detallado de la hoja de especificaciones (datasheet). La importancia de los bits de configuración es vital, pues el proyecto jamás entrará en funcionamiento si se pasa por alto este requisito. Este artículo tiene el propósito de servir como guía para aquellas personas que están comenzando sus estudios y prácticas con los microcontroladores PIC, y no pretende hacer un estudio pormenorizado de cada uno de los bits de configuración. Si el usuario desea realizar otra configuración para el trabajo con los módulos internos del PIC, deberá revisar la hoja de especificaciones correspondiente. La configuración está realizada para que los microcontroladores PIC trabajen con su oscilador interno en caso de que venga incorporado (se exceptúa el PIC18F2550/4550 que aunque incluye oscilador interno se ha configurado para el oscilador externo).
¡Descubre el mundo de los microcontroladores PIC y lleva tus habilidades de programación al siguiente nivel! Obtén nuestro eBook y disfruta aprendiendo paso a paso desde cero, podrás realizar proyectos prácticos, encontrar soluciones a problemas comunes y explorar una amplia cobertura de temas desde lo más básico a lo más avanzado. Incluye software y ejemplos resueltos. ¡Cómpralo ahora y libera el increíble potencial de esta poderosa tecnología hoy mismo!
Se indica el valor hexadecimal resultante que deben tener las palabras de configuración para que el usuario pueda verificar sus configuraciones en otros compiladores donde el formato puede ser diferente. También se añade un ejemplo para el encendido intermitente de un LED. Debe observarse que la configuración de los puertos de los microcontroladores PIC tiene que completarse con la programación de uno o varios registros adicionales para hacer que ciertos pines trabajen como E/S (Entrada/Salida) digital (resaltado en amarillo) ya que inicialmente esos pines cumplen otras funciones. Adicionalmente se ha puesto un enlace para la descarga del código de máquina (hex) de cada ejemplo, obtenido con el compilador mikroC PRO for PIC con la configuración indicada. El lector puede emplear este código ejecutable para comprobar el funcionamiento del PIC respectivo.
Bits de Configuración del PIC16F84A (no incluye oscilador interno)
Oscilador externo 4MHz
CONFIG1: 0x3FF2
--------------------------------------------------------------------------------------
Oscillator: HS
Watchdog Timer: Off
Power Up Timer: On
Code Protect: Off
//EncenderLED.c void main() { TRISB1_bit=0; //RB1 como salida. while(1){ //Lazo infinito (repite continuamente). RB1_bit=1; //RB1 encendido. Delay_ms(500); //Pausa de 500ms. RB1_bit=0; //RB1 apagado. Delay_ms(500); //Pausa de 500ms. } }
Bits de Configuración del PIC16F628A
Oscilador interno 4MHz (por defecto)
CONFIG1: 0x2150
--------------------------------------------------------------------------------------
Oscillator: INTOSC: I/O on RA6/OSC2, I/O on RA7/OSC1
Watchdog Timer: Off
Power Up Timer: Enabled
Master Clear Enable: Disabled
Brown Out Detect: Enabled
Low Voltage Program: Disabled
Data EE Read Protect: Disabled
Code Protect: Off
//EncenderLED.c
void main(){
CMCON=0x07; //Pines RA<3:0> como E/S digital.
PORTA=0x00; //Estado inicial del puerto A (ejemplo).
TRISA=0x00; //Puerto A como salida.
while (1)
{
RA0_bit=1; //Encender LED conectado en RA0.
Delay_ms(500);
RA0_bit=0; //Apagar LED conectado en RA0.
Delay_ms(500);
}
}
Bits de Configuración del PIC16F88
Oscilador interno 4MHz
CONFIG1: 0x3F50
CONFIG2: 0x3FFC
--------------------------------------------------------------------------------------
Oscillator: INTRC-OSC2 as RA6
Watchdog Timer: Off
Power Up Timer: Enabled
RA5/MCLR Pin Function Select: RA5
Brown Out Detect: Enabled
Low Voltage Program: Disabled
Data EE Read Protect: Disabled
Flash Program Write: Write Protect Off
Background Debug: Disabled
CCP1 Mux: RB0
Code Protect: Off
Fail-Safe Clock Monitor: Disabled
Internal External Switch Over: Disabled
//EncenderLED.c void main(){ OSCCON=0x60; //Oscilador interno a 4MHz (ejemplo). ANSEL=0x00; //Pines AN<6:0> como E/S digital. PORTA=0x00; //Estado inicial del puerto A (ejemplo). TRISA=0x00; //Puerto A como salida. while (1) { RA0_bit=1; //Encender LED conectado en RA0. Delay_ms(500); RA0_bit=0; //Apagar LED conectado en RA0. Delay_ms(500); } }
Bits de Configuración del PIC16F877A (no incluye oscilador interno)
Oscilador externo 4MHz
CONFIG1: 0x2F42
--------------------------------------------------------------------------------------
Oscillator: HS
Watchdog Timer: Off
Power Up Timer: On
Brown Out Detect: On
Low Voltage Program: Disabled
Data EE Read Protect: Off
Flash Program Write: Write Protect Off
Background Debug: Disabled
Code Protect: Off
//EncenderLED.c
void main(){
ADCON1=0x06; //Pines RA<5:0> y RE<2:0> como E/S digital.
PORTA=0x00; //Estado inicial del puerto A (ejemplo).
TRISA=0x00; //Puerto A como salida.
while (1)
{
RA0_bit=1; //Encender LED conectado en RA0.
Delay_ms(500);
RA0_bit=0; //Apagar LED conectado en RA0.
Delay_ms(500);
}
}
Bits de Configuración del PIC16F887
Oscilador interno 4MHz (por defecto)
CONFIG1: 0x23C4
CONFIG2: 0x0700
--------------------------------------------------------------------------------------
Oscillator: INTOSCIO: I/O on RA6/OSC2 and RA7/OSC1
Watchdog Timer: Disabled
Power Up Timer: Enabled
Master Clear Enable: RE3/MCLR is digital input, MCLR internally tied to VDD
Code Protect: Off
Data EE Read Protect: Disabled
Brown Out Reset Selection: Bor enabled
Internal External Switch Over: Disabled
Monitor Clock Fail-Safe: Disabled
Low Voltage Program: RB3 is digital I/O, HV on MCLR must be used for programming
Background Debug: In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins.
Brown Out Reset Selection Bit: Brown Out Reset set to 4.0V
Flash Program Self Write: Write Protect Off
//EncenderLED.c void main(){ SCS_bit=1; //Usar el oscilador interno. ANSEL=0x00; //Pines AN<4:0> como E/S digital. ANSELH=0x00; //Pines AN<13:8> como E/S digital. PORTA=0b01111100; //Inicialización del puerto A (ejemplo). TRISA=0b01111100; //Pines RA7 y RA<1,0> como salidas (ejemplo) while (1){ RA0_bit=1; //Encender LED conectado en RA0. Delay_ms(500); RA0_bit=0; //Apagar LED conectado en RA0. Delay_ms(500); } } }
Bits de Configuración del PIC18F2550-4550
(incluye oscilador interno, configurado para el oscilador externo)
Oscilador externo 8MHz
CONFIG1L: 0x0000
CONFIG1H: 0x000E
CONFIG2L: 0x001F
CONFIG2H: 0x001E
CONFIG3H: 0x0001
CONFIG4L: 0x0081
CONFIG5L: 0x000F
CONFIG5H: 0x00C0
CONFIG6L: 0x000F
CONFIG6H: 0x00E0
CONFIG7L: 0x000F
CONFIG7H: 0x0040
--------------------------------------------------------------------------------------
96MHz PLL Prescaler: Divide by 2 (8MHz input)
CPU System Clock Postscaler: [OSC1/OSC2 Src:/1][96MHz PLL Src:/2]
Full Speed USB Clock Source Selection: Clock src from 96MHz PLL/2
Oscillator: HS:HS+PLL, USB-HS
Fail-Safe Clock Monitor Enable: Disabled
Internal External Switch Over: Disabled
Power Up Timer: Enabled
Brown Out Detect: Enabled in hardware, SBOREN disabled
Brown Out Voltage: 4.2V
USB Voltage Regulator: Enabled
Watchdog Timer: Disabled-Controlled by SWDTEN bit
Watchdog Postscaler: 1:32768
CCP2 Mux: RC1
PortB A/D Enable: PORTB <4:0> configured as digital I/O on reset
Low Power Timer1 Osc Enable: Disabled
Master Clear Enable: MCLR disabled, RE3 enabled
Stack Overflow Reset: Enabled
(El resto de opciones se deja Disabled)
//EncenderLED.c void main(){ PORTB=0x00; //Estado inicial del puerto B (ejemplo). TRISB=0x00; //Puerto B como salida. while (1){ RB0_bit=1; //Encender LED conectado en RB0. Delay_ms(500); RB0_bit=0; //Apagar LED conectado en RB0. Delay_ms(500); } }
Código hex (PIC18F2550)