Startseite

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.

ISP Schnittstelle

Die klassischen AVR Mikrocontroller werden in der Regel über eine ISP Schnittstelle programmiert. Es gibt neuere AVR Modelle mit anderen Schnittstellen, auf die dieser Artikel hier nicht zutrifft. Die ISP Schnittstelle benötigt folgende Pins bzw. Signale:

Diese Pins muss man 1:1 verbinden.

Außerdem braucht der Mikrocontroller eine stabile Stromversorgung mit Abblock-Kondensatoren (z.B. 100 nF) an jedem VCC/GND Pärchen. Ohne Abblock-Kondensatoren sind viele Fehlfunktionen möglich, einschließlich dem Setzen falscher Fuses.

Ein großer Kondensator am Reset Pin kann die Funktion des Programmieradapters beeinträchtigen. Für die Programmierung über ISP sind 10 µF meistens noch OK. Für das Debuggen mit dem DebugWIRE darf der Pin gar nicht kapazitiv belastet werden.

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. Zum Aktivieren und Deaktivieren des DebugWIRE wird ISP benötigt. Man benötigt das dazu also praktisch den gleichen Stecker.

DebugWIRE kommuniziert mit mehreren Megahertz bidirektional auf der Reset-Leitung. 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.

Notlösungen

Quarz Oszillator Im Gegensatz zu einem einfachen Quarz enthalten solche Taktgeber zusätzlich eine Schaltung, die den Kristall zum Schwingen anregt. Sie liefern ein Rechteck-Signal mit Logik-Pegeln.

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.

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.