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.

Publicado por

Alfonso Jiménez

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

Deja un comentario

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