How to: Bootloader para PIC16F876A

Después del éxito del “Pablin 2 reloaded” había pensado en diseñar un programador propio con ICSP, porque algunos detalles del diseño del programador Pablin 2 siguen sin gustarme. Pero he oído hablar del Bootloader y me he decidido por él, para micros con bastante memoria es mucho más cómodo.

¿Que es un Bootloader? Es un programa muy pequeño (256 bytes en este caso) que permite descargar programas al PIC usando únicamente el puerto serie, sin ningún hardware adicional.
¿Que ventajas tiene? Solo es necesario utilizar un grabador de PIC una vez, para grabar el programa Bootloader. Podemos hacerlo con un grabador prestado. Una vez cargado el Bootloader en el PIC ya podemos descargar en él nuestros programas vía serie, sin necesidad de grabador, todas las veces que queramos. Si nuestro hardware incorpora puerto serie no es necesario quitar el PIC de su zócalo: usando el puerto serie de nuestro proyecto hacemos la descarga.
¿Como funciona? El Bootloader se carga en el final de la flash de programa del PIC y coloca el vector de interrupción de arranque apuntandolo. Arranca cuando alimentamos el procesador y espera un comando por el puerto serie. Si no lo recibe continua con la ejecución normal de nuestro programa. Si lo recibe comienza a recibir un programa por el puerto serie y a grabarlo en la flash de programa del PIC.
¿Que necesito? Es necesario tener el Bootloader configurado para nuestro hardware y cargado en el PIC, una conexión serie con el PC y el programa descargador (por ejemplo PICbootPlus).
¿Tiene algún inconveniente? Si. Es necesario modificar nuestros programas para que puedan trabajar con el Bootloader. Según el entorno de desarrollo Mplab, CCS, Hitech-C etc es más o menos complejo, pero la modificaciones suelen ser incluir unas pocas líneas de código. Además no podemos usar los últimos 256 bytes de memoria (en un PIC16F876 de 8K de memoria es el 3,1 % inutilizable)

Cómo se hace:

Yo he usado el Bootloader de Microchipc: http://www.microchipc.com/PIC16bootload/index.php, he descargado la última versión: Download Shane Tolmie PIC bootloader v9-50.

Alternativamente pueden descargarse los archivos de mi servidor: Shane Tolmie PIC bootloader v9-50. Una modificación del software de comunicación, con mini terminal y alguna opción para depuración de protocolo serie (incluye fuentes en Builder 6): picbootplus2.rar

Una vez descomprimido el archivo vemos que contiene muchos ficheros. En la carpeta “bootloader hex files for 16F87xA compatible bootloader” hay Bootloaders ya ensamblados y configurados para distintos cristales y velocidades de comunicación, para el PIC 16F876A, y para el PIC 16F876 en “bootloader hex files for 16F87x compatible bootloader”. Sin embargo nos advierten que son versiones antiguas y que es mejor compilar nosotros mismos la última con los parámetros adecuados.

En “assembly source for 16F87xA compatible bootloader” tenemos un proyecto para MPLAB con un fuente en ensamblador (bootldra.asm) que tenemos que modificar según nuestras necesidades. Esta es la zona a modificar:

;================== User setting section ======================================

