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.
  • Computador con Windows, Linux o Mac.
El primer paso es descargar e instalar MPLAB IDE para nuestro PC: https://www.microchip.com/mplab/mplab-x-ide

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:

Conexión PIC a Pickit3

Pinout de Pickit3