Cómo programar un microcontrolador PIC (Ejemplo con PIC16F628A)
Introducción
Muchos hobbistas solo conocen o saben programar un único microcontrolador: el Arduino. Sin embargo, existen múltiples opciones de microcontroladores.
La primera pregunta que surge es, ¿Porqué necesitamos otros microcontroladores?, algunas respuestas pueden incluir:
Precio: Si dos microcontroladores se comportan igual, utilizamos el de menor precio.
Memoria: Ya sea RAM y/o FLASH y/o EEPROM, la memoria limita el tamaño del programa (FLASH) y el tamaño que pueden tomar las variables (RAM).
Periféricos: cantidad de puertas seriales (UART, SPI, I2C). Resolución y cantidad de ADC, resolución y cantidad de PWM , GPIOs.
Periféricos no tan comunes: USB, Ethernet, WiFi, Radios 2.4GHz, Bluetooth.
Cantidad de interrupciones (timer, externas, etc).
Consumo energético, voltaje de operación.
Tamaño y encapsulado: Normalmente no es un tema, pero vienen en distintos encapsulados. Si eres un hobbista vas a querer utilizar un microcontroldor en encapsulado breadboard friendly, i.e. PDIP.
Hoy vamos a progamar un PIC16F628A, un microcontrolador antiguo, pero que que ha sido usado con éxito en innumerables proyectos. Se puede conseguir en empaquetado PDIP, por lo que es fácil agregarlo a una protoboard.
Cómo programar un microcontrolador PIC (Ejemplo con PIC16F628A)
Las herramientas necesarias para programa un PIC son:
Microcontrolador PIC: En este tutorial vamos a usar un PIC16F628A
Programador: Existen varios, pero vamos a usar un Pickit3.
Podemos programar en Asembler si instalamos MPLAB IDE, si se quiere escribir código en lenguaje C, debemos descargar el compilador para nuestro microcontrolador: https://www.microchip.com/mplab/compilers, el PIC16F628A es un microcontrolador de 8 bits, por lo que utilizaremos XC8.
Una vez descargado e instalado el compilador y el IDE, podemos proceder a crear un proyecto nuevo en MPLAB, pueden serguir el siguiente tutorial para crear un programa blinking led:
Si es que quieren hacer in circuit programming (programar el microcontrolador in-situ), con el Pickit3 debemos tan solo conectar 5 cables al microcontrolador:
VDD: ya sea 1.8V, 3.6V, 5V, conectamos el Pickit3 a la fuente de voltaje que utiliza el microcontrolador
GND: la tierra del microcontrolador
PGD: en el datasheet del microcontrolador debería salir cuál es el pin del MCU que cumple este objetivo.
PGC: lo mismo que PGM
MCLR: Si tienes el pin MCLR del microcontrolador conectado a VDD, debes hacerlo mediante una resistencia, luego conecta directamente MCLR del Pickit3 con el del microcontrolador.
El programa principal blinking led para el PIC16F628A es el siguiente:
/*
* @file led.c
* @author SLTECH
* @brief prende y apaga los GPIOs del puerto B (RB0,RB1,RB2,RB3,RB4,RB5,RB6,RB7) cada 500ms
*
* Created on June 16, 2019, 5:42 PM
*/
// PIC16F628A Configuration Bit Settings
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 4000000
#include
int main(void) {
TRISB = 0x00;
while (1){
PORTB ^= 0xff;
__delay_ms(500);
}
return 0;
}
Los siguientes diagramas resumen las conexiones necesarias para programa el microcontrolador con un Pickit3: