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 Rettungsanker es gibt.

ISP Schnittstelle

Die klassichen AVR Mikrocontroller werden über ihre ISP Schnittstelle programmiert. Arduino Module enthalten hingegen einen seriellen Bootloader im Flash Speicher, aber auch der wurde vorher mal von irgend jemandem über die ISP Schnittstelle in den Mikrocontroller geladen.

Die ISP Schnittstelle benötigt folgende Pins bzw. Signale:

Diese Pins muss man 1:1 mit den gleichnamigen Pins des ISP Programmieradapters verbinden. Außerdem braucht der Mikrocontroller eine Stromversorgung und einen Abblock-Kondensator (z.B. 100 nF) zur Stabilisierung der Stromversorgung.

Nicht jeder Programmieradapter kann sich flexibel an beliebige Versorgungsspannungen anpassen. Viele unterstützen nur 3,3 V und/oder 5 V.

Neben dem SCK Signal benötigt der Mikrocontroller auch eine eigene Taktversorgung, deren Frequenz mehr als das 4-Fache der SCK Frequenz betragen muss. Die meisten Programmieradapter kommunizieren für frisch gekaufte AVR Mikrocontroller zu schnell, müssen daher umkonfiguriert werden. Bei avrdude setzt man die Frequenz mit dem Parameter -B herab, zum Beispiel -B 20.

Die ISP Schnittstelle ist immer aktiv, wenn der Mikrocontroller mittels /RESET angehalten wird. Der Programmieradapter zieht diese Leitung während des gesamtem Programmiervorgangs auf Low. Ein zu großer Kondensator am Reset-Pin kann hierbei störend wirken.

Es gibt zwei Fuses, die man nicht umstellen darf, sofern man den ISP Anschluss noch weiter benutzen möchte:

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

Taktquelle

Für die Wahl der Taktfrequenz des Mikrocontrollers sind folgende Fuses zuständig:

Standard ist 8 MHz oder 9,6 MHz geteilt durch 8. Die SCK Frequenz muss weniger als ein viertel davon sein.

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 Teilung durch 8 ist standardmäßig vorgegeben, damit der Mikrocontroller auch mit geringen Versorgungsspannungen zuverlässig startet. 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 Fuse falsch eingestellt ist, läuft der ganze Mikrocontroller 8x schneller oder langsamer, als erwartet.

Ich diesem Zusammenhang möchte ich daran erinnern, dass F_CPU in Software-Projekten der tatsächlichen Frequenz (nach dem Teiler) entsprechen muss. Mit F_CPU kann man die Taktfrequenz nicht ändern. Ein falscher Wert führt dazu, dass der Compiler für delay und die serielle Schnitttselle falsche Zeiten berechnet.

Alle genannten Fuses sollte man nur vorsichtig mit Bedacht ändern, denn eine falsche Einstellung macht eventuell die SPI Schnittstelle unbrauchbar, und dann kann man die Fuses nicht mehr korrigieren.

Die Webseite Engbedded Fuse Calculator hilft dir dabei, die Fuses und ihre hexadezimalen Werte richtig einzustellen. Kontrolliere lieber dreimal, damit du deinen Mikrocontroller nicht unbrauchbar machst.

Notlösungen

Viele AVR Mikrocontroller kann man mit einem sogenannten "High Voltage Programmer" retten. Diese legen 12 Volt an den Reset Pin und kommunizieren dann je nach Modell mit unterschiedlichen seriellen oder parallelen Protokollen. Mit so einem Gerät kannst du verfuste AVR Mikrocontroller wieder retten. Sie sind aber teuer, deswegen verzichten die meisten Bastler darauf.

Wenn du versehentlich eine falsche Taktfrequenz mit internem R/C Oszillator eingestellt hast, kannst du die Fuses "einfach" wieder korrigieren. Voraussetzung dafür ist allerdings, dass der Programmieradapter nicht zu schnell kommuniziert. Genau das ist leider oft der Knackpunkt. Wenn du avrdude verwendest, versuche den Parameter -B 20 oder -B 200 oder gar -B 2000.

Wenn du den Mikrocontroller für eine externe Taktquelle konfiguriert hast, musst du diese auch an XTAL1 anschließen. Sonst geht gar nichts mehr. Dazu eignen sich zum Beispiel fertige Quarz-Oszillatoren, wie der oben rechts abgebildete. Oder man erzeugt das Taktsignal mit einem zweiten Mikrocontroller, der noch funktioniert.

Wenn du versehentlich einen falschen Quarz konfiguriert hast, kannst du den Chip noch retten, indem du den Quarz entfernst und stattdessen einen externen Oszillator durch einen 220 Ω Widerstand an den Pin XTAL1 anschließt.

Wenn du den Chip auf 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 aber auch 4 MHz.

Und dann gibt es noch einen letzten Rettungsanker: Den Reset Pin fest mit GND verbinden (anstatt mit dem Programmieradapter) und erst dann die Stromversorgung einschalten. Damit kannst du verhindern, dass dein Programm startet und die ISP Schnittstelle durch herabsetzen der Taktfrequenz oder eine grobe Fehlfunktion lahm legt.

USBASP

Der USBASP ist ein alter Programmieradapter von Thomas Fischl der von chinesischen Firmen in unterschiedlichen Varianten hergestellt wird. Das Ding ist billig, hat aber auch einige problematische Sonderlocken.

Der erste Knackpunkt ist die Spannung. Die allermeisten Modelle haben immer 5 V Signale, selbst wenn man den Jumper JP1 auf 3,3 V einstellt. Sie funktionieren nur mit 5 V richtig.

Der zweite Haken ist, dass sie eine Versorgungsspannung auf das ISP Kabel legen. Das ist die falsche Richtung. Die Spannung soll anders herum von der Zielschaltung für den Programmieradapter bereitgestellt werden. Zumindest ist das der Plan von Atmel (heute Microchip) gewesen.

Der dritte Knackpunkt ist die Taktrate. Hier sind drei Varianten im Umlauf:

Dummerweise sind USBASP Sticks im Handel, wo der Jumper JP3 fehlt, obwohl man ihn bräuchte. Außerdem ist völlig unklar, wie langsam der "Slow" Modus ist. Es scheint viele modifizierte Varianten der ursprünglichen Firmware zu geben.

Wenn du mit einem USBASP nicht weiter kommst, könnte ein besserer Programmieradapter durchaus helfen. Der originale "Atmel ISP mkII" hat viele Vorteile: