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/

13 comentarios en “ICSP

    1. jecrespom Autor

      Hola Martín, es posible que se haya corrompido o borrado el bootloader, porque aunque lo hayas programado para mandar datos por el serial, no tiene porque «brickearse».

      Prueba a quemar el bootloader al Arduino. Para ello necesitas un programador ISP como este https://store.arduino.cc/arduino-isp o usar otro Arduino como un programador ISP siguiendo estas instrucciones https://www.arduino.cc/en/Tutorial/ArduinoISP y quemar de nuevo el bootloader con el IDE de Arduino en menú herramientas y quemar bootloade, seleccionado la placa correcta en el menú herramientas.

      Ya me dirás si se soluciona. Puedes mandar consultas también a aprendiendoarduino@gmail.com

      Me gusta

      Responder
  1. Pingback: Saber más Arduino Avanzado 2018 | Aprendiendo Arduino

  2. Pingback: ▷ ARDUINO UNO REV 3 |Imprescindible en prototipos IoT - Internet de las cosas Industrial (IIoT)

  3. Jorge

    Hola! No se si alguien sigue activo por aqui. Quiero desarrollar mi propia placa basada en ATMEGA 328P. Pero no se si es posible grabar codigo en esta directamente desde mi PC. Imagino que si coloco un zocalo para pinchar un programador ICSP que vaya conectado a los pines que toca del ATMEGA328P no necesito nada mas verdad?? Con ese programador podría quemar el bootloader que desease y después grabar el codigo en el ATMEGA328P.

    Agradezco cualquier ayuda!

    Le gusta a 1 persona

    Responder
    1. jecrespom Autor

      Hola Jorge,
      Puedes programar un ATmega 328p directamente desde tu PC, se hace mediante el puerto ICSP como explico en este post y puedes colocar el microcontrolador en una protoboard y hacer el cableado a un programador ICSP, en este post tienes uno de pololu, pero hay de otras marcas.
      Si no quieres comprar un programador ICSP, puedes usar un Arduino como programador ICSP como se explica aquí: https://www.arduino.cc/en/Tutorial/BuiltInExamples/ArduinoISP
      Puedes mandarme un correo a aprendiendoarduino@gmail.com si tienes más dudas.

      Me gusta

      Responder
      1. Jorge

        Muchísimas gracias, la idea es hacer unas cuantas PCB con este microcontrolador por lo que más que montarlo en una protoboard y cablear cada vez que quiera quemar el bootloader y grabar el código quería asegurarme de que esto se podía hacer poniendo un ISP6PIN en mi placa y uniendo cada uno de sus pines con los pines MISO,Vcc,SCK,MOSI,RESET y GND del microcontrolador. Por lo que veo si que es posible asique duda solucionada 🙂
        Nuevamente muchisimas gracias y excelente el post!!

        Le gusta a 1 persona

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.