Montaje ATmega8

Grabando un programa .hex en un chip de Atmel con ArduinoISP

Últimamente estoy trabajando  en un proyecto personal (ya pondré algo más adelante, cuando lo tenga más avanzado) y me he visto en la necesidad de grabar un archivo .hex en un ATmega8 indicando los fuses alto y bajo. El problema es que no dispongo de un programador AVR, sino que para grabar programas en chips de Atmel suelo usar un Arduino UNO con ArduinoISP estando el programa en código fuente (como comenté en mi entrada sobre programar un ATtiny con Arduino), no ya compilado.

Nota:

He escrito esta entrada poniendo como ejemplo el ATmega8 pero lo he probado también con el ATtiny45 (usando la carpeta de los “cores” del ATtiny en lugar de la carpeta hardware de Arduino) y funciona, con lo cual sabiendo dónde están los pines de RESET, MOSI, MISO y SCK y teniendo el core del chip en cuestión no debería haber problema.

No encontraba por ningún lado en el Arduino IDE la opción de grabar .hex directamente así que en un primer momento pensé en usar avrdude de forma manual. Sin embargo luego me acordé de que el IDE permite cargar el Bootloader o Secuencia de Inicio, que no es otra cosa que un archivo .hex, así que pensé en modificar una entrada en la lista de tarjetas que especificara que el bootloader era el programa que yo quería grabar. Y funcionó. Lo hice de la siguiente manera:

Busqué la carpeta de hardware en la carpeta de Arduino. Dentro de la carpeta hardware hay a su vez otra carpeta llamada arduino con los cores de los chips que llevan los arduinos.

En esta última carpeta hay otra carpeta llamada bootloaders. Copié dentro de la carpeta del chip a utilizar el archivo .hex.

En la carpeta arduino también hay un archivo llamado boards.txt. Lo edité con un editor de texto, copié y pegué la opción que más se parecía a lo que yo quería del ATmega8 y lo modifiqué de la siguiente forma:

miatmega8.name=Grabar hex en atmega8

miatmega8.upload.protocol=arduino
miatmega8.upload.maximum_size=7168
miatmega8.upload.speed=19200

miatmega8.bootloader.low_fuses=0x9f
miatmega8.bootloader.high_fuses=0xc9
miatmega8.bootloader.path=atmega8
miatmega8.bootloader.file=miatmega8.hex
miatmega8.bootloader.unlock_bits=0x3F
miatmega8.bootloader.lock_bits=0x0F

miatmega8.build.mcu=atmega8
miatmega8.build.f_cpu=16000000L
miatmega8.build.core=arduino
miatmega8.build.variant=standard

  • Modifiqué los prefijos de todas las lineas para no entrar en conflicto con la opción de la que me copié.
  • Modifiqué el nombre (name) de la opción.
  • Modifiqué los valores de las líneas low_fuses y high_fuses (en mi caso tenía que especificar unos valores concretos).
  • Modifiqué el valor de la línea file con el nombre del archivo .hex

A continuación cargué el programa ArduinoISP en mi Arduino y lo conecté al ATmega8 como indica la tabla:

pinout ATmega8
pinout ATmega8
Arduino ATmega8
5V Pin 7
GND Pin 8
 Pin 10 Pin 1
 Pin 11 Pin 17
 Pin 12 Pin 18
 Pin 13 Pin 19

¡No olvidéis conectar un condensador de 100pF entre las patillas RESET y GND del Arduino! 

Por último inicié el IDE de arduino, en Herramientas > Programador, seleccioné Arduino as ISP y en Herramientas > Tarjeta la opción que yo había creado (en este caso Grabar hex en atmega8). Le di a Herramientas > Grabar secuencia de inicio y tras unos segundos el programa estaba grabado en el ATmega8.

Nota:

