Programando Microcontroladores PIC

Hoy les hablare sobre MPLAP-X, VSCODE, el programador K150 y Python

Existen muchas IDE para programar microcontroladores PIC pero seguro que alguna vez haz usado MPLAP-X, como sabemos esta basado en NETBEANS y habrán muchos que estarán encantados de usarlo y les va de lujo, pero existen otros usuarios como yo que no tenemos tan buena suerte y en el peor momento nos monta un circo.

Si buscas en los foros de microchip hay usuarios buscando solución a los mismos errores en el IDE una y otra vez, osea que hay errores que supuestamente habían resuelto pero vuelven como las manchas en las paredes de las casas embrujadas de las películas de terror, en todas las versiones desde hace mas de una década los bugs bichos hacen respawn como los chasqueadores de The Last of Us , es así que en la ultima versión de diciembre 2022 me salto este:

En vez de estar perdiendo el tiempo configurando mplap la gente quiere escribir código, no puede ser que quieras romper la pared y primero tengas que reparar el martillo.

Se imaginan como seria si Microchip tuviese un plugin para el Visual Studio Code al estilo platformio? Puede que algún dia pero mientras tanto usemos lo que tengamos a mano.

Visual Studio Code & MPLAP-X

No creo que haga falta decir porque Visual Studio CODE es uno de los mejores entornos de desarrollo de la actualidad y tampoco creo que deba mencionar sus ventajas sobre el MPLAP-X.

Para editar y escribir código para microcontroladores PIC usando las librerías XC8 con VSCODE debemos hacer y cumplir lo siguiente:

El archivo con el código en C/C++ a editar debe haber sido creado previamente con mplap o de lo contrario solo podremos editar pero no podremos compilar el binario.

Se que en algún lugar de la documentación de mplap se explica como generar el makefile y los demás archivos necesarios que se encuentran en la carpeta nbproject de cada proyecto pero ahorita eso no me importa.

Debemos abrir la carpeta con los archivos que deseemos editar desde el menú contextual del explorador de archivos o directamente desde VSCODE [Ctrl+K Ctrl+O] aunque también podemos ejecutar «code .» desde la terminal ubicándonos previamente en el directorio a trabajar.

Al seleccionar el archivo a editar veras un error en la linea del #include <xc.h>:

Solo hay que editar c_cpp_properties.json añadiendo las siguientes lineas dependiendo de la versión y ruta donde tengas instalado XC8

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "/opt/microchip/xc8/v2.40/pic/include/",
                "/opt/microchip/xc8/v2.40/pic/include/proc"
            ],
            "defines": [],
            "cStandard": "gnu17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

Solo nos faltaría hacer un #include del pic que estemos programando para habilitar todas las características como auto completado, IntelliSense y otras..

Para compilar solo vamos al terminal y ejecutamos «make» y para limpiar «make clean»

Una vez compilado el firmware solo debemos «quemarlo» en el pic, yo tengo un pickit 3 y un K150, el pickit3 lo uso con el MPLAP IPE , pero la mayoría de los pic que estoy usando últimamente están soportados por el K150, y este ultimo es mas rápido y barato, para ello utilizo un programa escrito en python 3 que funciona en interfaz de linea de comandos (CLI) llamado picpro

Sinceramente no entiendo como nos pueden vender este programador cuando el software para windows es del año 2007, los vendedores te informan que «il siftwiri li dibis diskirgir di intirnit», este programador lo tuve de pisapapeles un tiempo ya que poseo un pickit3 pero un dia tuve un inconveniente y lo tuve que hacer funcionar si o si.

Se puede usar el picpro con el k150 sin problemas y hasta lo encontré mas rápido que el Pickit 3, ha y si no te habías dado cuenta por aca se usa Linux, el sistema operativo favorito de los desarrolladores, creo recordar que la única dependencia de picpro es pyserial, el kernel ya trae los drivers FTDI.

Usando picpro se me ocurrió hacer una interfaz gráfica y hice una con Python utilizando la librería PySimpleGUI:

