Los Configuration Bits son fundamentales porque definen cómo arranca físicamente el microcontrolador: oscilador, Watchdog, protección de código, programación LVP, etc.
Para trabajar con MPLAB X + XC8, te recomiendo primero configurarlos desde la interfaz de MPLAB y luego dejar que MPLAB genere los #pragma config.
Antes de iniciar
Instala Mplab X IDE usando las siguientes guías:
Configurar un proyecto
Para iniciar la configuración de los bits, abrimos el panel de config bit source que se encuentra en la siguiente ruta Window > target memory view > configuration bit o como se muestra en la siguiente imagen.
Se desplegara en la parte inferior la configuración de los bits, donde, dependiendo del microcontrolador aparecerán los bits que necesitan ser configurados, para mas información cada microcontrolador tiene su datasheet con el set de bits propio.
Configuración recomendada para comenzar
Una vez que se modifico los bits que necesitamos damos click en generar en donde nos muestra la siguiente pantalla.
Si estás trabajando con un cristal externo de 20 MHz, puedes utilizar:
| Configuration Bit | Valor | Función |
|---|---|---|
| FOSC | HS | Oscilador de alta velocidad |
| WDTE | OFF | Deshabilita Watchdog |
| PWRTE | ON | Habilita Power-up Timer |
| BOREN | ON | Habilita Brown-out Reset |
| LVP | OFF | Deshabilita Low Voltage Programming |
| CPD | OFF | Sin protección EEPROM |
| WRT | OFF | Sin protección de escritura |
| CP | OFF | Sin protección del programa |
¿Qué significa cada configuración?
FOSC — Oscillator Selection
Este es uno de los más importantes. Para el PICXXXX tenemos:
- LP: Low Power Crystal, Está pensado para trabajar con cristales de baja frecuencia y bajo consumo.
- XT: Crystal/Resonator, Es una configuración destinada a cristales o resonadores de frecuencia relativamente baja/media. 4Mhz, 8Mhz
- HS: High-Speed Crystal/Resonator, Es la configuración que utilizaríamos cuando trabajamos con cristales de frecuencia más alta. 12Mhz, 16Mhz, 20Mhz
- RC: Resistor/Capacitor: Aquí no utilizamos un cristal para generar el reloj. Utilizamos una combinación: El PIC genera su señal de reloj utilizando la red R-C.
Son las diferentes configuraciones del oscilador del PIC. Básicamente le indican al microcontrolador de dónde obtiene su reloj y qué tipo de oscilador estás utilizando.
Para un cristal de 20 MHz:
FOSC = HS
Para un cristal típico de 4 MHz también podrías utilizar XT, pero para comenzar con 20 MHz → HS es una buena elección.
WDTE — Watchdog Timer
Configúralo inicialmente como:
WDTE = OFF
El Watchdog permite reiniciar automáticamente el microcontrolador si el programa deja de responder.
Pero mientras estás aprendiendo puede generar confusión.
Por ejemplo, si está habilitado y no limpias el watchdog periódicamente:
Programa
▼
ejecutando
▼
WDT alcanza timeout
▼
RESET
▼
programa comienza nuevamente
Más adelante podemos estudiar el WDT correctamente.
PWRTE — Power-up Timer
Configura:
PWRTE = ON
El Power-up Timer introduce un pequeño retraso después de encender el PIC.
Esto permite que la alimentación y el oscilador se estabilicen antes de comenzar la ejecución.
BOREN — Brown-out Reset
Configura:
BOREN = ON
El Brown-out Reset permite que el PIC se reinicie si la tensión de alimentación cae por debajo de cierto nivel.
Por ejemplo:
VDD
│
5 V ────────────────
│
│ caída
│ ↓
│ ┌───┐
│ │ │
└──────┘ └────────
│
▼
RESET
Esto es especialmente útil en hardware real.
LVP — Low Voltage Programming
Aquí te recomiendo:
LVP = OFF
Esto es importante.
El PIC16F877A tiene un modo de programación de bajo voltaje. Si no lo estás utilizando, es mejor desactivarlo.
Además, desactivar LVP permite utilizar determinados pines relacionados con este mecanismo como GPIO normal.
Para nuestros proyectos educativos con PICkit/programador convencional, es la opción que recomiendo.
CP — Code Protection
Configura:
CP = OFF
Esto significa que no estamos protegiendo el código del programa contra lectura.
CPD — EEPROM Code Protection
Configura:
CPD = OFF
Deshabilita la protección de la EEPROM de datos.
WRT — Flash Program Memory Write Enable
Configura:
WRT = OFF
Esto está relacionado con la protección de escritura de la memoria de programa.
Guardar la configuración
Para el PIC + XC8, es una buena práctica separar la configuración del microcontrolador de main.c. Así main.c queda limpio y puedes reutilizar la configuración.
La estructura que te recomiendo es:
PIC16F877A_Basico/
│
├── Header Files
│ └── config.h
│
└── Source Files
└── main.c
Crear config.h
En MPLAB X: Clic derecho → Header Files → New → C Header File
Nombre: config
MPLAB creará: config.h
Colocar los Configuration Bits en config.h
Dentro de config.h:
#ifndef CONFIG_H
#define CONFIG_H
#include <xc.h>
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
#endif
¿Qué hace #ifndef?
Esta estructura:
#ifndef CONFIG_H
#define CONFIG_H
...
#endif
es un include guard.
Evita que el contenido de config.h sea incluido más de una vez durante la compilación.
Importar config.h desde main.c
Ahora tu main.c puede quedar mucho más limpio:
#include <xc.h>
#include "config.h"
#define _XTAL_FREQ 20000000
void main(void)
{
while(1)
{
}
}
La diferencia importante es: #include "config.h"
Las comillas: "config.h"
indican que estamos incluyendo un archivo de nuestro propio proyecto.
Mientras que:
#include <xc.h>
incluye un archivo proporcionado por el compilador.