list p=16f877a ; <<< ajusta el tipo de PIC ( por defecto 16F877a, ponerlo a 16F876a ) ; poner el mismo PIC en las opciones del proyecto de MPLAB #define ICD_DEBUG 0 ; <<< si se usa el depurador MPLAB ICD, bajar el downloader 256 bytes para hacerle sitio [0|1] #define FOSC D'20000000' ; <<< Poner la frecuencia de nuestro cristal [Hz], max. 20 MHz ;#define BAUD D'38400' ; <<< poner la velocidad de comunicación con el PC: baud rate [bit/sec] #define BAUD D'19200' ; <<< set baud rate [bit/sec] #define BAUD_ERROR D'4' ; <<< Poner el error de velocidad de comunicación [%] NO LO HE TOCADO #define TIME ; <<< Poner el método de arranque del bootloadert PIN/TIME ; PIN : arranca al poner el pin de aranque a cero ; TIME: arranca si se recibe el comando IDENT dentro de un tiempo definido por TIMEOUT #define TRIGGER PORTB,7 ; <<< solo si se usa PIN - poner el puerto y el bit: PORT_X,PIN_NR #define TIMEOUT D'2' ; <<< solo si se usa TIME - poner el tiempo [0.1s], max. 25 sec #define WATCHDOGTIMER 0 ; <<< Watchdog timer por defecto a OFF/ON [0|1] Una vez modificado ensamblamos nuestro proyecto (yo he usado el MPLAB 7.01) y obtenemos un " bootldra.hex" que es lo que tenemos que grabar en el PIC, usando un grabador convencional. En las carpetas "Downloader.... " hay varios descargadores para diverss sistemas operativos, según nuestras necesidades. En "Downloader Windows in BC++ plus terminal" tenemos el "PICbootPlus.exe" que es el descargador que he usado yo. En la sección de Microchipc Frequently Asked Questions (FAQ) encontramos preguntas y respuestas a problemas comunes con el Bootloader. Yo uso el compilador CCS 3.236, y me informa que para adecuar mis programas al uso del Bootloader tengo que incluir esta línea en mi fuente en C:

#org 0x1F00, 0x1FFF void loader16F876(void) {} //protect bootloader code for the 8k 16F876/7

Que sirve para que el compilador reserve memoria para el Bootloader e informe si mi programa lo va a machacar.

Una vez que hemos grabado el PIC con el Bootloader y pinchado en nuestro hardware, con su puerto serie conectado al PC, y hemos compilado nuestro programa con la modificación correspondiente podemos descargarlo en el PIC. Ejecutamos el “PICbootPlus.exe” y con el botón “search” buscamos el fichero .hex que queremos descargar. El nombre aparecerá en la ventana a la izquierda de “search”. Ajustamos el puerto COM1 o el que usemos en el apartado Port y la velocidad igual a la que hayamos configurado en el Bootloader en el apartado BaudRate. MArcando EEPROM descargamos también en el PIC la eeprom de datos. Estos datos son memorizados en un fichero .ini para la próxima vez que usemos el “PICbootPlus.exe”.

Pulsamos el botón “Write” y en la ventana “info” aparecerá “Reset” ya al momento “Searching for Bootloader”. El “PICbootPlus.exe” está enviando el comando IDENT al PIC, y espera contestación. En este momento alimentamos nuestro PIC y, si la comunicación es correcta, aparecerá “Writing, please wait” y una barra de progreso comenzará a avanzar de izquierda a derecha. Cuando haya terminado aparecerá “ALL OK!” y ya está grabado. Cada vez que recompilemos nuestro programa solo tenemos que repetir este proceso y ya estará grabado el PIC de nuevo.

En la parte inferior del “PICbootPlus.exe” tenemos un mini terminal serie con el que podemos comunicarnos con nuestro programa una vez que ha sido cargado en el PIC. Solo tenemos que ajustar la velocidad acorde con la que hayamos puesto en nuestro programa (que no tiene nada que ver con la que tenía el Bootloader).

IMPORTANTE:

Desde que arranca el programa Bootloader hasta que le transfiere el control a nuestro programa, TIMEOUT segundos que por defecto son 0,2 segundos, las patas del PIC están todas como ENTRADAS lo que significa que, las que tengan que ser salidas, serán vistas por los chips auxiliares como a 1. Durante la carga del programa esta situación se prolonga TODO EL TIEMPO que dura la carga (varios segundos). En mi caso el L293D que controla los motores “ve” las salidas PWM a 1 durante este tiempo y se conectan los dos motores a la vez, hasta que arranca mi programa y controla las patas del PIC. Hay que tenerlo en cuenta y usar lógica negativa en las salidas (que activen las cosas con un 0), si es posible, o poner un interruptor de corte de potencia para evitar movimientos incontrolados durante este tiempo.

Si se coloca un inversor en las salidas PWM para que sean activas a 0 en vez de a 1 en el programa escribir un valor 0 en el PWM dará la máxima salida y un valor 255 (para 8 bit) dará la mínima salida. En C de CCS se puede escribir:

unsigned int ciclo;

set_pwm1_duty (ciclo): // Para lógica positiva de las salidas

set_pwm1_duty(255-ciclo); // Para lógica negativa de las salidas