Un avance con el que convivimos desde hace tiempo y nos parece ahora algo evidente pero que simplifica y hace más cómodo el desarrollo de aplicaciones para microcontroladores, es la posibilidad de grabar el programa con el microcontrolador ya integrado en un circuito, sin necesidad de retirarlo o antes de incorporarlo al mismo. Esta característica se suele llamar programación (serie) en circuito: ICSP, nomenclatura habitualmente usada por Microchip, o programación en sistema: ISP, término más genérico y el usado en el ámbito de Atmel.
Aunque la propia placa de Arduino actúa como un programador que se comunica con el ordenador por medio del puerto USB, también dispone de un conector ISP al que conectar un programador externo. En las imágenes de abajo se ubica el conector en un clon de Arduino Uno, seguro que ya lo habrás visto en el borde de la placa, en el extremo opuesto al conector USB.
Desde el punto de vista del software, los tres programadores más utilizados son AVRDUDE, BOSSA y Uisp, ordenados más o menos por popularidad. El primero es el tradicionalmente usado en la arquitectura AVR y el segundo en la arquitectura ARM. Internamente, el IDE de Arduino utiliza AVRDUDE y BOSSA (para los Arduino Due) cuando se graba el programa en la memoria del microcontrolador.
Como Arduino, otros ambientes integrados de desarrollo utilizan llamadas a algunas de las anteriores aplicaciones para grabar los programas en los microcontroladores. También existen entornos gráficos para explotar estas aplicaciones que inicialmente funcionan desde la línea de órdenes. Por supuesto, todo esto puede hacerse gracias principalmente a que se licencian como software libre.
Lógicamente, el entorno integrado de desarrollo (IDE) de referencia es Atmel Studio, una excelente aplicación capaz, por supuesto, de grabar por ISP que, aunque basa alguna de las tareas que realiza en software libre, lamentablemente no lo es en sí misma.
En cuanto al hardware, existen multitud de programadores capaces de grabar usando el protocolo ISP ya que es muy sencillo de implementar y muy barato. Por supuesto, las placas de desarrollo, que incluyen capacidades de depuración por hardware, pueden grabar usando ISP y si vas a dedicarte de manera intensiva a desarrollar seguro que te merecerá la pena conseguir una, aunque sean en general caras. Si estás empezando o la programación no va a ser tu principal ocupación, seguramente no necesitarás más que un grabador ISP que, en cualquier caso es una herramienta básica que seguro necesitarás.
De entre la multitud de programadores a los que me refería antes, hay tres que pueden destacarse por ser muy populares, baratos y sencillos de conseguir. En la imagen de abajo pueden verse, de izquierda a derecha, un programador de hardware libre basado en USBTiny, un grabador compatible con ST-Link para microcontroladores con arquitectura ARM (como Arduino Due) y un grabador del tipo USBasp, también hardware libre.
Para muchísimos proyectos basta con el microcontrolador y el entorno de desarrollo de Arduino, incluso con los más básicos AVR, así que puedes desarrollar el proyecto usando una placa Arduino y luego implementar el desarrollo en el microcontrolador ya incorporado a la PCB de tu montaje. Por supuesto que puedes darle soporte USB y utilizar el bootloader de Arduino pero es muy probable que te baste con incluir sólo un conector ISP para grabar el programa con alguno de los anteriores programadores.
El esquema de abajo muestra los dos tipos de conectores ISP estándar de 10 y 6 pines, como el de Arduino. Como sugiere la nomenclatura de los pines del conector, se utiliza la comunicación SPI en la que el microcontrolador es esclavo mientras se está grabando el programa en él. Como es lógico, a la hora de diseñar el circuito debe tenerse en cuenta que será programado en sistema y que utilizará este tipo de comunicaciones para evitar incompatibilidades con el resto del montaje.
Como la programación en sistema está soportada por el propio hardware, un montaje mínimo permite, usando alguno de los grabadores anteriores, programar el micro. En el esquema de abajo se muestra una conexión típica; de hecho, dependiendo de la configuración del microcontrolador, puede que sólo sea necesaria la resistencia. Los valores típicos de los componentes son 10 KΩ para la resistencia y 22 pF para los dos condensadores, con un oscilador de 16 KHz. También puede extrapolarse para su inclusión en otros montajes a excepción de la tensión de referencia que no necesariamente se conectará a la de alimentación.
Ya que tenemos todos los ingredientes y para terminar, vamos a ver cómo ejecutar la programación del microcontrolador. Básicamente, necesitamos decirle a la aplicación de grabación el tipo de microcontrolador que queremos programar, el programador que usamos, en su caso, el puerto al que se conecta, y el documento con el programa que queremos grabar. Por ejemplo, para grabar con un programador USBTiny un microcontrolador ATmega328P (como el de un Arduino Uno) usando AVRDUDE podríamos usar la orden:
Con el parámetro -c se indica el tipo de grabador, el microcontrolador con -p, -D para no borrar la memoria antes de empezar y por fin -U para indicar la operación: en este caso escritura (w) en la memoria flash, el programa documento.hex que tiene el formato Intel HEX, representado por la i del final.
Para usar el programador ISP desde el IDE de Arduino sólo hace falta seleccionar la placa de desarrollo y el programador ISP desde el menú «Herramientas» y grabar el programa con la entrada «Cargar usando Programador» del menú «Archivo» como muestran las siguientes capturas de pantalla.
Damian
Hola, muy bueno tu aporte! Hace tiempo que estoy buscando información sobre el tema, muchas gracias! Solo tengo una duda, si yo por ejemplo tengo un programador ISP de tipo USBasp puedo (con los pasos de los screenshots, obviamente seleccionando ese tipo de programador) programar un micro cualquiera de la serie ATMEL? quisiera saber por que quiero incluir micros SMD y si les dejo en la placa que hago el conector ISP y puedo programarlos ya soldados en su lugar seria un muy buen dato, por que conservaría el IDE y el lenguaje de Arduino.
Desde ya muchas gracias y diculpa las molestias.
Abrazo!
Víctor Ventura
Hola, Damian.
Hasta donde yo sé, el USBasp sirve para cualquier Atmel de la familia AVR; es decir, no sirve para todos los Atmel ya que no es capaz de programar los de arquitectura ARM.
En principio pueden programarse en circuito (ISP) independientemente de que sean SMP o DIP, soldados o no, será precisamente el diseño del circuito (y no el µC) el que puede dar problemas si es que incluye algo que lo impida y supongo que no será el caso ya que entiendo que el circuito lo diseñas tú.
Respecto a usar el IDE de Arduino en tu propio montaje tampoco hay ningún problema, es algo que últimamente se está volviendo habitual, sobre todo en prototipos.
Espero haber sido de ayuda.
¡Muchas gracias por visitar nuestro blog!
Damian
Muchas gracias por la respuesta! Me fue de mucha ayuda! Entonces yo puedo programar un ATmega 2560 o un 328 con el programador USBasp y el enterno arduino, verdad? Concretamente es lo que yo busco, y no sabia si tenia que usar mi placa arduino como programador ISP o directamente los programadores que mencionaste!
Un puerto USB, la placa con el micro, el programador USBasp y listo! Muchisimas gracias!
jaime ortega
amigo, muchísimas gracias, si no es por este sito, jamas hubiera imaginado una forma de reutilizar mi arduino dañado del puerto usb, excelente.
Víctor Ventura
🙂
Ger
Gracias, muy claro y asimilable, un saludo
Víctor Ventura
🙂
Manuel
Hola, espero pueda ayudarme, desarrolle un programa en arduino y lo grabe en un atmega644, quiero saber si existe forma de modificar el programa en el futuro mediante puerto serie (debido a que el circuito quedara sellado y no puedo estar montando y desmontando el atmega644 para cargarle el codigo nuevo o modificarlo, espero su respuesta, Gracias.
Víctor Ventura
Hola, Manuel.
En principio sí que puedes, dependerá de que el software o el hardware que has implementado no interfiera con las comunicaciones UART o SPI, lo que uses para reprogramarlo.
Saludos y gracias por visitar el blog.
Manuel
En este punto puedo utilizar la idea de software o hardware que me recomiende, el objetivo es cargar un programa mediante arduino al atmega644, por medio de una conexion USB, si conoce la forma me podria orientar?
Gracias por su pronta respuesta, saludos.
Víctor Ventura
Hola, Manuel.
Creo que lo más sencillo es que cargues un bootloader de Arduino al ATmega 644 y lo programes posteriormente (y tantas veces como quieras) usando SPI, más sencillo y te ahorras añadir más circuitería para hacerlo por USB.
El único posible inconveniente que puede tener este método es que necesitarás un programador (hardware) como alguno de los que menciono en el artículo. Por otro lado, son muy baratos y es una herramienta que es muy práctico tener en tu equipo.
Espero haber sido útil. Gracias por participar en polaridad.es
Manuel
Gracias por su tiempo, ya habia realizado eso, tanto bootloader como SPI, pero otro problema es que ocupo los puertos MISO MOSI con una conexion hacia un thermocoupler, pero al parecer entra en conflicto y no puedo realizar las dos funciones, SPI o el trabajo del sistema por esos puertos simultaneamente.
Víctor Ventura
Hola, Manuel.
Pues si tienes el bus del SPI ocupado en otras tareas no te queda mucho más que añadir un conversor USB serie (TTL). Nunca lo he probado con un ATmega 644, pero supongo que debería funcionar.
Por economía, puedes dejar la conexión serie en el circuito microcontrolado y usar algún adaptador USB serie externo para cuando lo quieras reprogramar.
Por favor, cuéntanos qué tal resulta el proyecto por si ayuda a otros lectores. Gracias por participar en polaridad.es
Manuel
Gracias por su ayuda
Víctor Ventura
🙂
Zouhair
Entrada interesante aunque no llegue a terminarla; recien he empezado con el arduino, pero como automaticien solo me manejo con el ladder asi que estoy propando con IdMicro compila al hex y con xloader se puede cargar el programa usando un cable usb, creo que es una opcion ideal para gente que solo se maneja con el ladder…
adnan
primero gracias por la informacion si me permite una pregunta tengo que grabar un programa de un xc95144 exilinx y tengo un programador TNM5000 con isp que tiene isp de 10 pines me pregunta si es necesario mlementar la tarjeta con voltaje o solo con el voltaje del programador es tube una falla de comonicacion entre la tarjeta y el programador
saludos
y muchas gracias
Víctor Ventura
Hola, Adnan.
No conozco el programador TNM5000 🙁 Pero dejo tu consulta en el blog por si algún lector trabaja con él y te puede contar su experiencia.
Por si te sirve de ayuda, de los que yo conozco, la mayoría de los programadores suelen incluir la alimentación que necesite el dispositivo para poder utilizarlos (también) sin otras conexiones, y en algunos casos porque la tensión de programación es diferente de la de funcionamiento.
Gracias por participar en polaridad.es ¡Vuelve pronto!
adnan
gracias sr victor
le agradezco tu comentario espero algun lector que nos amplea el tema ,pero con tu comentario tengo la respuesta
cordiales saludos
Chuis
Hola a todos, tengo un pro.mini 328p que lleva un mega 328p en resumen una plaquita de 2€, ésta lleva un cristal de 16mhz y la programo con la plataforma de arduino y un usb-ftdi para cargarlo. He leido algo la data sheet del micro y veo como pasa con los pic que tiene relojes internos de baja frecuencia que pueden ser muy interesante cuando estas en muy bajo consumo. Cómo puedo conmutar del reloj de 16mhz externo al de 32khz interno?. Otra pregunta, si uso un ISP de los comentados anteriormente puedo grabar la flash sin que exista un loader en su memoria y sin usar el reloj de 16mhz ya que veo que el isp sirve una señal de clk para grabar?, se que en los pics si se puede hacer aquí tengo dudas. Gracias por tus aportes Victor.
Víctor Ventura
Hola, Chuis.
Cambiar la frecuencia del reloj (o usar el interno) no es sencillo porque no lo han previsto directamente en el IDE de Arduino. Tómalo con mucha precaución porque nunca lo he hecho pero, según creo, tienes que cambiar el documento boards.txt de la carpeta hardware para establecer la velocidad y los fuses y otro tanto en el MakeFile que se usa para compilar el programa. A ver si algún lector lo ha hecho y tiene un método que ofrecernos, porque es una cuestión muy interesante.
Con respecto a la pregunta de grabar un MCU sin bootloader, seguramente hay algo que se me escapa, claro que se puede programar sin el bootloader ¿Cómo se grabaría si no el bootloader la primera vez?
Gracias por participar en polaridad.es
Leonidas Morales
Buen dia necesito contactar a un programador en Arduino para que realice un trabajo con los siguiente componentes
Programador de Arduino Uno
Adruino Nano
Memorias SD o la que soporte Arduino
modulo GPS Arduino
Modulo Bluetooth Arduino
1 entradas analogica resistencia de 0 a 5 voltios DC
1 entradas analogica resistencia de 0 a 5 voltios DC
Esta publicacion fue realizada el 10 de enero de 2017 Mi correo es leonidasmorales@logix-uet.com y mi cuenta de Skype es leonidasmorales
HUMBERTO AREVALO
como hago para conectar spi por medio de labview