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 configurando el LFUSE como se describe en la página 159.
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 arroja el conocido: '¡Yikes!':
avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
Intenté agregar la -F
bandera, pero por supuesto eso 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, utilizo un Arduino con el boceto ArduinoISP (versión 04m3) que viene 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:
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.
Como regla general, no puede elegir una velocidad de ISP superior a la cuarta parte de la velocidad de su MCU de destino. En su caso, 500/4 = 125 KHz debería ser la velocidad máxima del ISP. Si no puede cambiar la velocidad SPI de su Arduino como se describe en angelatlarge, es posible que necesite un programador externo.
Si no puede gestionar 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 SPI de software y calcular los retrasos adecuados para disminuir a 100 KHz o tal vez velocidades personalizadas. Eche un vistazo a http://little-scale.blogspot.com/2007/07/spi-by-hand.html para la implementación de software de SPI.
Voy a buscar la insignia de 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 ATtiny2313:
Los períodos mínimos bajo y alto para la entrada del reloj serial (SCK) se definen de la siguiente manera: Bajo:> 2 ciclos de reloj de la CPU para f < 12 MHz, 3 ciclos de reloj de CPU para f >= 12 MHz Alto:> 2 ciclos de reloj de CPU para f < 12 MHz, 3 ciclos de reloj de CPU para f >= 12 MHz
Su arduino probablemente funciona al menos a 16Mhz. Aquí está la línea relevante de ArduinoISP.ino
:
SPCR = 0x53;
Esto establece la velocidad Arduino SPI en f
/64, o 250Khz si el SPI2X
bit está programado en el SPSR
registro . Si esto es correcto A 500 kHz de reloj, 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 configurar el divisor de reloj SPI en 128 asegurándose de que SPI2X
esté apagado en spi_init()
función en ArduinoISP.ino
:
SPSR &= ~(1<<SPI2X);
Actualmente estoy trabajando en ScratchMonkey, un boceto de Arduino como programador que implementa un respaldo de software para SPI, retrocediendo gradualmente a velocidades tan bajas como 1kHz.
Todavía es un trabajo en progreso, pero puedes obtenerlo de github
AndrejaKo
yippie
AndrejaKo
Kurt E. Clothier