ICSP: Cómo Usar "Programación Serial En Circuito" con Microcontroladores PIC
Cuando se desarrollan sistemas microcontrolados resulta muy ineficiente tener que sacar el PIC de su circuito para reprogramarlo una y otra, y otra vez... Si el proyecto es relativamente largo, esto no solamente consume un tiempo considerable, sino que también puede afectar la vida útil del PIC (los pines podrían doblarse y romperse) y si se está prototipando en breadboard, también se reduce la vida útil del breadboard.
En este tutorial se muestra un circuito práctico con la conexión de todas las señales ICSP para programar y reprogramar el PIC "en circuito", sin la necesidad de extraerlo de su circuito de aplicación. Este tutorial sirve a su vez como un desarrollo introductorio de los conceptos básicos de la Programación Serial En Circuito (ICSP).
Video Demostrativo
¿Que es ICSP?
ICSP es el acrónimo de la frase en inglés: "In Circuit Serial Programming" (Programación Serial En Circuito); es una tecnología incluida en todos los microcontroladores PIC de Microchip más recientes y posibilita la reprogramación de los mismos sin que sea necesaria la remoción de éstos de su circuito de aplicación. Esta característica es extremadamente útil no solamente en la etapa de desarrollo debido a que ahorra tiempo y trabajo, sino que su utilidad se extiende a la etapa de mantenimiento y actualización de los sistemas, dando la posibilidad de reprogramar los mismos "en el campo" en sus respectivas placas ya soldadas, ya sea para corregir errores de software o para la mejora del sistema con la implementación de nuevas funciones.
Este método de programación (lectura, escritura y verificación) no es exclusivo de los microcontroladores Microchip, ya que otras marcas como Atmel, Parallax y otros usan también métodos similares conocidos de manera genérica como ISP (In System Programming) y en la arquitectura de Procesadores ARM se utiliza un método similar conocido como JTAG.
Programadores ICSP
Todos los modelos recientes de microcontroladores PIC se programan usando ICSP con voltaje alto de programación y una variante con LVP (LVP es "Low Voltage Programming" - más adelante hablaremos de esto). Así mismo, todos los programadores modernos de PIC utilizan este método para programarlos, aunque esto no sea aparente en algunos programadores que cuentan por ejemplo con un socket ZIF, como el mostrado en la figura.
En el caso de los programadores con socket ZIF, El método de programación sigue siendo ICSP (Programación En Circuito), sólo que en este caso todas las señales ICSP están cableadas al socket ZIF; sin embargo debido a que el PIC debe ser removido del circuito para ubicarlo en el socket, se contradice el propósito inicial de la idea, la cual es justamente no remover el PIC de su circuito. Para los principiantes el uso del socket ZIF es más conveniente; sin embargo para quien debe realizar un trabajo de largo aliento, con muchas iteraciones de re-programación, programar el PIC sin tener que removerlo cada vez de su circuito es mucho más conveniente.
En la siguiente fotografía vemos un ejemplo de un sistema siendo programado "en circuito":
Señales y Conexiones en el Cabezal ICSP
Las señales conectadas entre el PIC y el dispositivo programador para realizar la escritura, lectura y verificación del programa son las siguientes:
- VPP (Voltaje de Programación): Es un voltaje entre 12-14 VDC aplicado al pin MCLR/VPP del PIC, y es usado para poner al PIC en estado de programación.
- PGC (Program Clock): Señal de reloj provista al PIC para sincronía.
- PGD (Program Data): Línea serial de datos para escritura, lectura y verificación de la memoria de programa (ROM Flash) del microcontrolador.
- VDD (Voltaje de Alimentación 5/3.3 VDC): Voltaje de alimentación provisto al PIC. En el caso de los programadores Pickit 2 y Pickit 3, estos primeramente consultan este pin para verificar si el PIC ya está siendo alimentado externamente (recomendado) de otro modo, existe la posibilidad de configurar al programador para que éste mande voltaje de alimentación al PIC a través de esta línea.
- GND (Ground): Conexión a tierra.
El siguiente diagrama de circuito muestra un método muy usual para la implementación de ICSP:
Como se puede observar, el método ICSP utiliza pines en el microcontrolador que también pueden cumplir potencialmente otras funciones; en el caso del PIC16F628A tenemos por ejemplo:
- El pin RA5/MCLR/VPP, además de ser el pin VPP es el pin RA5 del puerto A y la entrada de reset (MCLR).
- El pin RB7/T1OSI/PGD, además de la conexión serial de datos para la programación (PGD) es también el pin RB7 del Puerto B y la entrada de oscilador del Timer1 (T1OSI).
- El pin RB6/T1OSO/T1CKI/PGC, es la entrada de reloj para ICSP, además de ser el pin RB6 del Puerto B, la salida de oscilador del Timer1(T1OSO) y la entrada de reloj del Timer 1 (T1CKI).
Por tanto, los pines anteriores cumplen básicamente dos funciones: 1) Funciones relacionadas a la aplicación principal del circuito, y 2) Funciones para la conexión con el dispositivo programador que posibilite la lectura, escritura y verificación de la memoria de programa "en circuito".
Circuito de Aislación
Para que la programación se lleve a cabo de manera correcta y segura, es necesario aislar el circuito de aplicación del circuito de programación. El circuito ejemplo mostrado en la figura anterior nos muestra de qué manera se puede lograr esto:
- Conectar un diodo de señal (como el 1N4148 u otro similar) entre el pin MCLR/VPP y el circuito de reset (resistencia + capacitor) de la aplicación. Esto aisla al circuito de reset y la fuente de voltaje del microcontrolador de los 12-13 voltios generados por VPP en el momento de la programación.
- Conectar otro diodo de señal entre el pin VDD y la alimentación de voltaje del circuito de aplicación. Esto posibilita que en caso de que el VDD del circuito del microcontrolador esté encendido, éste sea aislado de la alimentación de voltaje provista por el programador; en todo caso es más recomendable y seguro usra la alimentación propia del circuito de aplicación para energizar el PIC que usar la alimentación de voltaje provista por el programador, sobre todo para los principiantes.
- Conectar resistencias (típicamente 10K) entre los pines PGD y PGC y el circuito de aplicación a fin de que la reactancia vista desde estos pines no afecte la integridad de las señales de datos y reloj utilizadas en la escritura, lectura y verificación del programa. Si la aplicación lo permite, es recomendable dejar libres estos pines para ser usados exclusivamente para la programación ICSP.
Respecto a la aislación de los pines PGD y PGC es importante recalcar que si bien este típico ejemplo de circuito de aislación funciona para la mayoría de los casos, no es una receta segura para todos, y en algunos casos podría requerirse ligeras modificaciones o incluso un planteamiento diferente para lograr dicha aislación.
Depuración con ICSP
Cabe notar también que ICSP, aparte de proveer el método para la escritura, lectura y verificación del código de programa en el microcontrolador, provee también métodos para la depuración y la emulación "en circuito"; capacidades que vienen adicionalmente implementadas en ciertos dispositivos conocidos en inglés como "programers/debuggers/emulators" (programadores/depuradores/emuladores). Ambas capacidades adicionales complementan grandemente la "caja de herramientas" de todo desarrollador de sistemas microcontrolados.
Programación Con Bajo Voltaje (LVP)
La Programación Con Bajo Voltaje LVP (Low Voltaje Programming) es una opción adicional de programación presente en los PICs la cual permite obviar VPP (12-14 VDC) y utilizar bajo voltaje. Para ello los PICs cuentan con otro pin denominado PGM (el pin RB4/PGM en el caso del PIC16F628A) através del cual el dispositivo programador toma control del PIC para su programación. Los detalles de este método salen del alcance de este tutorial, simplemente añadiremos que, si se va a usar ICSP con VPP (12-14 VDC), es recomendable dejar deshabilitada la Programación Con Bajo Voltaje (LVP) en el microcontrolador (mediante la escritura del bit correspondiente en la palabra de configuración (registro CONFIG) del microcontrolador, esto para evitar desprogramaciones accidentales del PIC. La desventaja de LVP es que cualquier ruido o pico de voltaje más o menos fuerte puede desprogramar accidentalmente el PIC, por lo cual, es mejor deshabilitarlo y usar la programación ICSP con voltaje alto.
Conclusión
Implementar ICSP se hace imprescindible en un proyecto que requiere muchas iteraciones de re-programación en la etapa de desarrollo; por otra parte brinda también la posibilidad de actualización y mejora del programa cuando los componentes ya están soldados en la placa y el sistema ya está en funcionamiento. Para quienes nunca antes programaron "en circuito", implementarlo puede parecer un poco intimidante al principio, sin embargo es un paso necesario a dar, a fin de mejorar la eficiencia en el desarrollo de sistemas microcontrolados.
Nada reemplaza la adecuada investigación y búsqueda de información antes de probar herramientas y técnicas nuevas para uno, por lo cual es muy recomendable revisar también la documentación oficial de fabricante respecto a la Programación Serial En Circuito, a fin de contar con la información detallada y de primera mano respecto a este tópico.
Raúl Alvarez Torrico
www.TecBolivia.com
Deseo recibir noticias de nuevos proyectos, artículos, materiales y promociones especiales.