Sonntag, 3. Juni 2012

Verfusten Atmega 328p (Arduino) retten

Ein typischer Anfängerfehler, der vielen passiert, die mal über den Tellerrand der Arduino IDE hinweg schauen, ist, durch das Setzen falscher Fuse-Einstellungen auf den Mikrocontroller keinen Zugriff mehr zu erhalten. Grundsätzlich kann man den Microncontroller - entgegen vieler Meinungen - durch setzen unsinniger Fuse Einstellungen nicht zerstören. Es gibt allerdings mehrere Möglichkeiten sich auszusperren und mehr oder weniger aufwändige Lösungen, um das Ganze wieder rückgängig zu machen.

Im folgenden Artikel möchte ich auf diese Möglichkeiten und Lösungen etwas genauer eingehen und beziehe mich dabei auf den Atmel ATMega 328p. Bei allen pinkompatiblen Modellen sollten diese Lösungen auch anwendbar sein, ich übernehme dafür aber keine Garantie!


Die Wahl der falschen Taktquelle


Der wohl "beliebteste" und gleichzeitig auch am einfachsten zu behebende Fehler ist die falsche Wahl der externen Taktquelle.
Der Atmega 328p hat einen internen 8Mhz Oszillator, der für die meisten Anwendungen ausreichend schnell und ausreichend genau ist. Im "nackten" fabrikneuen Zustand ist außerdem das CKDIV8 Fusebit gesetzt, so dass der Mikrocontroller nur mit 1Mhz arbeitet. Das spart zwar unheimlich Strom, aber für viele Anwendungen ist das deutlich zu langsam. Solls also etwas schneller sein (z.B. 16Mhz) oder benötigt man eine höhere Genauigkeit (etwa für eine Uhr), so muss ein externer Quartz her. Man muss dem Microcontroller allerdings auch mitteilen, dass er bitte den externen Quartz benutzen soll und das stellt man über die besagten Fuses ein.

Viele Anfänger machen nun den Fehler als externe Taktquelle nicht "external crystal oszillator" sondern "external clock" einzustellen. Selbst wenn man nun einen Quartz angeschlossen hat, wird der Microcontroller keinen Mucks mehr von sich geben.


Ausgesperrt durch setzen von RESETDSBL oder DWEN


RESETDSBL


Eine weitere Möglichkeit sich auszusperren ist das setzen von RESETDSBL (Reset Disable). Mit dieser Einstellung deaktiviert man den Reset Pin.
Der Reset Pin wird jedoch von der SPI (Serial Peripheral Interface) Schnittstelle benötigt, mit der man den Mikrocontroller über einen ISP (In System Programmer) wie z.B. einem USBtinyISP oder wie bei einigen Arduino Clones auch über die serielle Schnittstelle oder per FTDI-Kabel gemütlich über USB programmieren kann.

Über den Reset Pin teilt der ISP dem Microcontroller mit, dass er gerne etwas programmieren möchte. Wenn der Pin jedoch deaktiviert ist, wird der Microcontroller auf die Programmierbefehle nicht mehr reagieren. Man kann dann über SPI auch keine Fuses mehr Auslesen oder setzen - man ist ausgesperrt.

Dieses Fusebit scheint auf dem ersten Blick keinen Sinn zu ergeben, jedoch erhält man durch deaktivieren des Resetpins einen weiteren vollwertigen I/O Pin. Dies bedeutet z.B. bei einer LED-Matrix, welche alle 12 Pins des µC benutzt (TX und RX nicht belegt) und diese Matrix mit Charlieplexing betreibt einen satten zuwachs von 24 LEDs, die durch diesen Pin zusätzlich angesteuert werden können.

DWEN


Eine weitere böse Falle ist das Setzen von DWEN (Debug Wire Enable).
Mit diesem Feature ist es möglich das Programm auf dem Microcontroller zu debuggen. Dafür wird exakt nur ein Pin benötigt (daher debug wire). Diese Funktion ist eher für Microcontroller gedacht, die nur sehr wenige Pins zur Verfügung haben, wie z.B. der  ATiny45:



Dummerweise handelt es sich bei dem Pin, den die DebugWIRE Schnittstelle nutzt um - wer hätte es gedacht - den Reset Pin. Die SPI-Schnittstelle funktioniert also nicht mehr - man ist ausgesperrt.




High-Voltage: Die universelle Methode um den Microcontroller zu retten


Was also tun, wenn man über die SPI-Schnittstelle nicht mehr an den Chip heran kommt? Die Antwort lautet High Voltage Parallel Programming, oder kurz: HVPP.
Um den parallelen Programmiermodus zu aktivieren müssen 12V statt der üblichen 5V auf den Reset Pin gelegt werden. Daher der Name High Voltage. Dabei ist zu beachten, dass der parallele Programmiermodus nichts mehr mit SPI zu tun hat. Es handelt sich um ein komplett anderes Protokoll. Es reicht also nicht aus, einfach 12V statt 5V auf die Reset Leitung zu geben.


Es gibt nun 3 Möglichkeiten wie man den µC per HVPP wiederbeleben kann:

Die einfachste aber zugleich teuerste Möglichkeit ist der Kauf eines stk500, dem offiziellen Standardboard von Atmel, welches alle Programmiermodi inkl. HVPP unterstützt. Zwar ist es nicht verkehrt so ein Board zu besitzen, jedoch lohnt es sich nicht um die 80$ auszugeben, nur um einen Mikrocontroller zu retten, der zwischen 2€ - 5€ Wert ist.

Die zweite Möglichkeit ist ein Arduino basierter Eigenbau eines HV-Programmers. Man benötigt dafür jedoch neben dem verfusten µC einen weiteren, funktionierenden Arduino, auf dem man dann die Programmiersoftware lädt, die die Fuses zurücksetzt. Weiterhin benötigt man einen Transistor und eine externe 12V Spannungsquelle. Der Arduino und der zu rettende µC müssen dann nur noch korrekt verdrahtet werden. Ich hatte bereits Erfolg mit dieser Schaltung, da ich mal versehentlich den RESET Pin deaktiviert hatte: http://mightyohm.com/blog/2008/09/arduino-based-avr-high-voltage-programmer/

Die dritte und letzte Möglichkeit stellt die kostengünstigste aber auch komplizierteste Methode dar. Wer keinen weiteren, funktionierenden Arduino zur Hand hat und vor etwas Bastelei nicht zurückschreckt, kann die Bits auch ohne HVPP per Hand programmieren. Man muss dazu im richtigen Zeitpunkt die benötigten 12V an den Reset Pin anlegen und die benötigten Pegel per Hand an die Datenpins des µCs anlegen und per Hand einen Takt auslösen. Im offiziellen Datenblatt ist das parallel programming protocol im Kapitel "Memory Programming" im Unterpunkt Parallel Programming ausführlich beschrieben.

2 Kommentare:

  1. Ein sehr schönes Tutorial, was dem einen oder anderen wahrscheinlich den Tag retten wird.

    AntwortenLöschen
  2. Wäre es möglich, die letzte HVPP Methode ein wenig näher zu beschreiben? Ansonsten ein schönes TUT.

    AntwortenLöschen