ATtiny2313 weigert sich, programmiert zu werden, nachdem der CPU-Takt auf 500 kHz eingestellt wurde

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.

  • Die Standardtaktrate beträgt 1 MHz;
  • Also habe ich es als nächstes mit 8 MHz versucht und alles hat gut funktioniert.
  • Dann stelle ich die Taktrate mit dem /8-Vorteiler auf 4 MHz ein, was zu einem Takt von 500 kHz führt.

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:

  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, die Sicherungen ohne Verwendung eines HV-Programmierers neu zu programmieren? Habe ich vielleicht irgendwelche nützlichen Flags übersehen avrdude?

Übrigens: Hatte das gleiche Problem einmal mit einem ATtiny45 @ 128kHz. HV-Programmierung löst es, aber ich möchte die HV-Situation verhindern.

Bei welcher Frequenz versucht der Programmierer zu programmieren? Ich erinnere mich, dass ich ähnliche Probleme hatte, als ich versuchte, AVRs mit einer im Vergleich zum Haupttakt zu hohen SPI-Frequenz zu programmieren. Das Absenken der SPI-Frequenz löste das Problem für mich.
Ich habe darüber nachgedacht, aber ich habe keine Ahnung. Arduino läuft auf 16 MHz, aber ich weiß nichts über die Programmierstifte. Es geht alles zu schnell, um zum Beispiel die Taktlinie zu messen. Ich könnte es heute nach der Arbeit ausprobieren. Ich habe auch keine Idee, wie ich die Programmiererfrequenz herunterskalieren kann.
Da kann ich dir nicht viel helfen. Ich habe Arduino nicht verwendet, daher weiß ich nicht, wie genau die Skizze aussieht. Der von mir verwendete Programmierer hatte eine spezielle Einstellung nur für diesen Fall. Einige anfängliche Suchen brachten mir diese Ergebnisse: arduino.cc/forum/index.php?topic=71973.0 github.com/rsbohn/ArduinoISP/pull/2 Leider habe ich im Moment keine Zeit, weitere Recherchen zu diesem Thema anzustellen . Viel Glück!
Ich verwende Arduino nicht, 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 Option -B, um die Geschwindigkeit zu steuern, die mit dem USBtiny-Programmierer funktioniert, aber es hört sich nicht so an, als würden Sie das verwenden. Es wird hier erwähnt: tom-itx.dyndns.org:81/~webpage/usbtiny_programmer/… sowie in den Links aus dem vorherigen Kommentar.

Antworten (4)

Das Problem ist, wie erläutert, eine zu hohe SPI-Taktfrequenz. Es gibt hier eine feste Version von ArduinoISP, die mit niedrigerer Frequenz programmieren kann . Einige Diskussionen zum Thema finden Sie hier .

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 erklärt) und Bit-Banging (was einfach zu funktionieren scheint). Obwohl ich es geschafft habe, den Controller neu zu programmieren, ist die ursprüngliche ArduinoISP-Version stabiler. Der neue schlägt manchmal fehl und funktioniert dann beim zweiten Versuch.

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 c k < 12 MHz, 3 CPU-Takte für f c k >= 12 MHz High:> 2 CPU-Takte für f c k < 12 MHz, 3 CPU-Takte für f c k >= 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 Ö S C /64, oder 250Khz wenn das SPI2XBit im SPSRRegister 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 SPI2Xwird, dass er in spi_init()Funktion ausgeschaltet ist ArduinoISP.ino:

SPSR &= ~(1<<SPI2X);
leider ist meine Version von ArduinoISP bereits unter /256 :(

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