Microcontroller flashen: Arduino Uno als In-System-Programmer

Seite 3: Sicherungen

Inhaltsverzeichnis

Die falsche Auswahl der Taktquelle ist übrigens eine der häufigsten Fehler, um sich mit seinem Programmer aus dem Controller auszusperren. Welchen Takt der Controller benutzt oder wie er ihn erzeugt, legen sogenannte Fuses fest. Eigentlich sind es keine Fuses, da nichts durchbrennt und man sie immer wieder umprogrammieren kann.

Die vier Fuses CKSEL0 bis CKSEL3 stellen ein, ob ein interner oder externer Oszillator zum Zuge kommen oder ein Quarz benutzt wird. Die Übersicht auf Seite 142 zeigt die Möglichkeiten. Zu Verwechslungen bei der Konfiguration kommt es immer wieder, weil bei den AVR-Controllern die Fuses als Low-Aktiv umgesetzt sind. Eine 0 bedeutet, dass die Funktion aktiviert ist, eine 1 heißt "ausgeschaltet".

Mit der Fuse CKDIV8 (Clock Divide) teilt man den anliegenden respektive erzeugten Takt durch 8, standardmäßig ist die Fuse aktiv. Mit CKOUT (Clock Out) lässt sich der Takt auf einen Pin von PORTB ausgeben, auf welchen Pin genau, steht im Datenblatt des jeweils verwendeten Modells. Mit den beiden Flags SUT0 und SUT1 (Start Up Time) stellt man die Wartezeit ein, nach der die CPU nach dem Einschalten oder einem Reset den ersten Befehl ausführt. Die Wartezeit soll sicherstellen, dass ein externer Quarz oder Resonator beziehungsweise der interne Oszillator richtig angeschwungen sind, um einen stabilen Takt zu liefern.

Daneben gibt es weitere Fuses, wobei nicht jede Fuse in allen AVR-Controllern vorhanden ist. Auch die konkrete Funktion kann abhängig vom Modell variieren. Praktischerweise helfen Online-Fuse-Rechner beim Austüfteln der richtigen Einstellungen für das gewünschte Produkt, beispielsweise der Engbedded Atmel AVR Fuse Calculator, der die zwei Fuses-Bytes (Hi und Lo) als Parameter für Avrdude ausgibt, etwa

-U lfuse:w:0xf1:m -U hfuse:w:0xdd:m< 

Zudem gibt es Apps für Android und iPhone, die das offline erledigen.

Um die Fuses im Mikrocontroller zu setzen, benutzt man ebenfalls Avrdude. Die Zeile

avrdude -c avrisp -p atmega8 -P COM5 -b 19200 -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m 

setzt die beiden Fuses. Durch die Formatangaben :m am Ende der jeweiligen Fuses weiß Avrdude, dass er die Angaben direkt aus der Befehlszeile übernehmen soll, statt sie aus einer Datei zu lesen.

Neben der fehlerhaften Wahl der Taktquelle bieten die Fuses RSTDISBL, SPIEN und DWEN das größte Gefährdungspotenzial, seinen Mikrocontroller zu bricken, also in einen wertlosen Klumpen Plastik zu verwandeln.

RSTDISBL steht für Reset Disable und trennt den Mikrocontroller intern vom Reset-Pfad ab, um den Reset-Pin als I/O-Pin freizugeben. Das hat etwa bei den achtbeinigen ATTinys den Vorteil, dass man im Betrieb einen Pin mehr zur Verfügung hat, allerdings lässt sich der Chip dann nicht mehr via ISP flashen. Ganz auf verlorenem Posten steht man dann aber doch nicht, sofern man einen STK500-Programmer sein Eigen nennt. Damit ist nämlich das sogenannten High Voltage Programming (HVP) möglich, das die AVR-Controller neben der In-System-Programmierung (ISP) zusätzlich unterstützen. HVP funktioniert allerdings nur, wenn man den IC in einen Sockel des STK500 einstecken kann. Ist er fest in einer Schaltung eingebaut, war’s das.

SPIEN bedeutet SPI Enable, also ob sich der Controller via SPI flashen lässt. Ist die Fuse nicht aktiv, kann man den IC nur noch via HVP retten. DWEN aktiviert die debugWIRE-Schnittstelle bei jüngeren AVR-Controllern. Dann wird ISP jedoch deaktiviert. Zurückschalten kann man nur noch über HVP oder die debugWIRE-Schnittstelle selbst – wofür man jedoch einen Debugging-Adapter wie JTAGICE mkII benötigt.

Mit diesen Einstellungen arbeitet ein ATTiny45 mit 16 MHz intern erzeugtem Takt und einer Brown-Out-Detection bei 2,7V (-U lfuse:w:0xe1:m -U hfuse:w:0xdd:m).

Mit den Fuses BOOTSZ1 und BOOTSZ0 (Bootsize) legt man die Größe des Bootbereichs und daraus resultierend die Startadresse des Bootloaders fest. Welche Kombinationen damit möglich sind, zeigt die Tabelle oben exemplarisch für den ATmega328. Die Größe des Bereichs variiert von Modell zu Modell und ist im jeweiligen Datenblatt angegeben. Damit bei einem Reset beziehungsweise einem Power-Up der Programmzähler statt auf Adresse 0xc00 auf den Bootloader zeigt, muss BOOTRST aktiv sein.

Mehr Infos

Notiz

Die meisten ATmegas laufen standardmäßig mit 1 MHz internem Takt. Er ergibt sich aus der Frequenz des internen RC-Oszillators mit 8 MHz und der gesetzten Fuse CKDIV8.

Die Brown-Out-Detection (BOD) reagiert auf Spannungsabfälle der Stromversorgung, die die CPU in einen undefinierten Zustand bringen können. Ist jedoch die Fuse BODEN (Brown Out Detection Enable) aktiv, löst der Abfall unter der mit BODENLEVEL1 bis BODENLEVEL3 definierten Spannung einen Reset aus. Nutzt man einen Bootloader oder das EEPROM, lautet die Empfehlung von Atmel, einen Reset ab 2,7V (BODLEVEL=101) auszulösen, da es sonst zu gelöschten oder überschriebenen Speicherstellen kommen kann.

Daneben gibt es noch diverse weitere Fuses, an denen Hobbyprogrammierer in der Regel aber nichts ändern müssen. Dazu gehören die Watchdog-Fuse WDTON zum Aktivieren des Watchdog-Timers, EESAVE zum Schutz des EEPROM vor Lösch-Befehlen. SELFPRGEN erlaubt der Firmware, selbst Daten oder neuen Programmcode in den Flash-Speicher zu schreiben. AVR-Controllern mit Bootloader-Unterstützung fehlt dies Fuse, weil die Reprogrammierfunktion der Bootloader erledigt – beispielsweise bei Arduino. Sogenannte Lockbits (LBx, BLBxy) verhindern das Auslesen von Flash und EEPROM oder das Überschreiben des Bootloaders.

Mehr Infos

Tipp

Das leicht zu bedienende Tool Xloader flasht HEX-Dateien in Arduino-Boards ohne Zuhilfenahme der Arduino-IDE. Damit kann man sein Kompilat für Arduino weitergeben, ohne den Quellcode veröffentlichen zu müssen. Xtool setzt auf Avrdude auf.