AVR Verfused?

Ich glaube, jedem passiert es irgendwann, dass sein AVR Mikrocontroller nach dem Ändern von Fuses plötzlich nicht mehr ansprechbar ist. Ich erkläre hier, was schief gehen kann und welche Notlösungen es gibt.

Dieser Artikel gilt für AVR Modelle mit ISP Schnittstelle. Die Schnittstelle habe ich auf der Seite über Programmieradapter beschrieben.

Fuses

Fuses dienen dazu, ein par Eigenschaften des Mikrocontrollers zu konfigurieren. Früher hätte man dafür Jumper oder Drahtbrücken verwendet. Drei Fuses bedürfen besonderer Aufmerksamkeit:

Für die Taktfrequenz sind folgende Fuses zuständig:

Standard ist 8 MHz oder 9,6 MHz geteilt durch 8. Die Teilung durch 8 ist vorgegeben, damit der Mikrocontroller auch mit geringen Versorgungsspannungen zuverlässig startet.

Bei den meisten AVR Modellen kann man den Teilerfaktor auch per Software durch Beschreiben des CLKPR Registers ändern. Die Fuse gibt lediglich den Startwert nach einem Reset vor. Die Taktfrequenz, die aus diesem Teiler heraus kommt treibt nicht nur den CPU Kern an, sondern auch die Timer und die serielle Schnittstelle. Wenn die CLKDIV8 Fuse falsch eingestellt ist, läuft der ganze Mikrocontroller 8x schneller oder langsamer, als erwartet.

Änderungen am CLKPR Register werden erst mit der steigenden Flanke am Reset-Pin (also beim nächsten Programmstart) zurück gesetzt. Die Konsequenz daraus ist: Wenn das Programm den System-Takt sehr stark verringert, kann der Programmieradapter anschließend nicht mehr mit dem Chip kommunizieren.

Alle genannten Fuses sollte man nur vorsichtig mit Bedacht ändern. Die Webseite Engbedded Fuse Calculator hilft dir dabei. Kontrolliere lieber dreimal, damit du deinen Mikrocontroller nicht unbrauchbar machst.

DebugWIRE

Viele AVR Mikrocontroller unterstützten das Debugging über den DebugWIRE, das ist physikalisch der Reset Pin. Der DebugWIRE wird immer in Kombination mit der ISP Schnittstelle benutzt.

DebugWIRE kommuniziert mit mehreren Megahertz bidirektional. Deswegen muss die Leitung kurz sein und darf nicht durch einen Kondensator oder allzu starken Pull-Up Widerstand (weniger als 4,7 kΩ) belastet werden. Außerdem brauchst einen Programmieradapter, der ausdrücklich DebugWIRE unterstützt. Prüfe das, bevor du eine Debug Sitzung beginnst, sonst kommst du da nicht mehr heraus!

Beim Beginn einer Debug Sitzung kommuniziert die IDE über ISP mit dem Mikrocontroller, um die DWEN Fuse zu aktivieren. Danach kann nur noch über den DebugWIRE kommuniziert werden. ISP ist nun dauerhaft deaktiviert.

Am Ende einer Debug Sitzung sendet die IDE ein Debugger-Kommando, dass die ISP Schnittstelle temporär wieder aktiviert. Danach kommuniziert die IDE via ISP mit dem Mikrocontroller, um die DWEN Fuse zu deaktivieren. Erst dann ist der Mikrocontroller permanent zurück im ISP Modus.

Lösungen

Falsch eingestellte Fuses kann man mit einem "High Voltage Programmer" korrigieren. Bei den Fuses SPIEN und RSTDISBL ist dies die einzige Lösung. High Voltage Programmer legen 12 Volt an den Reset Pin und kommunizieren dann je nach Modell mit unterschiedlichen seriellen oder parallelen Protokollen. In der Regel muss man den Mikrocontroller dazu vorher auslöten und auf eine spezielle Adapterplatine bringen. Ob sich der Aufwand lohnt ist fragwürdig.

Wenn du eine niedrige Taktfrequenz eingestellt hast, musst du eventuell deinen ISP Programmieradapter langsamer machen. Bei avrdude kannst du dazu den Parameter -B20 versuchen, oder -B200 oder gar -B2000.

Wenn du den Mikrocontroller für eine externe Taktquelle konfiguriert hast, musst du diese auch anschließen, sonst geht gar nichts mehr. Im Zweifelsfall hilft meistens ein externer Oszillator wie der rechts gezeigte an Pin XTAL1. Der Pin XTAL2 bleibt in dem Fall unbeschaltet.

Wenn du den Chip für einen externen 32 kHz Quarz eingestellt hast, muss der Oszillator aber manchmal (immer?) an XTAL2 angeschlossen werden. Jemand berichtete mir, dass der Oszillator dann maximal 300 kHz haben darf. Bei meinen Versuchen mit einem ATtiny85 gingen auch 4 MHz.

Wenn du eine Debug-Sitzung nicht ordentlich beendet hast, fungiert der Reset-Pin weiterhin als DebugWIRE, so dass ISP nicht nutzbar ist. In diesem Fall musst du dich mit deinem Debugger (Adapter und passende IDE) mit dem Mikrocontroller verbinden und dann in der Software den Debug-Modus mit "Disable DebugWIRE" beenden. Avrdude macht das bei Bedarf automatisch, sofern ein dazu fähiger Programmieradpater verwendet wird. Denke daran, daß der DebgugWire (= Reset Pin) nicht mit einem Kondensator belastet werden darf.

Unter Umständen bringt dein Programm den Mikrocontroller zum Absturz oder es setzt die Taktfrequenz der CPU extrem herab, so dass der ISP Programmieradapter versagt. In diesem Fall kannst du den RESET Pin des Mikrocontrollers fest mit GND verbinden und erst dann die Stromversorgung einschalten. So verhinderst du den Start des Programmes. Die ISP Schnittstelle ist im Dauer-Reset ansprechbar.

Startseite