Archivo de la categoría: ICSP

ICSP

En resumidas cuentas, el núcleo de cualquier placa Arduino se compone simplemente de un microcontrolador AVR. En el caso de la placa Arduino UNO, su microcontrolador es el ATMega328.

Conforme uno se va adentrando en el mundo de Arduino y los proyectos se vayan haciendo cada vez más grandes y complicados, puede presentarse la necesidad de recurrir al uso de un segundo microcontrolador, para lo cual, es mejor conseguir un microcontrolador AVR por separado puesto que es mucho más barato y/o rentable que volver a comprar una nueva placa Arduino.

Un inconveniente de comprar un nuevo microcontrolador AVR es que éste vendrá de fábrica completamente “limpio” (sin ningún programa cargado), como consecuencia, habrá que grabar por primera vez el Bootloader (Gestor de arranque) para que éste pueda cargar y hacer funcionar los sketches programados con el software de Arduino.

La placa Arduino posee una entrada ICSP (In Chip Serial Programmer) que tiene acceso a la memoria de programa del AVR (Flash), ésto es, que puede grabar directamente desde el PC al microcontrolador cualquier programa sin usar el puerto USB. Uno de ellos, el mismo Bootloader de Arduino.

Programación serial en circuito (ICSP por las siglas del inglés : In-Circuit Serial Programming), es la habilidad de algunos dispositivos lógicos programables, microcontroladores y otros circuitos electrónicos, de ser programados mientras están instalados en un sistema completo, en lugar de requerir que el chip sea programado antes de ser instalado dentro del sistema.

Típicamente, los chips que soportan ISP tienen circuitería interna que les permite generar el voltaje de programación necesario desde la línea de alimentación convencional y comunicarse con el dispositivo programador mediante un protocolo serie. Muchos dispositivos lógicos programables usan una variante del protocolo JTAG para el ISP, esto es para facilitar la integración con procedimientos de prueba automatizada. Otros dispositivos usan protocolos propietarios o protocolos definidos por antiguos estándares.

ICSP es un método de programar directamente los microcontroladores de AVR, PIC y otros.

Como los microcontroladores suelen ir soldados a las placas, la forma de poder programarlos en mediante el conector ICSP y para programarlos es necesario un HW adicional denominado programador.

El pineado de las señales ICSP cambia en función de cada fabricante y del microcontrolador.:

En el caso de ATMega328p:

En el caso de Arduino va al conector:

Estos pines sirven para la programación del ATMEGA328P-PU a través del puerto serie, de ahí las siglas ICSP (In Circuit Serial Programming), se utilizan para grabar el bootloader en el microcontrolador o modificar el programa a través de este puerto sin necesidad de sacarlo del zócalo. El bootloader ya viene grabado de fábrica en este microcontrolador. Podemos identificar el pin1 del ISCP en la placa fijándonos el pequeño punto blanco que está grabado sobre ella, ese punto nos indica que se trata del pin número 1, igual ocurre en los chips, microcontroladores y otros circuitos integrados.

El conector ICSP tiene dos versiones:

Más información:

Pero no solo se puede programar Arduino mediante USB o como acabamos de ver por el puerto ICSP, sino que también es posible hacerlo mediante un cable FTDI conectado al puerto serie de Arduino. Este tema se explicará profundamente en siguientes capítulos.

ICSP es un conector consistente en 6 señales: MOSI, MISO, SCK, RESET, VCC, GND y además de ser un puerto para programar Arduino, también es el conector de expansión del bus SPI mediante el que también podemos comunicar periféricos y es usado en algunos casos para comunicar Arduino con los shields. Se puede considerar el ICSP como un “esclavo” del master del bus SPI del microcontrolador.

En referencia a los microcontroladores AVR, el ICSP es la forma que tenemos de programarlos de forma in-system, conectando un programador a estos 6 pines. El programador manda el fichero hex ya compilador al microcontrolador mediante un protocolo concreto como puede ser el STK500.

La forma en que programamos Arduino generalmente es mediante el puerto serie gracias al bootloader cargado en el microcontrolador que se comunica con el puerto serie para copiar el fichero compilado en la flash. Al mandar los comandos correctos, lee los datos del puerto serie de Arduino que es convertido a USB por el ATmega8u2 o ATmega16u2 y guarda todos los datos recibidos en la memoria Flash. Por este motivo necesitamos un bootloader para programar Arduino a través del USB.

Por otro lado la programación ISP primero resetea el Arduino y lo mantiene, mientras el reset está mantenido Arduino no funciona y ningún programa que tenga. En su lugar el programa codificado en hexadecimal se transmite a través de los pines MOSI (Master Out, Slave In) and MISO (Master In, Slave Out) y temporizado con el CLOCK. por lo tanto en este caso no necesitamos del bootloader.

Más información: http://www.vwlowen.co.uk/arduino/icsp/page3.htm

Un ejemplo de como usar ICSP con un PIC: http://tecbolivia.com/index.php/articulos-y-tutoriales-microcontroladores/19-icsp-como-usar-qprogramacion-serial-en-circuitoq-con-microcontroladores-pic

En el caso de usar un programador externo en lugar de USB para cargar un sketch, el procedimiento es el mismo pero seleccionando el programador adecuado en el IDE.

Como usar un programador externo: http://arduino.cc/en/Hacking/Programmer

Ejemplo de programador externo: http://www.pololu.com/product/1300

Construir un programador paralelo: http://arduino.cc/en/Hacking/ParallelProgrammer

En la ruta C:\Program Files (x86)\Arduino\hardware\arduino\avr\programmers.txt, tenemos la configuración de los programadores que podemos usar con el IDE de Arduino. En este fichero se especifica la comunicación, protocolo, herramienta y parámetros. Esto sirve para decir al la herramienta de programación avrdude qué parámetros usar para cargar el programa.

Ejemplo de uso de un Arduino nano como programador ISP: http://www.martyncurrey.com/arduino-nano-as-an-isp-programmer/