Compilando avrdude desde los fuentes

Hasta hace unos días había podido grabar mis chips ATMEGA328 utilizando los programadores USBASP y AVR Dragon sin ningún inconveniente, pero de un momento a otro ya no fue posible. Investigué pero no hallé una respuesta que solucionara el problema. Y el problema era (es), en parte, los fusibles, ya que cada vez avrdude arrojaba el error:

 ... 
 Reading | ################################################## | 100% 0.05s
 avrdude: verifying …
 avrdude: verification error, first mismatch at byte 0x0000
          0xff != 0x3f
 avrdude: verification error; content mismatch
 avrdude: safemode: hfuse reads as D9
 avrdude: safemode: efuse reads as FF
 avrdude: safemode: Fuses OK (E:FF, H:D9, L:62)
 avrdude done.  Thank you.

Lo último que me quedaba por hacer era intentar con una versión anterior de avrdude. La que me estaba dando problemas es la más actual, la 6.3 (al día de hoy). Compilé la 6.2 pero tuve el mismo problema, así que me fui más atrás con la 5.9, y ¡voilá! El problema se resolvió (esto es, ya pude subir mis programas correctamente).

De hecho, el problema era la escritura del fusible lfuse que provocaba que el chip no corriera a su velocidad de crucero, 16MHz; estaba corriendo quizás como a 1MHz o menos.

La siguiente solución la probé con el programador AVR Dragon, y quiero suponer que también funcionará para el AVRASP.

Izq: Tarjeta minimalista tipo UNO, UB-1S328 de mi autoría. Der: Programador AVR Dragon.

Procedimiento

  1. Descarga avrdude-5.9 de aquí. Luego descomprímelo en una carpeta de tu elección.

Debes instalar el soporte de USB. Sin éste es posible compilar avrdude, pero no servirá con programadores USB (osea, casi todos). Abre una terminal en la carpeta anterior y escribe la siguiente instrucción:

$ sudo apt install libusb-dev

(El símbolo $ es el prompt de la consola, no lo debes escribir.)

2. En la misma consola escribe los siguientes comandos (no es necesario ser sudo):

$ ./configure
$ make

Si todo fue bien ya se habrá creado el archivo avrdude. Aunque es posible instalarlo para todo el sistema, preferí no hacerlo.

3. El siguiente paso es subir un programa. La siguiente instrucción me sirvió muy bien. Quizás debo bajarle el tiempo al reloj (-B20 (microsegundos) parece demasiado), pero ahorita no le quiero mover. Además es importante señalar que usé el propio archivo de configuración avrdude.conf que viene con esta versión para evitar incompatibilidades. Nota que como no lo instalé debo escribir la ruta del ejecutable y del archivo de configuración:

$ ~/avrdude-5.9/avrdude -p m328p -P usb -c dragon_isp -e -Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xde:m -Ulfuse:w:0xff:m -v -B20 -C~/avrdude-5.9/avrdude.conf -Uflash:w:build-uno/notifs_1_consola.hex 

Hay que poner atención al valor del fusible efuse. En versiones posteriores a la 5.9 de avrdude, debido a discrepancias, se tiene que escribir 0xfd en lugar del 0x05 que he utilizado. Hay un problema entre versiones sobre cómo se deben leer los bits no utilizados. En versiones mayores a 5.9 se escribe un 1, pero en anteriores se escribe un 0. El valor verdadero que sirve a mis propósitos es 0x05, y en esta versión, la 5.9, pasa directo.

En la siguiente imagen puedes ver la salida de esta instrucción:

Salida del comando de programación.

Espero que este procedimiento les funcione en caso de tener el mismo problema que yo.

Antes de irme quiero aprovechar para pedirte que te suscribas a este blog y también que visites mi blog alternativo donde estoy creando un curso de Arduino en tiempo real utilizando al sistema operativo FreeRTOS:

Curso gratuito de Arduino en tiempo real con FreeRTOS

¡Felices programas!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s