Entiendo El Proceso De Programación De Los PIC

Foto de un PIC

Cuando nos enfrentamos a la tarea de programar un microcontrolador, normalmente tendemos a comprar un programador que sea compatible con la familia de “microcontroladores” que deseamos programar.

En mi caso, siempre he creído que en estos proyectos “pequeños” lo importante es ahorrar y aprender como funciona todo. Por esta razón me he propuesto programar la familia PIC con un programador casero.

Como es lógico no parto de cero (sería absurdo y muy complicado para una primera “toma de contacto”). Existen numerosos proyectos que ya han conseguido hacer esto, por lo que intentaré entender como funcionan y utilizarlos. Para mi proyecto estoy utilizando un clon del famoso programador PICKIT el cual es completamente libre y se puede conseguir de manera sencilla. Pero… ¿cómo programamos el programador? Tachan….

Yo voy a utilizar el arduino como programador y sí, sí hay proyectos creados para esto. A la hora de utilizar el proyecto “arduino-as-programmer” me he topado con un pequeño problema. ¡No funciona! Voy a intentar arreglarlo por lo que lo primero que tengo que hacer es utilizar la ingeniería inversa en estado puro. Cuando un programa se compila y ensambla se genera un .hex para PIC, esto es un archivo de texto con un formato determinado (en nuestro caso IHEX32 o lo que es lo mismo INTEL HEXADECIMAL 32). A continuación voy a explicar un poco como es el formato de este archivo:

Todas las líneas siguen un esquema como el siguiente: :BBAAAATT[DDDDDDDD]CC

  • Significado:
    • : signo de inicio de línea BB número de bytes de datos en la línea
    • AAAA dirección en bytes
    • TT tipo: 00 = datos, 01 = fin del archivo, 04 = dirección extendida
    • CC checksum (complemento a dos de: número de bytes + dirección + datos)

Ahora nos falta el “timing” (sí Felix, al final se me quedo grabado a fuego el timing, la semántica y la sintaxis) o lo que es lo mismo, donde debemos poner cada parte de nuestro proyecto. Recordemos que PIC agrupa TODO el proyecto en un único HEX por lo que como primera conclusión podemos inferir que el tamaño del HEX no es igual al tamaño del código (MUY IMPORTANTE, CREO QUE AQUÍ PUEDE ESTAR UNO DE LOS PROBLEMAS).

  • Código: El código va al principio de nuestro fichero. Debe ir precedido por una línea de dirección extendida, es decir: :02000004xxxxXX esto es:

    • 02 igual al número de bytes de datos (2 bytes)
    • 0000 no nos importa aunque es la línea de dirección
    • 04 es el tipo de dirección extendida, es decir, aquí indicamos el requisito anteriormente citado.
    • Xxxx 0001 es igual a 64KB (estándar intel), 0002 es igual a 128KB (estándar intel + 64 KB)
  • EEPROM Data: Debe ser precedida por la línea :0200000400F00A

  • Bytes de configuración: Se almacenan en la dirección 300000h y son precedidos por: 020000040030CA. Lo estándar y correcto es 8 bytes de Fuse y 6 de Lock bytes todos en una misma línea

  • ID de usuario: Almacena en la dirección 200000h los bytes de datos de usuario como los datos de versión… Precedido por: :020000040020DA

  • Final de archivo: :00000001FF

Expero que os haya gustado esta pequeña introducción, mi idea es que todos aprendamos a la vez por lo que los post estarán narrados del mismo modo que pienso las cosas, de modo que todos los errores que cometa los podáis ver y así no cometerlos.

Un saludo y hasta la próxima :)

Comentarios

Copyright © 2015 José Antonio de la Torre las Heras .