Un BootLoader es un pequeño conjunto de instrucciones que forman un programa y se graban, en este caso en un microcontrolador, para permitir un posterior manejo y actualización de sus programas internos (firmware) sin necesidad de utilizar programadores (hardware) específicos. Es decir, utilizas un programador (o quemador) de microcontroladores una única vez para cargarle el mencionado BootLoader al microcontrolador y luego te bastará con una sencilla aplicación en tu ordenador para cambiar a tu antojo el funcionamiento de tus sistemas. Todo mediante una vulgar conexión al puerto USB. Las plataformas modernas que se asemejan a Arduino (incluida ésta) utilizan este sistema de programación y NeoTeo no podía quedar afuera. Ahora la programación está al alcance de todos.
Es imposible resumir en un sumario de pocas palabras las infinitas ventajas que posee un BootLoader. Sólo debes imaginarte la situación: tu hardware, tu ordenador y un cable de conexión USB entre ambos. Eso es todo lo que necesitas para transformar al entrenador NeoTeo en un voltímetro, en un videojuego, en un operador de servomotores y en miles de cosas más. A pesar de que el conector ICSP es una de las herramientas maestras de las que dispone una persona que se dedica a experimentar con microcontroladores, la utilización de un BootLoader te ahorra el uso de un hardware adicional de trabajo como es el programador (o quemador).
Un ejemplo de las miles de ventajas que puedes tener sería este: Tú le has vendido a Max una aplicación y luego de un tiempo de uso él te expresa su lamento y pesar sobre algunas deficiencias del producto, mientras te comenta que desearía que hagas algunas mejoras para lograr un funcionamiento óptimo y acorde a sus necesidades. ¿Qué deberías hacer en esa situación? ¿Pedirle a Max que desarme todo el equipo y te lo envíe? Imposible. ¿Viajar tú de un país a otro para cambiar dos líneas de programa, conectar el hardware programador y demorar menos de cinco minutos en resolver el problema? ¡De locos! En cambio, si el sistema inicial posee la sencilla carga previa de un BootLoader, le envías a Max un pequeño archivo por correo electrónico y él mismo podrá actualizar la versión de firmware con un elemental cable USB conectado a su ordenador. Así trabajan Arduino, Amicus y todas las plataformas similares que compiten en la web. Así de sencillo y tentador. ¿Quieres verlo? Observa como se cambia de una aplicación a otra diferente en apenas algunos segundos:
El principio de funcionamiento de un BootLoader es fácil de comprender. Se trata de un pequeño software, que se instala en un microcontrolador y ocupa un pequeño espacio de memoria dentro de él. Su única funcionalidad es servir de “anfitrión” para permitir la programación o re-programación del microcontrolador sin necesidad de un hardware específico, a veces costoso y que no es sencillo de armar ni utilizar. Toda la tarea de reinstalar un nuevo software para lograr diferentes trabajos por parte del microcontrolador, o al menos una actualización del firmware ya existente y funcional, se resume a un cable que une el microcontrolador con el ordenador. Puede ser una conexión por puerto serie (COM) o, lo que es mejor aún y que se utiliza en la actualidad, por puerto USB. Aquí tienes otro ejemplo de cómo funciona un sistema de carga con BootLoader (carga un programa que enciende el LED amarillo)
El resto del trabajo lo realiza una aplicación instalada en el ordenador que será la encargada de detectar la petición de grabación desde el microcontrolador y cargarle un nuevo programa o, como mencionamos antes, actualizar el existente. Si el microcontrolador no realiza un llamado de solicitud anunciando una conexión para una grabación de datos, el ordenador interpretará la conexión como un hecho natural y atenderá a la aplicación existente y funcional dentro del microcontrolador trabajando en conjunto con este dispositivo y realizando las operaciones que la aplicación requiera. Por ejemplo, el Voltímetro NeoTeo. También puede suceder que no necesites conectar nunca tu aplicación a un ordenador para que realice su trabajo y cumpla una tarea.
Por ejemplo: algunos de los carteles de LEDs que indican el recorrido de un transporte de pasajeros. Ese es un claro ejemplo donde el desarrollo no se utiliza “enlazado” a un ordenador. El empleado que se encarga de diagramar los viajes conecta un ordenador portátil mediante un cable USB, ejecuta una aplicación y con un simple clic del ratón cambia los textos del cartel indicador. Otros sistemas más modernos y sofisticados le transmiten al cartel la actualización de información mediante un enlace Wi-Fi. ¿Y cómo cargan la información recibida dentro del microcontrolador? Mediante el BootLoader anfitrión que el microcontrolador ya posee en su interior.
La Ley De Moore al acecho
Además, el camino irreversible de la miniaturización y la alta integración de los semiconductores nos entregan día a día dispositivos más pequeños y en encapsulados (package) muy difíciles de manipular. La mayoría de los microcontroladores “poderosos” del mercado comienzan a aparecer en encapsulados muy pequeños. Esto significa que retirarlos de una placa, colocarlos en un programador y luego restituirlos al PCB donde cumplen su función es un trabajo imposible de realizar sin destruir al menos una docena de pines y/o calcinar el dispositivo y/o las vías del PCB. Por lo tanto, amigos, los tiempos de gloria del 16F84A, del 16F628A y hasta del mismo 18F2550 (que utilizamos en nuestra placa de entrenamiento) están llegando a su final. Quizás la visión de quien escribe estas líneas pueda parecer algo pesimista. Pero si se detienen a observar la mayoría de (por no decir todas) las placas de entrenamiento que comercializan las marcas líderes en microcontroladores, notarán que poseen versiones de montaje superficial para sus MCU (microcontroladores) y los medios de programación son el ICSP (con hardware programador) y por medio de BootLoaders. Estos últimos pueden ser por puerto serie o por puerto USB.
Para muestra, basta el botón que acabas de ver: MPLAB Starter Kit for PIC 18F MCU (que sería el primer escalón para comenzar a trabajar en el mundo de Microchip – MPLAB utilizando los PIC de la línea 18F) trabaja mediante el uso de BootLoaders. Toda la intervención con el hardware se limita a conectar un cable USB y a cargar nuestros programas. El soldador (cautín) ya comienza a desaparecer de la mesa de trabajo del desarrollador. En su lugar comienzan a abundar otras herramientas virtuales que ayudarán a reducir en forma notoria muchos métodos de “prueba y error” utilizados hasta ahora. Ya no bastará con que el sistema funcione en el simulador dentro del ordenador sino que también deberá hacerlo en la placa de entrenamiento. Pues entonces si hacia allí vamos, adaptemos nuestra placa de entrenamiento NeoTeo con el 18F2550 e ingresemos al futuro nosotros también.
Una solución de código abierto
Microchip posee herramientas gratuitas que se pueden descargar desde su sitio web y nos pueden ayudar a desarrollar aplicaciones con un mínimo de inversión y con la posibilidad de adquirir un aprendizaje muy importante. Dentro de las posibilidades que ofrece el sitio para trabajar con BootLoaders encontramos una aplicación dedicada a la familia del PIC 18F4550 mediante la conectividad USB que este microcontrolador brinda. Sobre esta plataforma basaremos nuestro trabajo adaptando el “programa base” que Microchip ofrece para satisfacer nuestras necesidades de uso dentro de la placa de entrenamiento NeoTeo.
Por ejemplo: en el BootLoader ofrecido (para el 18F4550) se utiliza el puerto D para colocar un LED indicador de estado. El 18F2550 no posee puerto D y en consecuencia tendremos que efectuar alteraciones allí. Por otro lado, un pulsador ubicado en el pin 4 del puerto B (en el desarrollo de Microchip para el 18F4550) nos resulta incómodo ya que el puerto B de nuestro entrenador estaría dedicado a un LCD alfanumérico y al bus I2C. Esta sería entonces otra variante a realizar sobre el programa original. Dicho nuevamente: partiendo de un sistema “base” reformaremos el BootLoader original para migrar desde un 18F4550 a un 18F2550. Atención!: Esto no termina aquí. Avanza a la siguiente página y comencemos a trabajar. ¡Manos a la obra!
Dentro de las cosas necesarias para desarrollar la aplicación de este artículo encontramos el software que utilizaremos para armar nuestro BootLoader “a medida”. Para esto necesitamos tener instalado en nuestro ordenador el entorno de trabajo MPLAB en su última versión (8.50 al momento de escribir este artículo), el compilador MPLAB C para PIC18 (que en realidad es una versión de evaluación por 60 días que puede desinstalarse y reinstalarse en forma indefinida) y por último necesitaremos la librería Microchip Applications Library donde encontraremos una cantidad muy generosa de material para desarrollar programas y aplicaciones. Por supuesto, dentro de este paquete se halla la aplicación (USB Framework) que utilizaremos en este artículo, esto es, el conjunto de archivos BootLoader para diversas familias de microcontroladores, entre ellas, la que utiliza nuestra placa entrenadora. Un detalle a destacar en este punto es que creemos que no es necesario detallar un tutorial con todos los pasos para que instales estos programas. Lo fundamental que debes saber es que son gratuitos y que si tienes alguna duda durante el proceso, la instalación completa de todas las opciones presentadas es la mejor alternativa.
Comienza el trabajo de reforma
Una vez instaladas las aplicaciones, encontraremos dentro de nuestro ordenador y en la ruta “C:Microchip SolutionsUSB Device – BootloadersHID – BootloaderHID Bootloader – Firmware for PIC18 Non – J Devices” el código fuente a utilizar para nuestro propósito. Pero antes debemos saber qué vamos a reformar y por qué lo haremos. En nuestro caso particular, realizaremos una adaptación del hardware y software original para que se transforme en un instrumento compatible con nuestra placa entrenadora. Cabe aclarar que el conjunto de archivos encontrados en la ruta indicada están preparados con las placas de entrenamiento de Microchip, por lo tanto nos cruzaremos con múltiples asignaciones y reservas de hardware que para nuestro objetivo son innecesarias. Por ejemplo, dentro de uno de los ficheros a reformar existen pines del PIC18F4550 asignados a conexiones con el bus SPI, entre tantos pines reservados que para nuestro objetivo primario no tienen utilidad. En otros casos, pines reservados del puerto D no existen dentro del PIC18F2550.
El Hardware
El programa básico que viene para trabajar con el 18F4550 posee un interruptor en el pin 4 del puerto B que se utiliza para indicarle a la placa de entrenamiento que deseamos iniciar el sistema de carga de una nueva aplicación al PIC mediante el uso del BootLoader. En nuestra aplicación (nuestra entrenadora) el puerto B estaría reservado para la conexión de un display LCD y para el bus de datos I2C, por lo que sería apropiado utilizar otros pines libres para colocar este pulsador. El pin 2 del puerto C es una buena opción para este propósito. Por otro lado, el LED que indica la entrada en funcionamiento del PIC en el modo de carga de una nueva aplicación se ubica en el pin 1 del puerto D en los archivos que corresponden al 18F4550.
Nuestro PIC no posee puerto D; por lo tanto no tenemos otra opción que cambiar la ubicación de este indicador luminoso hacia el pin 1 del puerto C. De este modo, podemos notar y observar que necesitamos construir una pequeña placa con un pulsador y un par de LEDs para adaptar nuestra entrenadora al trabajo con un sistema de pre-carga o BootLoader. El aspecto del circuito y la placa es muy sencillo: se destaca el pulsador para activar el modo BootLoader y los LEDs indicadores de estado. Gracias al uso de conectores hembra utilizados en la placa entrenadora NeoTeo, es muy simple organizar un pequeño circuito impreso para que el sistema final resulte cómodo, agradable y eficaz. Por lo tanto, queda claro entonces que hemos utilizado los pines RC0, RC1, RC2 y GND para conectar la nueva placa en nuestra entrenadora. Estas asignaciones de pines debemos trasladarlas al Software en el próximo paso .
El turno del Software
Sólo un archivo del código ejemplo que ofrece Microchip deberá ser cambiado por las razones mencionadas en los textos anteriores. Este archivo se encuentra en la ruta de acceso que mencionamos antes y es io_cfg.h. El nombre del archivo es muy explícito en su función: io_cfg es donde se configuran los pines de entrada y salida del proyecto. Todos los demás archivos involucrados en el directorio son compatibles para una gran cantidad de microcontroladores PIC 18F, entre ellos el que utiliza nuestra placa entrenadora, el 18F2550. Los modelos soportados son PIC18F4553/4458/2553/2458, PIC18F4550/4455/2550/2455, PIC18F4450/2450 y PIC18F14K50/13K50. Por lo tanto, cualquiera de estos microcontroladores que utilice nuestro proyecto final podrá funcionar con este programa BootLoader siempre que tengamos en cuenta una correcta distribución de pines de acuerdo a nuestra necesidad de aplicación en el Hardware.
Hay muchas definiciones (#define) dentro del archivo indicado que escapan del uso sencillo y didáctico que deseamos brindar en este artículo. Por ejemplo, las utilizadas para el uso de un potenciómetro (reóstato, resistor variable) o de tarjetas FLASH de almacenamiento masivo de datos (SD / MMC). Todas esas definiciones y asignación de pines fueron comentadas ya que sólo estamos detrás de un objetivo simple: Cargar un archivo BootLoader y manejar nuestro desarrollo libre de programadores de PICs únicamente con un cable USB. Esto es ideal para actualizaciones de firmware en tareas de campo. Las ampliaciones que la experiencia nos exija pueden esperar. Primero debemos comprender bien qué estamos haciendo y el potencial que tiene este desarrollo de manejar las actualizaciones de software de la manera más sencilla a la que se pueda acceder con elementos de uso diario. Este razonamiento de comprensión y familiarización con las herramientas es válido tanto para nosotros como para nuestros “clientes” o aquellas personas a las que les brindamos nuestros desarrollos.
Resumiendo los cambios de Software: Sólo un archivo hay que reformar: io_cfg.h. Si utilizas la placa entrenadora NeoTeo, te darás cuenta de manera muy fácil cómo y dónde hemos realizado la reforma si husmeas en el archivo indicado. Notarás muchas líneas comentadas con la clásica doble barra inclinada (//).
Resumiendo el Hardware: Una elemental placa pequeña que puedes realizar en pocas horas utilizando elementos de uso habitual en cualquier desarrollo. Resistores un pulsador, un capacitor, un impreso sencillo y algunos pines de conexión.
Comencemos
Esto es el inicio del trabajo con BootLoaders en las aplicaciones ofrecidas a terceros. Como en todo orden de la vida, existe gente convencida de que se trata de lo mejor en actualización de Firmware a distancia (con posibilidad de ejecución por el mismo cliente) y otros insisten con que la técnica del ICSP (In Circuit Serial Program) es la mejor ya que es uno mismo el que supervisa el trabajo de actualización y puede solucionar cualquier “accidente” que por error pueda generar el cliente. Como mencionamos más arriba, Microchip ofrece en la actualidad sistemas que son capaces de conectarse a la web de manera automática y actualizar su firmware sin que el usuario se entere.
Es decir, hay muchos métodos y formas de trabajar con pre-cargadores de archivos o BootLoaders. Nosotros te traemos el inicio de cómo lograr resultados exitosos desde el primer intento. Es por esto que te ofrecemos al final del artículo dos archivos donde encontrarás todo lo necesario para comenzar. En el fichero “Archivos_Unicos” encontrarás el HEX que debes grabar en el PIC con un grabador convencional de PICs (quemador = PicKit2/Pickit3/ICD2/ICD3/GTP-USB +, etc) y al finalizar su grabación conectarás tu desarrollo (o nuestra placa entrenadora) a cualquier puerto USB de tu ordenador para que el trabajo sea identificado como una interfaz HID. Importante: Para que esta operación se realice con éxito, deberás insertar el conector USB manteniendo pulsado el botón SW (BootLoader). La imagen obtenida muestra el comienzo del proceso mientras el BootLoader se instala en la raíz de Dispositivos de Interfaz de Usuario (HID)
Una vez conectado el sistema con el BootLoader pre-grabado en el PIC, detectado por el ordenador, instalado y “listo para ser utilizado”, los LEDs comenzarán a encender en forma alternada. Esta es la señal de que el BootLoader está listo para recibir el programa principal de trabajo. Ese será el momento en que todo estará preparado para iniciar el funcionamiento del pequeño software que utilizarás para cargar los resultados de tus “firmwares” en el PIC con sólo usar un cable USB. Un software gratuito, muy sencillo de utilizar y muy intuitivo (a pesar de estar desarrollado en inglés) el HIDBootLoader es un programa que podrás ofrecer a terceros para que ellos mismos actualicen el firmware del desarrollo que le has vendido, entregado, regalado o prestado (este programa está incluído en los archivos que te ofrecemos para descargar). En primera instancia, el programa detectará la conexión al dispositivo y su estado de BootLoader iniciado presentando una pantalla como la siguiente, donde el botón para abrir una fila del tipo HEX se habilita.
Lo que continúa es muy fácil de intuir. Pulsando el botón “Open Hex File” accederás al archivo a cargar dentro del PIC para programarlo con la real aplicación del desarrollo, por ejemplo, con el programa para hacer funcionar un termómetro I2C o un reloj en tiempo real RTC. El paso siguiente es programar el PIC con el botón “Program / Verify” y allí comenzará el proceso de grabación. Primero se borrará cualquier dato contenido en la zona a programar dentro del PIC y una vez limpios los registros de memoria se dará paso a la programación del dispositivo. Por último, el programa efectúa un control y verificación de las tareas realizadas emitiendo un mensaje satisfactorio cuando todo transcurrió con normalidad.
Además de este fichero HEX pre-armado por nosotros y separado en un archivo aparte para que no te confundas (Archivos_Unicos), en el fichero “BOOTLOADER_NEOTEO” está todo lo necesario para trabajar y modificar este desarrollo, es decir, todo lo que MPLAB necesita para que puedas reformar la aplicación a tu medida. Claro está, los archivos anteriores también están allí. Ahora sólo restan conceptos que tú serás el único capacitado para resolver. Saber cuándo te encuentras frente a una aplicación que necesita actualizaciones con tu presencia o no. Saber cuándo se justifica utilizar un BootLoader o cuándo un conector ICSP es suficiente. Luego de toda esta explicación con palabras y gráficos, ¿deseas ver todo lo explicado en un video para que no te queden dudas? Aquí lo tienes.
Tal como mencionamos al principio, el BootLoader es un programa anfitrión que reside dentro del microcontrolador y se utiliza para facilitar la programación de estos dispositivos. A pesar de ser un programa pequeño, ocupa espacio de memoria interna en el microcontrolador que no podrá sobrescribirse ya que de ese modo estaríamos pisoteando y arruinando las líneas de código del programa BootLoader con nuestro código de aplicación. Para evitar esta catástrofe debemos “reservar” un espacio para que el BootLoader se acomode dentro del microcontrolador y sólo sea activado mediante el pulsador (SW) dedicado a este propósito. Este pequeño programa anfitrión que se desarrolla con esta aplicación se ubicará en la parte más baja del mapa de memoria del PIC ocupando hasta la dirección 0xFFF. Por lo tanto todos los programas que intentemos cargar deberán grabarse desde la posición 0x1000 en adelante. De lo contrario, romperemos el programa BootLoader y el sistema desarrollado no funcionará.
¿Cómo se realiza esto? El los programas escritos en lenguaje ASM se utilizan las directivas ORG para indicar el posicionamiento de los vectores de inicio de programas. En C o en C18 también se hacen llamadas a lenguaje ASM para “mapear” los vectores de RESET, es decir, a partir de qué posición de memoria comenzará a funcionar el PIC si el botón SW (BootLoader) no es activado al momento de conectar el desarrollo al puerto USB. En el caso de cualquier lenguaje BASIC bastará con una declaración ubicada en una única línea. Por ejemplo en Proton sería “DECLARE PROTON_START_ADDRESS = $1000”
Hay sistemas que utilizan menos espacio de memoria interna para el programa BootLoader, en los que el vector de reset de una aplicación se ubica en 0x0800. Como habrás observado siempre, nuestra intención es guiarte, ayudarte y recorrer juntos el camino que resulte más sencillo y cómodo para el inicio. MPLAB posee una herramienta para visualizar la cantidad de memoria ocupada por el programa y nuestro BootLoader (ejemplo extraído de la librería de Microchip) ofrece la siguiente imagen entrando en la vista de este parámetro.
Resumen final
Antes de lanzarnos a diseñar aplicaciones con un sistema de BootLoader debemos tener en claro si la aplicación justifica su uso. La experiencia nos dirá si es necesario o no. Vender un sistema de letreros luminosos a una empresa de vehículos de transporte de larga distancia con sede en Estambul merece utilizar este sistema de actualización a distancia realizado por algún técnico local o directivo de la empresa. Construir una pequeña central que controle la temperatura y la humedad de nuestra habitación no justifica este trabajo ya que el ICSP nos soluciona todo el problema en cuestión de minutos. Es decir, a partir de ahora y con las herramientas en la mano, el que sabe y decide eres tú.
Por último, y como es lógico entender, el pulsador y los LEDs indicadores de funcionamiento deberán estar integrados en tu construcción final de manera permanente si deseas utilizar el método de pre-cargador (BootLoader). RC2 (para nuestra aplicación) siempre debe estar polarizada en un estado alto al encender el sistema o al conectarlo al puerto USB. Caso contrario, el programa interpretará un estado bajo y de ese modo creerá que queremos cargar un nuevo programa. Por lo tanto, esto no es algo que se pueda utilizar sólo para cargar el programa al microcontrolador sino que es parte del Hardware final y definitivo. En cambio, los pines que operan los LEDs indicadores pueden ser reutilizados dentro del Hardware para otras funciones. Comparte tus experiencias, mejora nuestro desarrollo y cuéntanos tus resultados. Cerramos con la frase que siempre te decimos: tú y tu ingenio sabrán hacerlo mejor.