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

7

El otro día estaba escribiendo un programa para un ATtiny2313 . Una vez que funcionó, decidí probarlo a las diferentes velocidades de reloj que están disponibles y programadas a través de la configuración del LFUSE como se describe en la página 159.

  • La velocidad de reloj predeterminada es 1MHz;
  • así que probé 8MHz a continuación y todo funcionó bien;
  • Luego configuro la velocidad de reloj para 4MHz con el / 8-prescaler que da 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) simplemente lanza el conocido: '¡Ay!':

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

Intenté agregar el indicador -F , pero por supuesto que tampoco.

Aquí hay algunos fragmentos de código que usé y cambié 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, uso un Arduino con el boceto ArduinoISP (versión 04m3) que vino con Arduino IDE 1.0.1.

Este es el comando para programar 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 configurarlo a 500 kHz (mientras que el programa en el controlador parece funcionar bien)?
  2. ¿Cuáles son mis opciones para reprogramar los fusibles sin usar un programador HV? ¿Tal vez perdí algunas banderas útiles para avrdude ?

Por cierto: tuve el mismo problema una vez con un ATtiny45 @ 128kHz. La programación HV lo resuelve, pero quiero evitar la situación HV.

    
pregunta jippie

4 respuestas

4

El problema, según lo explicado, una frecuencia de reloj SPI demasiado alta. Existe una versión fija de ArduinoISP que puede programarse a una frecuencia más baja disponible aquí .

    
respondido por el AndrejaKo
3

Como regla general, no puede elegir ninguna velocidad de ISP más de la cuarta parte de la velocidad de su MCU objetivo. En su caso, 500/4 = 125 KHz debe ser la velocidad máxima de ISP. Si no puede cambiar la velocidad de SPI de su Arduino como se describe en la etiqueta, es posible que necesite un programador externo.

Si no puede administrar la disminución de la velocidad SPI de ArduinoISP, otra solución puede ser un código de programador personalizado. Puede cambiar ArduinoISP para usar un software SPI y calcular los retrasos adecuados para disminuir a 100 KHz o quizás a velocidades personalizadas. Eche un vistazo a enlace para la implementación de software de SPI.

    
respondido por el superkeci
1

Voy a buscar la insignia Capitán Obvio aquí y sugeriré que la velocidad de ATtiny2313 es demasiado baja para ser programada por ArduinoISP ahora. De la hoja de datos de ATtiny2313:

  

Los períodos mínimo bajo y alto para la entrada del reloj serie (SCK) son   definido de la siguiente manera: 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 CPU para f \ $ _ {ck} \ $ > = 12 MHz

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

SPCR = 0x53;

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

SPSR &= ~(1<<SPI2X);
    
respondido por el angelatlarge
0

Actualmente estoy trabajando en ScratchMonkey, un boceto Arduino-as-programmer que implementa un respaldo de software para SPI, retrocediendo gradualmente a velocidades tan bajas como 1kHz.

Todavía está en proceso, pero puede obtenerlo en github

    
respondido por el microtherion

Lea otras preguntas en las etiquetas