Encendiendo y apagando un LED

Creemos entonces un nuevo proyecto en MPLABX, con un archivo en .c vacío y vamos pegar el siguiente código desde la línea 1.

#include <xc.h>

#pragma config FOSC = XT        // Oscilador con cristal de cuarzo de 4MHz conectado en los pines 15 y 16
#pragma config WDTE = OFF       // Perro guardián (WDT) deshabilitado
#pragma config MCLRE = ON       // Master clear habilitado (pin reset)

#define _XTAL_FREQ 4000000      // Oscilador a 4MHz

void main(){
    TRISB = 0;                  // Puerto B como salida
    PORTB = 0;                  // Inicializa el Puerto B con todos los bits en 0

    while(1){                   // Programa que se ejecuta continuamente
        PORTB = 0b00000001;     // Bit 0 del puerto A en uno, enciende el Led
        __delay_ms(500);        // Retardo de 500 milisegundos (1/2 segundo)
        PORTB = 0b00000000;     // Bit 0 del puerto A en cero, apaga el Led
        __delay_ms(500);        // Retardo de 500 milisegundos (1/2 segundo)
    }
}

No te preocupes si no entiendes todo el código, al principio puede ser confuso pero lo explicaremos a su tiempo, por ahora concentrémonos en lo que ya hemos aprendido.

De la línea 1 a la 7 tenemos parámetros necesarios para que el microcontrolador funcione, en la línea 9 tenemos la inicialización de la función principal, o del programa que se ejecutará.

En 11 y 12 está la configuración de los registros, TRISB lo hacemos igual a 0 para que todo el puerto B sea salida, y lo iniciamos en 0 todos los pines con la instrucción PORTB = 0.

Entre las líneas 13 y 18 tenemos el ciclo infinito, es el código que se ejecutara siempre que microcontrolador esté conectado a una fuente de alimentación, en un próximo ejemplo explicaremos el porqué, por ahora fijémonos en las líneas 14, 15, 16 y 17

PORTB = 0b00000001;     // Bit 0 del puerto A en uno, enciende el Led
__delay_ms(500);        // Retardo de 500 milisegundos (1/2 segundo)
PORTB = 0b00000000;     // Bit 0 del puerto A en cero, apaga el Led
__delay_ms(500);        // Retardo de 500 milisegundos (1/2 segundo)

Escribimos en el puerto B un 1 lógico en el bit 0, esto hace que aparezcan 5 voltios en el pin correspondiente, luego con la instrucción  __delay_ms(500)  damos un retardo, el valor entre paréntesis es el tiempo en milisegundos que durará. Luego escribimos un 0 lógico en el mismo bit del puerto B, haciendo que ahora aparezcan 0 voltios, seguido nuevamente de la instrucción que da el retardo. Como dijimos anteriormente, esto se repite y repite siempre que el microcontrolador esté conectado a la fuente de alimentación.

Es momento ahora de compilar nuestro código y llevarlo a la simulación para comprobar que funcione, dando clic sobre el botón Clean and Build Main Project, compilara y de estar todo correcto obtendremos un mensaje similar a este “BUILD SUCCESSFUL” en la ventana inferior de MPLABX. De ser así, el programa generara un archivo con el nombre de nuestro proyecto y con extensión .hex, ubicado en la carpeta del proyecto /dist/default/production/

Hagamos el circuito en Proteus para que probemos nuestro código, en un nuevo diagrama esquemático busquemos los siguientes componentes y conectemoslos en este circuito.

  • PIC16F1827
  • CRYSTAL
  • LED-RED
  • RES

 

Una vez finalizado el circuito damos clic derecho sobre el microcontrolador y luego clic en la opción “Edit Properties”, abrirá una ventana como esta:

 

En el campo Program File, daremos clic sobre el botón con la carpeta y buscaremos el archivo con extensión .hex en la carpeta donde se encuentra nuestro proyecto /dist/default/production/ una vez seleccionado pulsamos OK y podemos iniciar la simulación en el botón Play, ubicado en la parte inferior izquierda, si todo marcha bien Proteus cargara nuestro programa dentro de la simulación y el Led empezara a encender y apagar. Qué tal, ¿funciona?

Entendamos un poco el circuito, el cristal es un componente electrónico compuesto de un material piezoeléctrico que oscila a una frecuencia muy precisa, esta se utiliza para controlar el tiempo o los ciclos del reloj en el microcontrolador, es por eso que él sabe que han pasado 500 milisegundos cuando le damos la instrucción del retardo. Para este ejemplo y los próximos usaremos un cristal de 4MHz, pero no basta solo con conectarlo, también debemos indicar en el programa que cristal conectaremos y a la frecuencia, es por eso que en la línea 3 escribimos:

#pragma config FOSC = XT

Con esto le decimos al microcontrolador que usaremos un cristal de mediana frecuencia, sí, hay de alta velocidad y otros para bajo consumo, pero los vemos luego.

Y en la 7:

#define _XTAL_FREQ 4000000

De este modo establecemos a 4MHz como la frecuencia de trabajo del microcontrolador y con base a ella se realizaran todos los cálculos de tiempos.

En la línea 5 escribimos:

#pragma config MCLRE = ON

Esto significa que estamos habilitando la función Master Clear del pin 4 del microcontrolador, esto hace que el programa funcione constantemente si dicho pin permanece en un 1 lógico y resetee o reinicie todo si pasa a un 0 lógico, es por eso que conectamos una resistencia de 1KΩ entre el pin número 4 y 5 Voltios, así aseguramos que el programa corra constantemente sin problemas. Esta función no es obligatoria pero tengámosla habilitada, la usaremos en un futuro.

Por último y para terminar de explicar el código tenemos la línea 4:

#pragma config WDTE = OFF

El Watch Dog Timer o Perro Guardián, es una función de protección del microcontrolador que evita que el programa se quede atrapado en ciclos infinitos de los cuales no puede salir y que probablemente afecten el correcto funcionamiento del resto del programa, esta protección se habilita comúnmente cuando ya hemos finalizado la etapa de pruebas y pasamos a producción, es por eso que la mantendremos deshabilitada, porque estamos aprendiendo y probando.