Neulich habe ich ein Programm für einen ATtiny2313 geschrieben . Sobald es funktioniert hat, habe ich beschlossen, es mit den verschiedenen verfügbaren und programmierten Taktraten zu testen, indem ich die LFUSE wie auf Seite 159 beschrieben einstelle.
- Die Standardtaktrate beträgt 1 MHz.
- Also habe ich als nächstes 8 MHz ausprobiert und alles hat gut funktioniert.
- Dann habe ich die Taktrate für 4MHz mit dem / 8-Prescaler eingestellt, was zu einem 500-kHz-Takt führt.
Obwohl der Controller das Programm mit der erwarteten Geschwindigkeit ausführt, weigert sich mein Programmierer, den Controller seitdem neu zu programmieren. avrdude
(5.11.1) wirft nur das bekannte: 'Yikes!':
avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
Ich habe versucht, die -F
Flagge hinzuzufügen , aber das tat es natürlich auch nicht.
Hier sind einige Code-Sniplets, die ich verwendet und die Taktrate wie erwartet geändert habe:
// 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 , };
Für die Programmierung verwende ich ein Arduino mit der ArduinoISP-Skizze (Version 04m3), die mit Arduino IDE 1.0.1 geliefert wurde.
Dies ist der Befehl zum Programmieren von 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
Dies ist der Befehl zum Programmieren der Sicherungen:
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U lfuse:w:$(src).lfuse.hex
Meine Frage ist zweifach:
- Was ist der Grund, warum ich den Controller nicht programmieren kann, nachdem ich ihn auf 500 kHz eingestellt habe (während das Programm im Controller einwandfrei zu laufen scheint)?
- Welche Möglichkeiten habe ich, um die Sicherungen ohne Verwendung eines HV-Programmiergeräts neu zu programmieren? Habe ich vielleicht irgendwelche nützlichen Flaggen verpasst
avrdude
?
Übrigens: Hatte das gleiche Problem einmal mit einem ATtiny45 @ 128kHz. HV-Programmierung löst es, aber ich möchte die HV-Situation verhindern.
Antworten:
Das Problem ist, wie erläutert, eine zu hohe SPI-Taktfrequenz. Es gibt eine feste Version von ArduinoISP , die verfügbar bei niedrigerer Frequenz programmieren hier . Einige Diskussionen zum Thema finden Sie hier .
quelle
Als Faustregel gilt, dass Sie keine ISP-Geschwindigkeit wählen dürfen, die mehr als ein Viertel der Geschwindigkeit Ihrer Ziel-MCU beträgt. In Ihrem Fall sollte 500/4 = 125 kHz die maximale ISP-Geschwindigkeit sein. Wenn Sie die SPI-Geschwindigkeit Ihres Arduino nicht wie beschrieben ändern können, benötigen Sie möglicherweise einen externen Programmierer.
Wenn Sie die Verringerung der SPI-Geschwindigkeit von ArduinoISP nicht verwalten können, ist eine andere Lösung möglicherweise ein benutzerdefinierter Programmiercode. Sie können ArduinoISP ändern, um ein Software-SPI zu verwenden und die richtigen Verzögerungen zu berechnen, um sie auf 100 kHz oder möglicherweise benutzerdefinierte Geschwindigkeiten zu verringern. Unter http://little-scale.blogspot.com/2007/07/spi-by-hand.html finden Sie Informationen zur Softwareimplementierung von SPI.
quelle
Ich werde hier das Captain Obvious- Abzeichen holen und vorschlagen, dass die ATtiny2313-Geschwindigkeit zu niedrig ist, um jetzt vom ArduinoISP programmiert zu werden. Aus dem ATtiny2313-Datenblatt:
Ihr Arduino läuft wahrscheinlich mit mindestens 16 MHz. Hier ist die relevante Zeile von
ArduinoISP.ino
:Dies setzt die Arduino SPI-Geschwindigkeit auf fO S.C. / 64 oder 250 kHz, wenn das
SPI2X
Bit imSPSR
Register programmiert ist . Wenn dies korrekt ist Bei einem 500-kHz-Takt sind dies nicht mehr als 2 CPU-Taktzyklen, wie im Datenblatt empfohlen. Wenn diese Hypothese richtig ist, besteht die Lösung darin, den SPI-Taktteiler auf 128 zu setzen, indem sichergestellt wird, dassSPI2X
diespi_init()
Funktion deaktiviert ist inArduinoISP.ino
:quelle
Ich arbeite derzeit an ScratchMonkey, einer Arduino-as-Programmer-Skizze, die einen Software-Fallback für SPI implementiert und schrittweise auf Geschwindigkeiten von nur 1 kHz zurückgreift.
Es ist noch in Arbeit, aber Sie können es von Github bekommen
quelle