Es posible que aparezca un error en el que avrdude (el programa que utiliza el IDE de arduino para grabar el programa en el chip) devuelve “wrong signature“. Si las conexiones están bien es posible que sea debido a que el chip está configurado para funcionar con un reloj externo. En ese caso conectadle el reloj y debería funcionar.

Comparte:

Publicado por

Alfonso Jiménez

Ingeniero informático. Desarrollador entusiasta de todo lo que se deja programar.

8 comentarios en “Grabando un programa .hex en un chip de Atmel con ArduinoISP”

  1. Hola Alfonso,

    Lo primero felicitarte por su pasión, pues despues de leer tu trayectoria me atrevo a describirlo con esta palabra.
    Encuentro tu web buscando en internet información sobre la programación del ATtiny44a usando Arduino como interface…
    Recientemente me interese en este por un proyecto que estoy tratando de darle forma. Como profano en este terreno de la programacion, con grandes dificultades como imaginaras…
    Si bien me manejo mejor en la parte mas “física” de la electrónica e informática (hardware).
    Dicho esto mi pregunta es la que sigue:
    Es posible leer un ATtiny44a previamente programado con el Arduino Uno?
    Necesitaría poder copiar la programación del mismo en otros totalmente “vírgenes” . Es posible?

    Gracias.
    Un saludo,

    Jose Manuel

    1. Hola Jose Manuel,

      Gracias por la felicitación. La verdad es que a mi me pasaba lo contrario (siempre he estado más ducho en software) pero al empezar a trastear con arduino me picó el gusanillo del hardware.

      He leido que es posible extraer los programas (en .hex) de los chips de ATMEL en caso de que no tengan el fuse de protección activado con avrdude. El IDE de arduino utiliza avrdude para grabar los programas así que imagino que será posible hacerlo con arduino, si bien nunca me he puesto a ello. La verdad es que es un tema interesante así que voy a investigar sobre el tema.

      ¡Si das con la manera antes que yo dime cómo lo has hecho!

      Un saludo.

  2. avrdude: ERROR: No valid record found in Intel Hex file me da este error cuando coloco el hex que quiero quemar en el atmega, pero con el boot que trae el arduino no hay problema que crees que pueda ser? espero tu respuesta 😀

  3. Hola,
    Estoy intentando quemar un .hex en un Atmega168 desde un Arduino UNO tal y como indicas, pero no lo consigo (he cargado primero el sketch de ArduinoISP). Me muestra el siguiente error:

    avrdude: Yikes! Invalid device signature.
    Double check connections and try again, or use -F to override
    this check.

    Uso la versión 1.0.5.-r2. ¿ Alguna idea ?

    Te indico también lo que he modificado en el boards:

    miatmega168.name=Grabar hex en Atmega168

    miatmega168.upload.protocol=arduino
    miatmega168.upload.maximum_size=7168
    miatmega168.upload.speed=19200

    miatmega168.bootloader.low_fuses=0xFF
    miatmega168.bootloader.high_fuses=0xDE
    miatmega168.bootloader.path=atmega
    miatmega168.bootloader.file=main_atmega168.hex
    miatmega168.bootloader.unlock_bits=0x3F
    miatmega168.bootloader.lock_bits=0x0F

    miatmega168.build.mcu=atmega168
    miatmega168.build.f_cpu=16000000L
    miatmega168.build.core=arduino
    miatmega168.build.variant=standard

    Gracias,

    1. ¡Hola!

      Pues a mi las veces que me ha salido ese error han sido por dos cosas:

      • Hay algún problema con las conexiones.
      • El chip estaba configurado para usar un reloj externo, por lo que tienes que conectarle uno para que funcione.

      ¡Suerte encontrando el fallo! ¡Un saludo!

  4. Saludos
    Intento hacer lo mismo que se explica a través de esta página, pero no consigo realizarlo de ninguna manera, en el menú herramientas/placas, no se muestra: Grabar hex en atmega8. Si podría un poco más detallado por favor. Aun estoy comenzando.
    Gracias de antemano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *