Neulich habe ich ein Programm für einen ATtiny2313 geschrieben . Sobald es funktionierte, beschloss ich, es mit den verschiedenen Taktraten zu testen, die verfügbar sind und durch Einstellen von LFUSE wie auf Seite 159 beschrieben programmiert wurden.
Obwohl der Controller das Programm mit der erwarteten Geschwindigkeit ausführt, weigert sich mein Programmierer seitdem, den Controller neu zu programmieren. avrdude
(5.11.1) wirft nur das altbekannte: 'Huch!':
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 Flagge hinzuzufügen -F
, aber das hat natürlich auch nicht funktioniert.
Hier sind einige Codeschnipsel, 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 , };
Zum Programmieren verwende ich einen Arduino mit dem Sketch ArduinoISP (Version 04m3), der 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 Fuses:
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U lfuse:w:$(src).lfuse.hex
Meine Frage ist zweigeteilt:
avrdude
?Übrigens: Hatte das gleiche Problem einmal mit einem ATtiny45 @ 128kHz. HV-Programmierung löst es, aber ich möchte die HV-Situation verhindern.
Als Faustregel gilt, dass Sie für keine ISP-Geschwindigkeit mehr als ein Viertel der Geschwindigkeit Ihrer Ziel-MCU wählen dürfen. 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 bewältigen können, kann eine andere Lösung ein benutzerdefinierter Programmiercode sein. Sie können ArduinoISP ändern, um ein Software-SPI zu verwenden, und die richtigen Verzögerungen berechnen, um auf 100 kHz oder möglicherweise benutzerdefinierte Geschwindigkeiten zu verringern. Werfen Sie einen Blick auf http://little-scale.blogspot.com/2007/07/spi-by-hand.html für die Softwareimplementierung von SPI.
Ich werde mich hier für das Captain Obvious -Abzeichen entscheiden und vorschlagen, dass die ATtiny2313-Geschwindigkeit zu niedrig ist, um jetzt vom ArduinoISP programmiert zu werden. Aus dem ATtiny2313-Datenblatt:
Die minimalen Low- und High-Perioden für den Eingang des seriellen Takts (SCK) sind wie folgt definiert: Low: > 2 CPU-Taktzyklen für f < 12 MHz, 3 CPU-Takte für f >= 12 MHz High:> 2 CPU-Takte für f < 12 MHz, 3 CPU-Takte für f >= 12 MHz
Ihr Arduino läuft wahrscheinlich mit mindestens 16 MHz. Hier die entsprechende Zeile von ArduinoISP.ino
:
SPCR = 0x53;
Dies setzt die Arduino SPI-Geschwindigkeit auf f
/64, oder 250Khz wenn das SPI2X
Bit im SPSR
Register programmiert ist . Wenn das stimmt Bei 500kHz Takt sind das nicht mehr als 2 CPU Taktzyklen wie es das Datenblatt empfiehlt. Wenn diese Hypothese richtig ist, besteht die Lösung darin, den SPI-Taktteiler auf 128 zu setzen, indem sichergestellt SPI2X
wird, dass er in spi_init()
Funktion ausgeschaltet ist ArduinoISP.ino
:
SPSR &= ~(1<<SPI2X);
Ich arbeite derzeit an ScratchMonkey, einem Arduino-als-Programmierer-Sketch, der einen Software-Fallback für SPI implementiert und allmählich auf Geschwindigkeiten von nur 1 kHz zurückgeht.
Es ist noch in Arbeit, aber Sie können es von github bekommen
Andreja Ko
Jippie
Andreja Ko
Kurt E. Tuchmacher