7 votos

ATtiny2313 se niega a ser programado después de ajustar el reloj de la CPU a 500kHz

El otro día estaba escribiendo un programa para un ATtiny2313 . Una vez que funcionó decidí probarlo a las distintas velocidades de reloj disponibles y programadas mediante el ajuste de la LFUSE como se describe en la página 159.

  • La velocidad de reloj por defecto es de 1MHz;
  • así que probé con 8MHz a continuación y todo funcionó bien;
  • Después, he configurado la velocidad de reloj para 4MHz con el preescalador /8, lo que ha dado como resultado un reloj de 500kHz.

Aunque el controlador ejecuta el programa a la velocidad esperada, mi programador se niega a reprogramar el controlador desde entonces. avrdude (5.11.1) sólo lanza el consabido: "¡Caramba!":

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

He probado a añadir el -F bandera, pero por supuesto eso tampoco.

Aquí hay algunos recortes de código que he utilizado y cambiado la velocidad del reloj como se esperaba:

// 0.5MHz
FUSES = { .low = 0x62   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };

// 1MHz (default)
FUSES = { .low = 0x64   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };

// 8MHz
FUSES = { .low = 0xe4   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };

Para la programación, utilizo un Arduino con el sketch ArduinoISP (versión 04m3) que viene con Arduino IDE 1.0.1.

Este es el comando para programar la flash:

avrType=attiny2313
avrFreq=1000000
programmerDev=/dev/ttyUSB003
programmerType=arduino
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U flash:w:$(src).flash.hex

Este es el comando para programar los fusibles:

avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U lfuse:w:$(src).lfuse.hex

Mi pregunta es doble:

  1. ¿Cuál es la razón por la que no puedo programar el controlador después de ajustarlo al reloj de 500kHz (mientras que el programa en el controlador parece funcionar bien);
  2. ¿Qué opciones tengo para reprogramar los fusibles sin usar un programador HV? ¿Acaso me he perdido alguna bandera útil para avrdude ?

BTW: Tuve el mismo problema una vez con un ATtiny45 @ 128kHz. HV-programación resuelve, pero quiero evitar la situación HV.

4voto

travis Puntos 260

El problema, como se ha explicado, es una frecuencia de reloj SPI demasiado alta. Existe una versión fija de ArduinoISP que puede programar a menor frecuencia disponible aquí . Hay un debate sobre el tema aquí .

3voto

Como regla general, no debes elegir ninguna velocidad de ISP que supere la cuarta parte de la velocidad de tu MCU objetivo. En tu caso, 500 / 4 = 125KHz debería ser la máxima velocidad ISP. Si no puedes cambiar la velocidad SPI de tu Arduino como describe angelatlarge, puede que necesites un programador externo.

Si no puedes gestionar la disminución de la velocidad SPI de ArduinoISP, otra solución puede ser un código de programación personalizado. Usted puede cambiar ArduinoISP para utilizar un software SPI y calcular los retrasos adecuados para disminuir a 100KHz o tal vez velocidades personalizadas. Echa un vistazo a http://little-scale.blogspot.com/2007/07/spi-by-hand.html para la implementación de software de SPI.

1voto

Voy a ir por el Capitán Obvio placa aquí y sugieren que la velocidad ATtiny2313 es demasiado baja para ser programado por el ArduinoISP ahora. Desde el ATtiny2313 hoja de datos:

Los periodos mínimos bajo y alto para la entrada del reloj serie (SCK) son definidos como sigue: Bajo:> 2 ciclos de reloj de la CPU para f \$_{ck}\$ < 12 MHz, 3 CPU ciclos de reloj para f \$_{ck}\$ >= 12 MHz Alto:> 2 ciclos de reloj de la CPU para f \$_{ck}\$ < 12 MHz, 3 ciclos de reloj de la CPU para f \$_{ck}\$ >= 12 MHz

Tu arduino probablemente funciona al menos a 16Mhz. Aquí está la línea relevante de ArduinoISP.ino :

SPCR = 0x53;

Esto establece la velocidad SPI del Arduino a f \$_{OSC}\$ /64, o 250Khz si el SPI2X está programado en el SPSR registrar . Si esto es correcto A 500kHz de reloj, esto no es más de 2 ciclos de reloj de la CPU como la hoja de datos recomienda. Si esta hipótesis es correcta, la solución es ajustar el divisor de reloj SPI a 128 asegurando que SPI2X está apagado en spi_init() función en ArduinoISP.ino :

SPSR &= ~(1<<SPI2X);

0voto

Hope Pires Puntos 6

Actualmente estoy trabajando en ScratchMonkey, un sketch de Arduino-como-programador que implementa un software de retroceso para SPI, retrocediendo gradualmente a velocidades tan bajas como 1kHz.

Todavía es un trabajo en curso, pero puedes conseguirlo en github

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X