ATtiny2313 kann nicht programmiert werden, nachdem der CPU-Takt auf 500 kHz eingestellt wurde

7

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 -FFlagge 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:

  1. 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)?
  2. 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.

Jippie
quelle
Mit welcher Frequenz versucht der Programmierer zu programmieren? Ich erinnere mich, dass ich ähnliche Probleme hatte, als ich versuchte, AVRs mit einer SPI-Frequenz zu programmieren, die im Vergleich zur Hauptuhr zu hoch ist. Das Verringern der SPI-Frequenz löste das Problem für mich.
AndrejaKo
Ich habe darüber nachgedacht, aber ich habe keine Ahnung. Arduino läuft mit 16MHz, aber ich weiß nichts über die Programmierstifte. Es geht alles zu schnell, um zum Beispiel die Taktlinie zu messen. Ich könnte es später heute nach der Arbeit versuchen. Ich habe auch keine Idee, wie ich die Programmiererfrequenz verringern kann.
Jippie
1
Ich kann dir da nicht viel helfen. Ich habe Arduino nicht verwendet, daher weiß ich nicht, wie genau die Skizze aussieht. Der von mir verwendete Programmierer hatte nur für diesen Fall eine spezielle Einstellung. Einige erste Suchanfragen ergaben folgende Ergebnisse: arduino.cc/forum/index.php?topic=71973.0 github.com/rsbohn/ArduinoISP/pull/2 Leider habe ich momentan keine Zeit, weitere Nachforschungen zu diesem Thema anzustellen . Viel Glück!
AndrejaKo
Ich benutze kein Arduino, daher weiß ich nicht viel darüber, aber manchmal musste ich die SPI-Geschwindigkeit ändern, wenn ich versuchte, ein AVR-Gerät mit einer langsameren Uhr zu programmieren. Es gibt eine -B-Option zum Steuern der Geschwindigkeit, die mit dem USBtiny-Programmierer funktioniert, aber es hört sich nicht so an, als würden Sie diese verwenden. Es wird hier erwähnt: tom-itx.dyndns.org:81/~webpage/usbtiny_programmer/… sowie in den Links aus dem vorherigen Kommentar.
Kurt E. Clothier

Antworten:

4

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 .

AndrejaKo
quelle
Ich habe den Github-Link überprüft und konnte den Controller beim ersten Versuch erneut flashen. Tatsächlich ermöglicht es den Wechsel zwischen SPI (zu schnell, wie in electronic.stackexchange.com/a/65019/8627 für einige Sicherungseinstellungen erläutert ) und Bit Banging (was einfach zu funktionieren scheint). Obwohl ich die Neuprogrammierung des Controllers verwaltet habe, ist die ursprüngliche ArduinoISP-Version stabiler. Der neue schlägt manchmal fehl und arbeitet dann an einem zweiten Versuch.
Jippie
3

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.

Superkeci
quelle
1

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:

Die minimalen niedrigen und hohen Perioden für den SCK-Eingang (Serial Clock) sind wie folgt definiert: Niedrig:> 2 CPU-Taktzyklen für fck <12 MHz, 3 CPU-Taktzyklen für fck > = 12 MHz hoch:> 2 CPU-Taktzyklen für fck <12 MHz, 3 CPU-Taktzyklen für fck > = 12 MHz

Ihr Arduino läuft wahrscheinlich mit mindestens 16 MHz. Hier ist die relevante Zeile von ArduinoISP.ino:

SPCR = 0x53;

Dies setzt die Arduino SPI-Geschwindigkeit auf fÖS.C./ 64 oder 250 kHz, wenn das SPI2XBit im SPSRRegister 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, dass SPI2Xdie spi_init()Funktion deaktiviert ist in ArduinoISP.ino:

SPSR &= ~(1<<SPI2X);
Angelatlarge
quelle
Leider ist meine Version von ArduinoISP bereits bei / 256 :(
jippie
0

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

Mikrotherion
quelle