2022/02/21

Primer contacto real con PIC16

Tras haber asistido a un seminario introductorio a PIC16, debido a que los kits fueron entregados tras éste, me quedaron pendientes dos actividades: el blinky y ver si unas instrucciones muy específicas bcf y bsf, no serían reemplazables por unos ingeniosos ands y ors.

 

El blinky

 

Hasta donde entendí, a diferencia de los AVR, estos PIC siempre necesitan una referencia externa para el clock, hay que ponerle un cristal y unos capacitores... no tan fácil, en el curso no hay ningún diagrama de conexión, como que está asumido que vos ya sabés electrónica digital y lo que no conocés es PIC. Menciona por un lado que sólo se van a usar dos pines para programar (TX y RX) y luego dice "Comparte el control del pin MCLR", ¿mmh, qué querrá decir? Obviamente pedí el diagrama pero para hacer más interesante esta experiencia lo voy a recibir cuando haya tenido éxito o fracaso.

Entonces, al buscar diagramas relacionados a cosas como "pic16f tiny bootloader circuit diagram and usb uart adapter" lo segundo mejor que encontré fué un proyecto donde muestra que se usa RTS para pegarle a MCLR (a.k.a. RESET), pero eso es a la salida de un MAX232, la idea es usar el adaptador USB-UART provisto en el kit (dicho sea de paso, ese kit debería haber traido el cristal, los capacitores...)

 

Usando RTS para el RESET
Usando RTS para el RESET


Finalmente, llegúe a un tutorial que al final dice:

 

Download the complete project folder from the below link:
Hardware design Files and Code Library 

 

Sin RTS
Sin RTS


perfecto, es lo más sencillo posible que parecería funcionar, al reset habría que darle con el dedo.

 

Ahora, a tomar posesión del chip, lo primero es identificar las patitas:

 

Pinout colorizado por función
Pinout colorizado por función

Cada color es un puerto, en grís los mínimos necesarios para programarlo.


A pensar un poco, muy poco, el diagrama del tutorial es lo que hay que hacer.


Circuito armado
Circuito armado

A la derecha Tx y Rx al USB-TTL. Lo alimento con una fuente externa.


Antes de investigar nada más, a ver si funciona. Hay que bajar el tinybootloader para linux y probar...

 

En la versión 0.6 al bajar el .deb falla por dependencia imposible de satisfacer, python-gtk2,buscando, hallamos https://osdn.net/projects/sfnet_tinybldlin/releases/ que dice tener la versión 0.8.1, veamos... nop, tambien necesita python-gtk2

              Depends: python-gtk2 but it is not installable
              Depends: python-cairo but it is not installed
              Depends: python-gobject but it is not installed
              Depends: python-serial but it is not installable

Veamos de instalarlo basándonos en https://techviewleo.com/install-python-with-virtualenv-on-linux-mint/

sudo apt-get update

sudo apt-get upgrade

sudo add-apt-repository universe

sudo apt-get update

con algunos

apt-cache search python 

determinamos que python-cairo y python-gobject estan disponibles, hay que usar pip para el resto

curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py

sudo python2 get-pip.py

ok, pero luego no puedo hallar los paquetes faltantes con pip


Hay varios caminos: 

  • resolver las dependencias
    • es en lo que vengo fallando
  • buscar otro programa
    • no está apareciendo
  • instanciar una virtual con una distro antigua que soporte python2
    • quizás tampoco pueda resolver las dependencias
    • puede ser que mplab no funcione ahí
      • no importa, sólo la usaría para flashear
  • usar wine
    • seguramente se me complique el acceso al puerto serial
    • chicken
  • instanciar una virtual con windows
    • se me puede complicar el acceso al puerto serial
    • chicken
  • actualizar el programa a python3
    • y hacer un aporte a la humanidad...
    • pero puede ser mucho tiempo
  • evitar el bootloader
    • esto significa faltar al espíritu de la experiencia original
    • tendría que armar o comprar el programador
      • no me interesa volver a hacer nada con PIC, quizás programar otro que tengo en un cajón

o mucho mejor aun, buscar un poco más hasta encontrar que 


https://github.com/lcgamboa/tinybldlin

y un

sudo apt install python3-serial


abre el programa, pero... siempre hay un pero, dice que:


Tiny PIC BootLoader
Tiny PIC BootLoader

...no lo encuentra. Mirá fijo la captura y vas a ver que en la terminal desde donde lo abriste, dice que aprietes el reset. Esta captura no es sobre la primera iteración, donde esa terminal había quedado oculta.

Lo aprieto y nada...

Siguiento mi método de armar un mail para no mandarlo, donde fuí documentando todo lo hecho para solicitar ayuda, descubrí que había conectado mal Rx, así que a desoldar... y anda.

Situación: hay que apretar el reset ante cada operación, ok, razonable.

Puede hacer falta por única vez:

  •  Tools -> Options -> Embedded -> Build Tools -> Scan for Build Tools 

Luego, para cada proyecto:

  • New project -> Microchip Embedded -> Standalone project
  • family -> Baseline 8-bit MCUs (PIC10/12/16)
  • device -> PIC16F874A
  • tool -> simulator
  • header -> none
  • compiler -> XC8 (v2.32) o similar
  • new file -> main.c

#include <xc.h>
#include <pic16f877a.h>
#include <stdio.h>

#define _XTAL_FREQ 4000000

void main(void) {
    TRISB = 0;
    PORTB=0;
    while(1) {
        PORTBbits.RB0=0;
        PORTBbits.RB1=0;
        PORTBbits.RB7=0;
        __delay_ms(500);
        PORTBbits.RB0=1;
        PORTBbits.RB1=1;
        PORTBbits.RB7=1;
        __delay_ms(500);
    }
    return;
}

  • Build
  • copiar a tinypicbootloader la ruta tipo:

/home/carlos/Desktop/blinky.X/dist/default/production/blinky.X.production.hex

  • write flash
  • reset
Listo, el blinky funciona.

La parte ingeniosa del análisis bcf -> andwf queda para otro día,


No hay comentarios:

Publicar un comentario