Avrdude ist ein Konsolenprogramm zum Programmieren (Flashen) von AVR Controller für Windows, Linux und MacOS. Avrdude unterstützt fast alle verfügbaren Programmieradapter. Die Bedienung ist jedoch konsolentypisch mühsam und, am Beispiel von Ubuntu und openSuse, funktioniert es auch nicht immer auf Anhieb. Deshalb hier ein kleines Tutorial, das dabei helfen soll, die anfänglichen Probleme zu umschiffen.
Unter Ubuntu und openSuse funktioniert avrdude nicht auf Anhieb. Man muss zunächst einige Anpassungen vornehmen. Getestet habe ich das mit Ubuntu 8.04 und 8.10, sollte aber auch bei anderen Versionen und bei Debian so funktionieren. Nachtrag: Ebenfalls getestet unter openSuse 11.0
Unter Ubuntu (und anderen Debian Derivaten) installiert man einfach von der Konsole.
sudo apt-get install avrdude
installiert avrdude nach /usr/bin/avrdude
Optional kann man mit
sudo apt-get install avrdude-doc
die Dokumentation nachinstallieren. Diese findet man dann unter /usr/share/doc/avrdude-doc/avrdude-html/avrdude.html
Unter openSuse installiert man avrdude als su von der Konsole:
zypper install avrdude
Warnung: Unter Ubuntu 9.10 führte der nachfolgend beschriebene Weg dazu, dass der Anmeldebildschirm nicht mehr funktionierte. Erst ein Entfernen besagter Datei brachte Abhilfe!
Ich konnte diesen Fehler hier noch nie beobachten. Auf verschiedenen Rechner, auch unter Ubuntu 9.10 und Debian Testing, funktioniert diese Methode. Auch von anderen habe ich keine Berichte über Probleme gehört. — burli 2010/03/08 20:12
Unter Ubuntu funktioniert avrdude nicht sofort mit USB Programmern wie AVRISP mkII. Man muss eine Datei anlegen. Um die Datei zu erstellen gibt man folgenden Befehl ein:
gksu gedit /etc/udev/rules.d/80-usbprog.rules
Eine Rules Datei könnte in etwa so aussehen
ATTR{idVendor}=="03eb", ATTR{idProduct}=="2104", GROUP="plugdev", MODE="0660" # AVRISP mkII
ATTR{idVendor}=="03eb", ATTR{idProduct}=="2107", GROUP="plugdev", MODE="0660" # AVR-Dragon
ATTR{idVendor}=="03eb", ATTR{idProduct}=="2103", GROUP="plugdev", MODE="0660" # JTAG ICE mkII
ATTR{idVendor}=="03eb", ATTR{idProduct}=="2106", GROUP="plugdev", MODE="0660" # STK600
ATTR{idVendor}=="16c0", ATTR{idProduct}=="05dc", GROUP="plugdev", MODE="0660" # USBASP von www.fischl.de
ATTR{idVendor}=="03eb", ATTR{idProduct}=="2ffa", GROUP="plugdev", MODE="0660" # AT90USB
ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea60", GROUP="plugdev", MODE="0660" # AVR910
Nach der Änderung der Datei 80-usbprog.rules muss udev neu gestartet werden. Dies geschieht mit folgender Zeile
sudo /etc/init.d/udev restart
Eventuell muss anschließend der Programmer noch einmal abgezogen und neu eingesteckt werden.
Sollte es trotzdem nicht funktionieren gibt es Abhilfe. Gebt in der Konsole diesen Befehl ein
lsusb
Der Befehl liefert als Ergebnis in etwa folgende Zeilen (abhängig davon welche(n) Programmer man angeschlossen hat).
Bus 004 Device 002: ID 03eb:2104 Atmel Corp. AVR ISP mkII Bus 003 Device 006: ID 03eb:2107 Atmel Corp. AVR Dragon Bus 003 Device 007: ID 03eb:2103 Atmel Corp. JTAG ICE mkII Bus 005 Device 004: ID 03eb:2106 Atmel Corp. Bus 005 Device 005: ID 16c0:05dc VOTI
Auf diese Weise könnt ihr auch die idVendor und idProduct anderer USB Programmer ermitteln und einen entsprechenden Eintrag erstellen. Die vierstellige HEX Zahl vor dem Doppelpunkt ist die idVendor Nummer, die vierstellige HEX Zahl nach dem Doppelpunkt ist die idProduct Nummer. Erstellt einfach eine neue Zeile wie oben beschrieben und kopiert die Nummern an die richtigen Stellen. Dann sollte avrdude ohne Root Rechte auf die USB Programmer zugreifen können
Auch der Druckerport funktioniert nicht sofort. Zunächst sollte man prüfen ob das Device richtig eingerichtet ist (bei meinem Laptop mit Xubuntu 8.04 war das aus irgend einem Grund nicht der Fall, daher erwähne ich das hier)
ls /dev/par*
Man sollte dann diese Ausgabe erhalten
/dev/parport0
Ist dies nicht der Fall muss man das Device erstellen, ansonsten wird der nächste Befehl übersprungen
sudo mknod /dev/parport0 c 99 0
Als nächstes überprüft man, ob der User Zugriffsrechte auf das Device hat. Das kann man direkt mit avrdude machen (nicht als Root ausführen). Dabei spielt es keine Rolle ob ein Dongel angeschlossen ist
avrdude -pm8 -cstk200 -e
Sollte eine Fehlermeldung mit Permission denied erscheinen, fehlen die Zugriffsrechte. Diese erstellt man am einfachsten mit diesem Befehl
sudo usermod -a -G scanner <username>
wobei <username> durch den Namen des jeweiligen Benutzers ersetzt werden muss.
Sollte nach letztern Befehl immer noch kein Zugriff auf parport0 möglich sein diesen Befehl
sudo chmod a+rw /dev/parport0
verwenden
Für die Installation unter Windows verwendet man am besten die neueste Version von WinAVR. Einfach wie üblich im gewünschten Verzeichnis installieren. Nach der Installation ist eventuell ein Neustart erforderlich damit die Pfade aktualisiert werden.
Variante 1. Mit AVR Studio
Es gibt offenbar zwei Varianten wie man Avrdude unter Windows installieren kann. Variante 1 mit AVR Studio funktioniert bei mir. Man benötigt das AVR Studio und den LibUSB Treiber.
Ich bin mir nicht sicher ob die Reihenfolge eine Rolle spielt. Bei mir hat es funktioniert nachdem ich zuerst LibUSB und anschließend das AVR Studio installiert habe. Sollte man das AVR Studio schon installiert haben und möchte es deinstallieren muss man anschließend auch noch manuell die Treiber deinstallieren. Das macht man am einfachsten im Gerätemanager. Der/die Programmer müssen dazu eingesteckt sein. Öffnet den Gerätemanager und sucht nach Jungo. Dort deinstalliert ihr alle Einträge.
Anschließend LibUSB und AVR Studio wieder installieren. Bei der Installation vom AVR Studio bei der Frage ob die USB Treiber installiert werden sollen unbedingt darauf achten das ein Häkchen gemacht wurde.
Erwähnenswert ist vielleicht noch das ich die bei WinAVR mitgelieferten libusb0.dll Dateien umbenannt habe damit die nicht versehentlich zuerst gefunden werden.
Wie gesagt, ich weiß nicht ob die Reihenfolge wichtig ist. Wer es anders herum erfolgreich geschafft hat kann das gerne anfügen oder unten einen Kommentar posten.
Variante 2. Ohne AVR Studio
Für Variante 2 darf das AVR Studio und die Jungo Treiber nicht installiert sein. Hier soll die Installation von WinAVR ausreichen. Diese Variante habe ich allerdings nicht zum Laufen bekommen.
Damit Avrdude auf den Druckerport und den Comport zugreifen kann muss giveio installiert sein. Alles nötige ist in WinAVR enthalten. Wenn man sich nicht sicher ist ob es bereits installiert ist kann man das überprüfen indem man in der Kommandozeile diesen Befehl eingibt:
status_giveio
Der Befehl sollte ausgeführt werden unabhängig davon in welchem Verzeichnis man sich befindet. Sollte das nicht funktionieren ist der Pfad für WinAVR nicht gesetzt oder wurde nicht aktualisiert. Sollte in der Meldung der Hinweis stat failed (status 1060): auftauchen ist giveio nicht installiert. Man kann ihn einfach mit diesem Befehl installieren.
install_giveio
Der Vollständigkeit halber sei noch der Befehl zum Entfernen des Treibers erwähnt:
remove_giveio
Damit sollte Avrdude jetzt unter Windows XP funktionieren
Da mir Vista nicht zur Verfügung steht kann ich leider auch nichts dazu schreiben. Auch hier bitte ich um Mithilfe Bei mir läuft es unter WINDOWS7!!
Ich habe es unter WIN7 64Bit mit Pony serial Interface im Betrieb
Avrdude benötigt mehrere Parameter. Alle Parameter beginnen mit einem Minuszeichen gefolgt von einem Buchstaben. Bei den Buchstaben ist auf Groß-/Kleinschreibung zu achten. Zwischen dem Parameter und dem Wert kann ein Leerzeichen folgen, muss aber nicht.
c2n232i = serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts dasa3 = serial port banging, reset=!dtr sck=rts mosi=txd miso=cts dasa = serial port banging, reset=rts sck=dtr mosi=txd miso=cts siprog = Lancos SI-Prog <http://www.lancos.com/siprogsch.html> ponyser = design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts 89isp = Atmel at89isp cable frank-stk200 = Frank STK200 blaster = Altera ByteBlaster ere-isp-avr = ERE ISP-AVR <http://www.ere.co.th/download/sch050713.pdf> atisp = AT-ISP V1.1 programming cable for AVR-SDK1 from <http://micro-research.co.th/> dapa = Direct AVR Parallel Access cable xil = Xilinx JTAG cable futurlec = Futurlec.com programming cable. abcmini = ABCmini Board, aka Dick Smith HOTCHIP picoweb = Picoweb Programming Cable, http://www.picoweb.net/ sp12 = Steve Bolt's Programmer alf = Nightshade ALF-PgmAVR, http://nightshade.homeip.net/ bascom = Bascom SAMPLE programming cable dt006 = Dontronics DT006 pony-stk200 = Pony Prog STK200 stk200 = STK200 bsd = Brian Dean's Programmer, http://www.bsdhome.com/avrdude/ pavr = Jason Kyle's pAVR Serial Programmer dragon_pdi = Atmel AVR Dragon in PDI mode dragon_dw = Atmel AVR Dragon in debugWire mode dragon_hvsp = Atmel AVR Dragon in HVSP mode dragon_pp = Atmel AVR Dragon in PP mode dragon_isp = Atmel AVR Dragon in ISP mode dragon_jtag = Atmel AVR Dragon in JTAG mode jtag2pdi = Atmel JTAG ICE mkII PDI mode jtag2avr32 = Atmel JTAG ICE mkII im AVR32 mode jtagmkII_avr32 = Atmel JTAG ICE mkII im AVR32 mode jtag2dw = Atmel JTAG ICE mkII in debugWire mode jtag2isp = Atmel JTAG ICE mkII in ISP mode jtag2 = Atmel JTAG ICE mkII jtag2fast = Atmel JTAG ICE mkII jtag2slow = Atmel JTAG ICE mkII jtagmkII = Atmel JTAG ICE mkII jtag1slow = Atmel JTAG ICE (mkI) jtag1 = Atmel JTAG ICE (mkI) jtagmkI = Atmel JTAG ICE (mkI) avr911 = Atmel AppNote AVR911 AVROSP avr109 = Atmel AppNote AVR109 Boot Loader butterfly = Atmel Butterfly Development Board usbtiny = USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/ usbasp = USBasp, http://www.fischl.de/usbasp/ avr910 = Atmel Low Cost Serial Programmer stk600hvsp = Atmel STK600 in high-voltage serial programming mode stk600pp = Atmel STK600 in parallel programming mode stk600 = Atmel STK600 stk500hvsp = Atmel STK500 V2 in high-voltage serial programming mode stk500pp = Atmel STK500 V2 in parallel programming mode stk500v2 = Atmel STK500 Version 2.x firmware mib510 = Crossbow MIB510 programming board stk500v1 = Atmel STK500 Version 1.x firmware stk500 = Atmel STK500 buspirate = The Bus Pirate avrisp2 = Atmel AVR ISP mkII avrispmkII = Atmel AVR ISP mkII avrispv2 = Atmel AVR ISP V2 avrisp = Atmel AVR ISP arduino = Arduino
Mit diesem Befehl kann man sich die Werte für den ATmega8 anzeigen lassen. -c muss man angeben damit es funktioniert
avrdude -pm8 -cstk200 -v
Der Befehl liefert unter anderem diese Werte:
Block Poll Page Polled Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- --------- eeprom 4 20 128 0 no 512 0 0 9000 9000 0xff 0xff flash 33 10 64 0 yes 8192 64 128 4500 4500 0xff 0x00 lfuse 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00 lock 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00 calibration 0 0 0 0 no 4 0 0 0 0 0x00 0x00 signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Alle verfügbaren Speicheroperationen:
Der op Parameter definiert die Art der Operation
Der Parameter filename gibt die Datei an in die geschrieben bzw aus der gelesen werden soll. Wenn eine Operation durchgeführt werden soll die nur einzelne Bytes benötigt, zb ein Fusebyte beschreiben, gibt man statt eines Dateinamen den Wert des Bytes an, in der Regel im HEX Format, zb 0xff. Sollte der Dateiname bzw der Pfad einen Doppelpunkt enthalten muss man den gesamten Pfad in Anführungszeichen einschließen.
Der Parameter format gibt das Format der Datei oder des Zahlenwertes an. Je nach Wert wird die Datei in dem angegebenen Format abgespeichert. Der Parameter ist optional.
Diese Beispiele sollen die wichtigsten Operationen erklären. Für diese Beispiele verwende ich der Einfachheit halber immer den ATmega8 und den AVRISP mkII. Für andere Controller muss der entsprechende Typ eingesetzt werden, für andere Programmer die entsprechenden Parameter wie weiter unten beschrieben.
avrdude -pm8 -cavrisp2 -Pusb -eLöscht Flash und Eeprom. Ist das EESAVE Fusebit programmiert wird das Eeprom nicht gelöscht.
avrdude -pm8 -cavrisp2 -Pusb -U lfuse:w:0xff:m -U hfuse:w:0xc9:mMit dieser Anweisung werden die Fusebits CKSEL, SUT, CKOPT und WDTON eingestellt. Die Einstellungen mit dem AVR Fuse Calculator.
avrdude -pm8 -cavrisp2 -Pusb -U lfuse:r:-:iDiese Anweisung ließt das Low Fuse Byte und gibt es im Terminal aus.
Reading | ################################################## | 100% 0.00s avrdude: writing output file "<stdout>" :01000000FF00 :00000001FF avrdude: safemode: Fuses OK
Der Wert findet sich in der ersten Zeile :01000000FF00. Der fettgedruckte Teil ist das Fusebyte
avrdude -pm8 -cavrisp2 -Pusb -U eeprom:w:in.eepromSchreib die Datei in.eeprom in das EEPROM. Die Datei muss im RAW Format vorliegen. Lest das (leere) EEPROM einmal im RAW Format aus, dann wisst ihr was das ist.
avrdude -pm8 -cavrisp2 -Pusb -U eeprom:r:out.eeprom:dSpeichert den Inhalt des EEPROMs in die Datei out.eeprom im dezimalen Format ab.
avrdude -pm8 -cavrisp2 -Pusb -U flash:w:test.hexSchreibt die Datei test.hex in das Flash.
avrdude -pm8 -cavrisp2 -Pusb -U flash:r:test.hex:iDer Parameter -U setzt sich aus mehreren Teilen zusammen. flash definiert das eine Operation mit dem Flash Speicher durchgeführt werden soll, r bedeutet eine Leseoperation, anschließend folgt der Dateiname. Der letzte Parameter steht für den Ausgabetyp. i steht in diesem Fall für Intel HEX. Andere mögliche Parameter wären zb r für Raw oder s für Motorola HEX.
Wer die Seriennummer eines Atmel Programmers benötigt (notwendig zb bei JTAGICE mkII) erhält sie mit diesem Befehl
avrdude -pm8 -cjtagmkII -Pusb:xxx -v
Als Ergebnis liefert avrdude diese Antwort
avrdude: Version 5.5, compiled on Nov 10 2007 at 00:07:28
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
System wide configuration file is "/etc/avrdude.conf"
User configuration file is "/home/burli/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : usb:xxx
Using Programmer : jtagmkII
avrdude: usbdev_open(): Found JTAGICE mkII, serno: 00B0000014BA
avrdude: usbdev_open(): did not find any (matching) USB device "usb:xxx"
(Nur AVRISP mkII, JTAGICE und AVR Dragon) avrdude arbeitet mit der zuletzt eingestellten ISP Clock. Ist dieser Takt zu langsam oder zu schnell, kann man dies mit der Option -B ändern. Als Parameter wird ein Fließkommawert in Mikrosekunden angegeben
avrdude -pm8 -cavrisp2 -Pusb -B1.0 -e
stellt die ISP Clock auf 1MHz. Der Wert wird im Programmer gespeichert.
Im Folgenden werden einige Beispiele gezeigt wie die verschiedenen Programmer unter unterschiedlichen Betriebssystemen anzusprechen sind. Damit es übersichtlich bleibt wird nur der ATmega8 als Controller (-pm8) und die Erase Operation (-e) verwendet
Dieser Befehl löscht einen ATmega8
avrdude -pm8 -cavrisp2 -Pusb -e
Diser Befehlt löscht einen ATmega8 unter Linux
avrdude -pm8 -cavr911 -P/dev/ttyUSB0 -e
Und hier für Windows
avrdude -pm8 -cavr911 -PCOMx -e
Wobei das x für die Comport Nummer steht unter der sich der Programmer installiert hat, also zb COM3 wenn der Rechner bereits zwei normale serielle Schnittstellen hat.
Dieses Beispiel zeigt wie man den AVRprog Bootloader verwendet. In diesem Beispiel wurde der Bootloader mit 9600 Baud compiliert und es wird COM1 verwendet
avrdude -pm8 -cavr109 -b9600 -P/dev/ttyS0 -e
avrdude -pm8 -cavr109 -b9600 -Pcom1 -e
Mit Hilfe einer Konfigurationsdatei kann man Default-Einstellungen vornehmen. Unter Linux findet man die Datei unter /usr/local/etc/avrdude.conf oder /etc/avrdude.conf. Alternativ kann jeder User in seinem /home Verzeichnis die Datei .avrduderc anlegen. Unter Windows muss die Datei avrdude.rc im selben Verzeichnis liegen wie avrdude.exe
In der Datei kann man verschiedene Standardwerte vorgeben.
default_parallel = "default-parallel-device";
Gibt den Standard Druckerport an. Kann mit der Option -P überschrieben werden.
default_serial = "default-serial-device";
Gibt die serielle Standard Schnittstelle an. Kann mit der Option -P überschrieben werden.
default_programmer = "default-programmer-id";
Gibt den Standard Programmer an. Kann mit der Option -C überschrieben werden.
Beispiel
# # Overall avrdude defaults # default_parallel = "/dev/parport0"; default_serial = "/dev/ttyS0"; default_programmer = "avrisp2";
Avrdude hat in einigen Versionen einen Bug beim Lesen und Schreiben des Efuse-Byte beim ATmega168. Der Fehler wurde 2005 anscheinend schon einmal behoben, hat sich in einer späteren Version aber wohl wieder eingeschlichen. Der Bug befindet sich in der Datei avrdude.conf. Unter Linux findet man die Datei unter /usr/local/etc/avrdude.conf oder /etc/avrdude.conf.
In dieser Datei sucht man nach dem Bereich für die ATmega168 Definitionen
#------------------------------------------------------------ # ATmega168 #------------------------------------------------------------
Dort sucht man nach
memory "efuse"
size = 1;
min_write_delay = 4500;
max_write_delay = 4500;
read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
"x x x x x x x x x x x x x o o o";
write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
"x x x x x x x x x x x x x i i i";
;
Der Bereich wird durch das ersetzt
memory "efuse"
size = 1;
min_write_delay = 4500;
max_write_delay = 4500;
read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
"x x x x x x x x o o o o o o o o";
write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
"x x x x x x x x i i i i i i i i";
;
Um die aktuelle Version von avrdude selbst compilieren zu können muss man vorher einige Pakete installieren. Das macht man am einfachsten direkt mit folgendem Befehl
sudo apt-get install subversion bison flex automake libusb-dev
Anschließend läd man die aktuellen Sourcen herunter.
svn co svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude
Danach wechselt man in das erstellte Verzeichnis. Um avrdude nun zu erstellen muss man folgende Befehle eingeben
sh bootstrap ./configure make sudo make install
Besitzt man eine CPU mit mehreren Kernen kann man statt make den Befehl make -j3 verwenden. Hat man noch mehr Kerne probiert als Parameter -j(Anzahl der Kerne +1). Dies beschleunigt den Compiliervorgang erheblich.
Deinstallieren kann man avrdude mit
sudo make uninstall
Diskussion