Mente desordenada

Programando un AVR a baja velocidad

Hace como un año estaba haciendo pruebas para programar un ATTINY45 con un reloj interno de 128kHz.  Logré hacerlo correr a esa velocidad pero me encontré con un pequeño problema.  Cuando el microcontrolador funcionaba tan lento, el programador, en mi caso un AVRISP MkII, perdía la capacidad de programar de nuevo el microcontrolador.

El problema es sencillo, según las especificaciones de AVR, la frecuencia a la que se puede programar un microcontrolador debe ser igual o menor a un cuarto de la velocidad programada en el mismo.  Esto es así para velocidades de reloj de menos de 12MHz, para velocidades mayores a 12MHz, debe ser igual o menor a un sexto de la velocidad.

El MkII, tiene una frecuencia de reloj de 100kHz, lo cual está muy bien cuando programamos un microcontrolador de 8MHz.  Según la regla, la frecuencia máxima a la que podemos programar sería de 2MHz. 

El problema es que no hay que sacar muchas cuentas para saber que 100kHz no es menos de la cuarta parte de 128kHz.  Así que cuando se ajusta la velocidad de reloj del microcontrolador a 128kHz, perdemos la capacidad de reprogramarlo.  Sencillamente el programador no lo ve.

El truco para volver a verlo es muy simple.  Bajamos la velocidad del programador con ayuda del siguiente comando:

avrdude -tuF -P usb -p t45 -c avrispmkii

“usb”, “t45” y “avrispmkii” deberían ser cambiados para reflejar su interfaz con el programador, el microcontrolador y el programador.

El chiste está en “-tuF”, con esto entramos en modo interactivo y podemos bajar la velocidad de reloj del programador (SCK) con el siguiente comando:

sck 50

“50” es el periodo en microsegundos, así que el programador está ahora con una frecuencia de 20kHz, lo cual se ajusta a la regla de menos de un cuarto.  Con “e” podemos borrar el microcontrolador o podemos salir con “quit”.  El programador recuerda ésa configuración, así que podemos tranquilamente reprogramar a esa velocidad cuantas veces queramos.  Por supuesto, esto es una solución temporal porque a esa velocidad la programación tarda 5 veces más.

Para regresar el programador a su velocidad original simplemente le decimos:

sck 10

quit

Ahora, el truco de bajar la velocidad me sirvió en estos días para un atmega168.  No lo había bajado de velocidad, de hecho estaba usándolo en un clon de Arduino.  El problema era el de tantas veces.  Estás programando un Arduino, metes la pata y el microcontrolador se reinicia sin control dejándote como única solución metérle el MkII y reprogramar el bootloader.  Pero ésta vez la metida de pata fue histórica.  No podía programar el atmega.

La solución “colegiada” es meterle un programador serial de alto voltaje (HVSP) que ni tengo, ni me provoca construir.  Al menos no para programar un atmega.  Así que probé a borrar el atmega168 con el modo interactivo, cosa que en un principio no funcionó.

Un poco entre la desesperación y la ladilla, decidí probar a bajarle la velocidad al programador a ver que pasaba.  Y sorpresa, funcionó.  Le metí “sck 1000”  y el programador lo borró tranquilamente. 

Ahí les dejo el truco.