Tiene algunos detalles de funcionamiento como por ejemplo cuando grabas un pic con Code Protection habilitado va a saltar un popup de error ya que el programa no puede verificar lo que escribió en el chip, no es un error critico ademas es fácil de solucionar y comparto el código para que sirva de entretenimiento y aprendizaje, próximamente lo subiré a un repo en github.

"""PicProG.py"""
# Simple GUI for picpro https://github.com/Salamek/picpro for K150 programmer http://www.kitsrus.com/pic.html
# Made with love by Zakary Flores https://www.electronicarts.com.ve

# Shebang
#!/usr/bin/env python3

# Library imports
import os.path
import subprocess
import PySimpleGUI as sg  # https://github.com/PySimpleGUI
import json

# Begin project code

# Read the last used file and checkbox status from the file (if it exists)
try:
    with open(".picprogui.json") as json_file:
        data = json.load(json_file)
        last_file = data["last_file"]
        checkbox_status = data["checkbox_status"]
except FileNotFoundError:  # If the file doesn't exist, create it
    last_file = ""
    checkbox_status = False

# Write the values
def write():
    last_file = values["-FILE-"]
    checkbox_status = values["-ICSP-"]
    data = {"last_file": last_file, "checkbox_status": checkbox_status}
    with open(".picprogui.json", "w") as outfile:
        json.dump(data, outfile)


# lorem ipsum (҂◡̀_◡́)ᕤ
def burn_pic():
    process = subprocess.Popen(
        command.split(),
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        universal_newlines=True,
    )
    process.wait()
    output = process.stdout.read()
    if "failed" in output:  # Check if there was an error
        sg.popup("Error!")
        print(
            "There was an error running the command: ",
            command,
            "\n\npicpro output:",
            output,
        )
    else:
        sg.popup("Done!")
        print("This command was executed successfully: ", command)


# It may not be enough
ports = [
    "/dev/ttyUSB0",
    "/dev/ttyUSB1",
    "/dev/ttyUSB3",
    "/dev/ttyUSB4",
]
# Modify this list to your liking
pic_list = [
    "16F73",
    "12F675",
    "16F628A",
    "16F648A",
    "16F877A",
]

layout = [
    [sg.Text("Picpro GUI")],
    [sg.CB("ICSP", key="-ICSP-", default=checkbox_status)],
    [
        sg.Text("Port:", size=(7, 1)),
        sg.Combo(ports, size=(11, 7), default_value=ports[0], key="-PORT-"),
    ],
    [
        sg.Text("PIC:", size=(7, 1)),
        sg.Combo(pic_list, size=(11, 7), default_value=pic_list[2], key="-PIC-"),
    ],
    [
        sg.Text("HEX File:", size=(7, 1)),
        sg.Input(key="-FILE-", default_text=last_file),
        sg.FileBrowse("Browse", file_types=(("Hex File", "*.hex"),)),
    ],
    [sg.Button("Burn"), sg.Cancel("Exit")],
]
# Variables
pic_pro, hex_file, pic_type, icsp = "picpro program -p ", " -i ", " -t ", ""


window = sg.Window("K150 Picpro GUI", layout)

while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, "Exit"):
        write()
        print("---")
        break
    if values["-ICSP-"]:
        icsp = " --icsp"
    else:
        icsp = ""
    if event == ("Burn"):
        command = f'{pic_pro} {values["-PORT-"]} {hex_file} {values["-FILE-"]} {pic_type} {values["-PIC-"]} {icsp}'
        if os.path.exists(values["-PORT-"]):  # Check if the port exist
            burn_pic()
        else:
            sg.popup("K150 isn't Connected")
# End

Le hice una función que guarda en un archivo JSON la ubicación del ultimo archivo utilizado y si usaste «In Circuit Serial Programming» (ICSP), los cuales son escritos al salir y leídos al iniciar, creo que el código es bastante sencillo y le puse suficientes comentarios.

CAVEAT EMPTOR

Si no entiende el articulo léalo las veces necesarias hasta que lo haga, por favor no escriba al whatsapp de la empresa para hacer preguntas.

Este documento puede servir de referencias siempre cuando sea a través de un link hacia este contenido.

Espero que lo disfruten.

Deja un comentario