AVRDUDE

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Beschreibung

AVRDUDE (http://www.nongnu.org/avrdude/) ist eine Programmiersoftware für Atmel AVR Controller.

Funktionen unter Anderem:

AVRDUDE kann das STK500 (auch mit Firmware 2.x als stk500v2), das Atmel AVRISP (auch mit Firmware 2.x als avrispv2 o.ä.), das Atmel AVRISP MKII (USB Ansteuerung mittels lib-usb bzw. lib-usb-W32), AVR910-kompatible Programmierer, den AVR Butterfly/AVR109-kompatible Bootloader, STK200-Programmierdongles und verschiedene andere Parallelport-Adapter sowie "serielle Statusportprogrammierer" (Siprog) ansteuern. Auch das Atmel JTAGICE (oder Nachbauten wie Bootice oder Evertool), Atmel JTAGICE-MKII und der AVR Dragon können als Programmierhardware genutzt werden.

Das Programm ist unter MS-Windows (Cygwin nicht erforderlich), Linux, BSD, Solaris und Mac OS X lauffähig. Die Version für MS-Windows ist im WinAVR-Paket enthalten. Der Quellcode ist frei verfügbar (Lizenz beachten).

Da alle AVRDUDE-Funktionen über Kommandozeilenparamter gesteuert werden können, eignet es sich gut zur Integration in Makefiles. Beispiele finden sich in der Makefile-Vorlage von WinAVR und Mfile.

Die gesamte Konfiguration liegt in einer Textdatei (avrdude.conf), so dass sich bei Bedarf ein beliebiger neuer Parallelport-Programmierdongle oder auch ein noch nicht unterstützter AVR-Controller ergänzen lassen. Die Syntax für die Definition eines AVR-Controllers lehnt sich an die Datenblatt-Tabelle für die serielle Programmierung an, so dass man praktisch nur das Datenblatt "intelligent" abtippen muss.

Für die Ansteuerung von Parallelport-Adaptern unter MS-Windows NT/2000/XP wird ein spezieller Porttreiber (giveio) mitgeliefert. Bei der Installation von WinAVR wird giveio bereits mitinstalliert.

Programmer mit üblicher serieller Schnittstelle (RS232) benötigen keine zusätzliche Software oder Treiber zum Betrieb mit AVRDUDE.

Für Hardware mit USB-Anschluss muss die lib-usb bzw. lib-usb-win32 installiert sein.

Download von AVRDUDE

Für Windows muss aus dem Verzeichnis http://download.savannah.gnu.org/releases/avrdude/ eine Datei avrdude-xxx-mingw32.zip heruntergeladen werden, wobei xxx für die jeweilige Version steht (z.B. avrdude-6.3-mingw32.zip).

Für Linux kann man eine Datei avrdude-xxx.tar.gz herunterladen, entpacken und dann selbst kompilieren, es gibt aber auch fertige deb- bzw. rpm-Pakete unter https://pkgs.org/download/avrdude oder in der Paketverwaltung der jeweiligen Distribution.

GUIs

Bei WinAVR wird die grafische Oberfläche avrdude-gui.exe mitgeliefert.

In der IDE von LunaAVR ist ebenfalls eine GUI für AVRDUDE enthalten (Windows und Linux).

Für Windows, Linux und andere Betriebssysteme gibt es weitere GUIs: den in Java geschriebene AVR Burn-O-Mat, den AVRBurner und AVRDUDESS und AVRDUDESHELL.

Für Mac OS X gibt es noch AVRFuses.app. AVRFuses muss beim ersten Starten auf den verwendeten Programmer und den Speicherort von AVRDUDE eingestellt werden.

GUIs vereinfachen vor allem Programmieren der Fuses.

Kurzanleitung für Linux und STK200

Zunächst muss ein Hardware-Link auf die Printerport-Treiber eingerichtet werden:

su
mknod /dev/parport0 c 99 0
chmod a+rw /dev/parport0
avrdude -p m8535 -c stk200 -e -U qqtraff.hex

Hinweis : Bei USB Programmern ist zu beachten, dass diese durch das Betriebssystem auf einen anderen Port gelegt werden können, als im Beispiel angegeben. Diesen Port kann man unter Anderem "im Terminal" mit dem Befehl

user@server: dmesg

ermitteln. Alternativ kann man sich eine Auflistung der Ports, im Verzeichnis "/dev" anzeigen lassen:

user@server: ls /dev/

Sollte man nicht sicher sein, auf welchem Port der Programmer liegt, kann man den Programmer nochmals ausstecken und "ls /dev/" ausführen. Der nun Fehlende Port, ist der Programmerport. Diesen Port muss man statt "parport0" in die oben beschriebenen Terminalkommandos einsetzen.

Siehe auch :

STK500 seriell unter Linux

Wenn das STK500 über ein ganz normales Seriell-kabel bzw. über ein echter serieller Schnittstelle (RS232) an PC angeschlossen ist und AVRDUDE folgende Meldung bringt:

avrdude: ser_open(): can't open device "/dev/ttyS0": Permission denied

Dann müssen die Rechte an nicht root Benutzer erweitern, also:

sudo adduser deinusername dialout

Siehe :

Tipps + Tricks

Parallelport-Programmer an aktuellen PCs

Ein echter Parallelport ist die preiswerteste und auch schnellste Art der Datenübertragung zum Zielsystem (Mikrocontroller), alle anderen wie bspw. eine PCI-, PCIexpress- oder ExpressCard-Karte sind komplizierter und teurer.

Steckkarten

Diese liegen auf anderen Basisadressen. Kann man im Geräte-Manager einsehen. Diese ist avrdude per Kommandozeile (irgendwie) mitzuteilen. Sonst kann es nicht funktionieren.

Die Geschwindigkeit ist gleich eingebauter echter Parallelports, also sehr schnell.

Mit InpOut32.dll (siehe unten) ist eine automatische Umleitung von Standard-Parallelportadressen auf diese nicht-standardmäßigen möglich. Allerdings unter Geschwindigkeitsverlust durch das Exception-Handling.

USB-Parallel-Adapter

Gewöhnliche USB-Paralleldrucker-Adapter (um 5 € zu haben) funktionieren nicht.

Falls ausschließlich D0..D7 (8 Ausgänge) sowie ERR, ONL und PE (3 Eingänge) verwendet werden, kann unter Verwendung eines 8-bit-Fang-Flipflops ein solcher Adapter dennoch verwendet werden, unter Einsatz der unten genannten InpOut32.dll. Gähnend langsam.

Spezielle USB-Parallel-Adapter, die Portadressen emulieren, funktionieren, allerdings ebenso gähnend langsam.

Geschwindigkeit begrenzen

Aktuelle PCs sind einfach zu schnell mit dem Bitgewackel an der parallelen Schnittstelle, vor allem für AVRs, die noch mit den 1 MHz im Auslieferungszustand laufen (maximal zulässiger ISP-Takt < 250 kHz). Neuere Versionen von avrdude unterstützen zu diesem Zweck eine Option -i <N>, wobei <N> die Anzahl der Mikrosekunden bezeichnet, die beim Bitwackeln zusätzlich zu warten ist. Einfach mal mit -i 10 anfangen und dann entweder die Fuses auf die Ziel-Taktfrequenz umstellen (falls diese wesentlich höher sein wird als die 1 MHz), oder sukkzessive mit kleineren Werten testen (Forenbeitrag von Jörg).

Die Option -i ist auch nützlich bei AVRs, die für einen langsamen Takt konfiguriert sind. Bei einem ATmega8, der mit einem 32.768 kHz Quarz läuft, kann es z.B. notwendig sein, die Option -i 90 zu verwenden. Den Zahlenwert ggf. ausprobieren.

Manche Programmer werten die Option -i manchmal nicht aus, dann sollte man einen anderen Programmer versuchen.

Beim USBTINY und USBASP kann man die Geschwindigkeit der SPI-Schnittstelle mit dem Parameter -B [Periodendauer in Mikrosekunden] begrenzen. Da beide Geräte durch Interrupts der Software-USB-Schnittstelle stark belastet werden, handelt es sich hier um die Maximalbitrate.

Spezielle Hacks

Unter Windows XP Service Pack 2 auf einem IBM Thinkpad T40 ließ sich die Fehlermeldung „avrdude: AVR device not responding“ beheben durch Ändern im Gerätemanager⇒Lpt1⇒Eigenschaften⇒Anschlusseinstellungen⇒„Interrupt-nie-verwenden“ in „Jeden dem Anschluss zugewiesenem Interrupt verwenden“.

64-Bit-Problem

Unter 64-Bit-Windows-Versionen kann das Parallelport zunächst nicht benutzt werden, da der mitgelieferte 32-bit-GiveIO-Treiber nicht funktioniert.

Es gibt seit 2015 eine 64-Bit-giveio.sys. Der Treiber ist zertifiziert und kann ohne Deaktivierung des Treiberzertifizierungszwangs oder ähnlicher Vorkehrungen verwendet werden. Er wurde in der Zeitschrift c't vom 30.10.2015 vorgestellt.

Seine Installation erfolgt mit dem im Windows eingebauten SC-Kommando (Service Control) ohne Neustart. Dies ist in der Textdatei dokumentiert.

Im Gegensatz zur Umstellung auf inpout32.dll (Patch siehe http://savannah.nongnu.org/patch/?7275) ist die I/O-Transferrate nicht reduziert.

Unübliche Portbasisadressen

Hierzu muss der Umweg über inpout32.dll genommen werden. Diese DLL vollzieht eine automatische Adressenumsetzung mittels prozessweitem Exception-Behandler ohne Patch.

So geht's:

  • Neue InpOut32.dll herunterladen
  • Kommandozeile: crundll InpOut32,CatchIo avrdude.exe ... (usw.)

Und so funktioniert's:

  • Die winzige crundll.exe ist ein Ersatz für rundll32.exe, als Konsolen-Version. Das verhindert, dass für avrdude eine neue Konsole geöffnet wird.
  • crundll lädt InpOut32.dll und ruft den Einsprungpunkt CatchIoW auf. Als Kommandozeile wird L"avrdude.exe ..." (also die üblichen Parameter) übergeben
  • Die CatchIoW-Routine erstellt einen schlafenden Prozess aus dem avrdude-Image. Nicht als Debugger, um teuere Prozessumschaltungen für das Exception-Handling (s.u.) zu vermeiden
  • Ein „Remote Thread“ wird im avrdude-Prozess gestartet, um InpOut32.dll zu laden. Genannt: DLL-Injektion
  • Die DLL-Initialisierungsroutine packt inpout64.sys aus, installiert und lädt diesen Kernmodus-Treiber. Das erfordert Admin-Rechte. Nebenbei leitet InpOut32.dll Zugriffe auf unübliche Portadressen sowie USB-Geräte um. Die dazu notwendige Geräte- und Adresserkennung läuft ebenfalls in der Initialisierungsroutine
  • In der Initialisierung wird ein prozessweiter Exception-Filter installiert
  • Ein zweiter „Remote Thread“ ändert die Adresse von kernel32.dll:GetVersionEx(). Die Ersatzroutine liefert als Plattform Windows 9x/Me. Auch genannt API-Hooking. Der Grund für den zweiten „Remote Thread“ ist, dass dieses Verhalten bei regulärer Benutzung der InpOut32.dll (also LoadLibrary oder quasistatische Einbindung) unerwünscht ist.
  • Der avrdude-Prozess wird aufgeweckt und startet. Er „erkennt“ Windows 9x/Me and versucht gar nicht erst, GiveIo.sys zu starten. (Bekanntlich greifen unter Windows 9x/Me Portzugriffe ungehindert zur Hardware durch, außer die durch VxDs abgefangenen.)
  • Dann macht avrdude die üblichen IN+OUT-Befehle. Jeder dieser Befehle generiert eine (IMHO) Allgemeine Schutzverletzung, also Int13 (General Protection Fault #GP). Bevor die sattsam bekannte Messagebox erscheint, geht der Interrupthandler zu ntdll:KiUserExceptionDispatcher, welche schließlich den installierten prozessweiten Exception-Filter aufruft, bevor es zum Abarbeiten eventueller try/except-Blöcke kommt
  • Der Filter (also das Stückchen Kode in der InpOut32.dll) stellt fest, dass es sich tatsächlich um einen IN- oder OUT-Befehl handelt. Der Befehl wird einfach übersprungen und inpoutx64.sys bemüht, per DeviceIoControl() die E/A-Operation im Kernel Mode auszuführen. Kontext-Register (hier AL und DX) werden entsprechend benutzt. Danach meldet der Filter dem Aufrufer „Ausnahme erschlagen, bitte weiter im Text“
  • Nach dieser länglichen Umleitung geht es weiter mit dem nächsten Assemblerbefehl

Fertig.

USB-Programmer

Die meisten USB-Programmiergeräte benötigen libusb-win32 bzw. libusb.

Ein Selbstbau-USB-Programmieradapter ist unter http://www.rototron.info zu finden. Er benötigt eine relativ neue AVRDUDE-Version, aber benötigt unter keinem Windows-Betriebssystem einen Treiber, da er ein HID-Gerät implementiert. libusb-win32 wird nicht benötigt. Normale (= reduzierte) Benutzerrechte genügen zum Betrieb des Gerätes.

libusb0.dll wird bei WinAvr 20070525 nicht gefunden

Forenbeitrag von Paul: Habe leider noch etwas zu bemängeln, und zwar meckerte avrdude, dass es die "libusb0.dll" nicht fand. Musste dann erst noch manuell den Pfad c:\winavr\utils\libusb\bin in die autoxecec.bat eintragen. Siehe auch Diskussion bei www.avrfreaks.net

Aufruf unter Linux als user (non-root)

Unter Linux kann häufig avrdude nur als user 'root' auf den USB-Programmer zugreifen. Als normaler User bekommt man eine Fehlermeldung wie:

#avrdude -c usbtiny -p m8
 
avrdude: error: usbtiny_transmit: 
error sending control message: 
Operation not permitted

Dies liegt daran, dass die device-nodes, die beim Einstecken des USB-Programmers von udev angelegt werden, root zugeordnet sind. Man kann dies ändern, indem man udev-Regeln für die verwendeten Programmer anlegt. Unter Debian muß man dazu nur eine neue Datei, z. B. 015_usbprog.rules unter /etc/udev/rules.d anlegen, z. B. mit folgenden Inhalt:


# Atmel AVR ISP mkII
SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2104", GROUP="users", MODE="0660"

# usbprog bootloader
ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c62", GROUP="users", MODE="0660"
 
# USBasp programmer
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", GROUP="users", MODE="0660"
 
# USBtiny programmer
ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", GROUP="users", MODE="0660"


Danach muss in der Regel der udev-Dienst neu gestartet werden, was -- je nach System -- mit einem der beiden folgenden Befehle funktionieren sollte (natürlich nur als root):

sudo /sbin/udevadm control --reload-rules

bei aktueller udev-version, oder

sudo /sbin/udevcontrol --reload_rules

, bei älteren udev-versionen.


Danach sollte der USB-Programmer erneut angeschlossen werden. Falls es immer noch nicht funktioniert kann es helfen, als GROUP "plugdev" statt "users" zu verwenden.

Hiermit werden der AVR ISP mkII, der usbprog Bootloader, USBasp und USBtiny bekannt gemacht, so daß alle User in der Gruppe "users" darauf zugreifen können.

Für weitere USB-Programmer muß man die entsprechende Zeile (mit ATTRS...) anlegen und die passenden Vendor und Product IDs eintragen.

Siehe auch:

Linux-Treiberprobleme

Wenn der Programmer (usbprog mit AVRisp mkII) unter Ubuntu trotz korrekter Konfiguration nicht gefunden wird, kann es daran liegen, dass das Paket "libmtp-runtime" installiert ist. siehe hier

JTAGICE3 Problem

avrdude 6.0.1 hat Probleme mit der Firmware-Version 3.x des JTAGICE3 Debuggers. Abhilfe schafft das Wechseln auf die vorherige Firmware-Version 2.xx.

Anzeige unterstützter AVRs

Wie die anderen Atmels bei avrdude heißen zeigt:

avrdude -?
avrdude -p ?

neuere AVRs hinzufügen

Manch neueres Silizium wird nicht erkannt da sich z.T. die IDs geändert haben. Um diese erfolgreich zu Programmieren empfiehlt sich ein eigenes config-File zu verwenden. Darin werden die 'fehlenden' CPUs ergänzt:

z.B. ATmega168P (Programmierung wie ATmega168): einfach den ATmega168 Teil duplizieren und die entsprechenden Änderungen (id, desc, signature) vornehmen

#------------------------------------------------------------
# ATmega168P
#------------------------------------------------------------

part
    id              = "m168p";
    desc            = "ATMEGA168P";
     has_debugwire = yes;
     flash_instr   = 0xB6, 0x01, 0x11;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
	             0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
	             0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode  = 0x86;
    # avr910_devcode = 0x;
    signature       = 0x1e 0x94 0x0b;

 ...
;

danach kann, unter Angabe des neuen config-Files, auch ein ATmega168P programmiert werden, z.B.:

avrdude -pm168p -C ~/.avrdude.config.neu -cstk500v2 -v  -U flash:w:main.hex

Anschluss an COM10 und höher (Windows)

Wenn AVRDUDE unter Windows an COM10 und höher betrieben werden soll, ist eine andere Schreibweise für die Schnittstelle in der Kommandozeile nötig. Beispiel:

avrdude -c stk500v2 -p m16 -P \\.\com13 -uF -vvvv 2> logfile.txt

In diesem Beispiel wird statt der gewohnten Schreibweise com13 die spezielle Schreibweise \\.\com13 verwendet und es wird mit -vvvv 2> logfile.txt eine ausführliche Debugausgabe für Fragen im Forum erzeugt. Näheres hierzu in der Forumsdiskussion.

AVRISPmkII + AVRDUDE + Window Vista (32)

http://www.mikrocontroller.net/topic/126594#1157327

"avrdude was compiled without usb support"

Offenbar enthielt WinAVR-20100110 zunächst fälschlicherweise eine AVRDUDE Version ohne USB Support [1].

Abhilfe (Einer der drei Punkte):

1. WinAVR deinstallieren, gleiches Release (WinAVR-20100110) nocheinmal herunterladen und installieren (mindestens seit Anfang März 2010 enthält dieses Release avrdude in der Version 5.10 und bringt USB-Support mit).

2. AVRDUDE selbst compilieren: http://www.mikrocontroller.net/topic/163675

3. Compilierte Version 5.10 downloaden: http://www.mikrocontroller.net/topic/163675#1594689

Textausgabe in Datei umleiten?

Die Windows-"Shell" cmd benutzt für die Ausgabeumleitung die gleiche Syntax wie die Bourne-Shell (und damit auch Bash):

programm >datei 2>&1

zur Umleitung von STDOUT und STDERR in die gleiche Datei (Yalu in [2]).

Beispiel für Windows ([3], M$):

avrdude -c avrispmkII -p m8 -P usb:xx -v > "C:\output.txt" 2>&1

oder nur STDERR in Datei umleiten:

avrdude -c avrispmkII -p m8 -P usb:xx -v 2> "C:\output.txt"

Franzis bzw. ELO Lernpaket Mikrocontroller (Attiny13)

Markus hat in [4] einen Weg beschrieben, wie man den einfachen Programmieradapter des Lernpakets mit AVRDUDE ansteuern kann.

Eine weitere Anleitung LP Mikrocontroller und Attiny45 mit Avrdude gibt es von Ralf Beesner auf der Webseite des Entwicklers Burkhard Kainka. In avrdude.conf wird dabei ein neuer Programmieradapter namens burkhard hinzugefügt. Ein zweiter Eintrag burkhard2 in dieser avrdude.conf ist für die Programmierung des Atmega8 auf dem Franzis Retro-Pong Bausatz mit Hilfe des "Mega8-ISP-Programmer" (Layout siehe ELO-Webseite) vorgesehen.

AVRDUDE mit Arduino Bootloader benutzen

Mit der Option -c stk500v1 kann AVRDUDE den Bootloader in Arduino Boards ansprechen [5].

Es existieren auch modifizierte Versionen von AVRDUDE, die einen Programmer namens arduino kennen (avrdude.conf untersuchen!). Damit lautet die Kommandozeile für ein Arduinoboard mit Atmega168 beispielsweise [6]

avrdude -c arduino -p m168 -P usb -U flash:w:<filename>

Evtl. muss auch noch die Datenrate mit der Option -b angepasst werden, je nach Board werden verschiedene (19200, 57600, 115200) verwendet.

Die Bootloader-Hacks von Ladyada arbeiten nochmal etwas anders.

Gelegentlich gibt es unter Windows Probleme mit der allgemeinen AVRDUDE Version und deren Handling der DTR/RTS Leitung (RS232). Es kann helfen, unmittelbar von dem Absenden der Kommandozeile einen RESET auf dem Arduinoboard durchzuführen. Ein kurzes Setzen der DTR Leitung auf HIGH bewirkt ein RESET. So ist es möglich eine .bat Datei zu erstellen mit folgendem Code: (com6 ist ein Virtueller USB Comport)

mode com6 dtr=on
avrdude -c arduino -p m168 -P \\.\com6 -U flash:w:<filename>
if %ERRORLEVEL%==0 goto fertig
Pause
:fertig
exit

Wenn man den mode-Befehl nicht verwenden kann, etwa weil man cygwin und ein makefile verwendet, so kann man stattdessen

cmd /c mode com6 dtr=on

verwenden. In cygwin empfiehlt sich

cmd /c mode com6 dtr=on > /dev/null

, damit wird die unnütze Ausgabe des Befehls verborgen.

Siehe auch:

mysmartUSB V2.11 und ATtiny 13

mysmartUSB V2.11 verlangt -cavr910 als Programmer. Leider ist in avrdude 5.10 immer noch nicht der ATtiny13 damit zu programmieren. Also in die avrdude.conf folgendes mit unter ATtiny13 aufnehmen, so kann er dann korrekt programmiert werden(inkl. Fuse Bits).

#------------------------------------------------------------
# ATtiny13
#------------------------------------------------------------

part
    id                  = "t13";
    desc                = "ATtiny13";
     has_debugwire = yes;
     flash_instr   = 0xB4, 0x0E, 0x1E;
     eeprom_instr  = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,
               0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC,
               0x99, 0xE1, 0xBB, 0xAC;
    stk500_devcode      = 0x14;
    avr910_devcode      = 0x55;
......

Achtung! Programmieren geht auch mit -cavr911. Allerdings geht das Fuse setzen nicht und man bekommt eine Fehlermeldung.(Programm läuft aber)

Reading | ################################################## | 100%
0.12s

avrdude: verifying ...
avrdude: 226 bytes of flash verified
avrdude: reading input file "0x7a"
avrdude: writing lfuse (1 bytes):

Writing |  ***failed;
################################################## | 100% 0.00s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0x7a:
avrdude: load data lfuse data from input file 0x7a:
avrdude: input file 0x7a contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100%
0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xff"
avrdude: writing hfuse (1 bytes):

Writing |  ***failed;

Anpassungen von avrdude.conf an neuere AVRs

Weblinks