Montag, 4. Juni 2012

Der geheime COM-Port

Neben meinen Arduino Spielereien, bastel ich derzeit auch an meinem Amiga 1200HD herum, den ich letztens wieder ausgegraben habe. Ich habe mir bereits ein serielles Datenkabel gebaut, mit dem ich PC und Amiga verbinden kann. Leider befindet sich an meinem aktuellen Rechner kein COM-Port, so dass ich bisher einen älteren Rechner dafür benutzen musste.
Für meine Arduino Projekte verwende ich ein FTDI Friend Kabel, was eine serielle Schnittstelle ja emuliert. Dabei fiel mir jedoch auf, dass ein weiterer, physischer COM-Port angezeigt wird. Am Gehäuse ist jedoch weit und breit keiner zu finden. Nach etwas genauerem Hinsehen fand ich folgenden Steckverbinder auf dem Mainboard:

Zufälligerweise hatte ich zwei Kabel, die dazu passen. Sie lagen bereits in einer Elektroschrott Kiste, die ich eigentlich entsorgen wollte. Also Kabel da wieder rausgeholt und angeschlossen... Funktioniert nicht! :(
Das andere Kabel funktionierte auch nicht. Die Kabel schienen jedoch technisch in Ordnung zu sein, da ich jeden Pin überprüfte und auch zu jedem Pin ein Signal bekam. Also ist entweder der Steckverbinder auf dem Mainboard kaputt (eher unwahrscheinlich, da nie benutzt) oder die Pinbelegung ist falsch.

Nach etwas googlen fand ich dann heraus, dass man es damals mit der einheitlichen Pinbelegung nicht so genau nahm und einige Hersteller ihr eigenes Süppchen kochten. Also Kabel aufgeschraubt, die Litze an ihren richtigen Platz umgelötet und tada, nun habe ich einen richtigen COM-Port am Rechner. :)

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.