Inhaltsverzeichnis

Avrdude Tutorial

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.

Avrdude installieren und einrichten

Ubuntu/Debian und openSuse

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

Installieren

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

USB

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:

gksudo gedit /etc/udev/rules.d/80-usbprog.rules
kdesudo kate /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
ATTR{idVendor}=="03eb", ATTR{idProduct}=="2105", GROUP="plugdev", MODE="0660" # AVR ONE
ATTR{idVendor}=="03eb", ATTR{idProduct}=="210d", GROUP="plugdev", MODE="0660" # Atmel XPLAIN CDC Gateway 
ATTR{idVendor}=="03eb", ATTR{idProduct}=="2ffb", GROUP="plugdev", MODE="0660" #  AT90USB AVR DFU bootloader
ATTR{idVendor}=="1781", ATTR{idProduct}=="0c9f", GROUP="plugdev", MODE="0660" # adafruit usbtiny

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

Druckerport

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

Windows XP

Installation

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.

USB

Atmel Programmer

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.

Druckerport/Comport

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

Windows Vista

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

Parameter

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.

Beispiele für die wichtigsten Operationen

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.

Löschen

avrdude -pm8 -cavrisp2 -Pusb -e
Löscht Flash und Eeprom. Ist das EESAVE Fusebit programmiert wird das Eeprom nicht gelöscht.

Fusebits schreiben

avrdude -pm8 -cavrisp2 -Pusb -U hfuse:w:0xc9:m -U lfuse:w:0xff:m 
Mit dieser Anweisung werden die Fusebits CKSEL, SUT, CKOPT und WDTON eingestellt. Die Einstellungen mit dem AVR Fuse Calculator.

WICHTIG: Damit die Programmierung der Fusebits funktioniert muss das High Byte vor dem Low Byte angegeben werden. In umgekehrter Reihenfolge kommt es zu einem Fehler.

Fusebits lesen

avrdude -pm8 -cavrisp2 -Pusb -U lfuse:r:-:i
Diese 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

EEPROM schreiben

avrdude -pm8 -cavrisp2 -Pusb -U eeprom:w:in.eeprom
Schreib 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.

EEPROM lesen

avrdude -pm8 -cavrisp2 -Pusb -U eeprom:r:out.eeprom:d
Speichert den Inhalt des EEPROMs in die Datei out.eeprom im dezimalen Format ab.

Flash schreiben

avrdude -pm8 -cavrisp2 -Pusb -U flash:w:test.hex
Schreibt die Datei test.hex in das Flash.

Flash lesen

avrdude -pm8 -cavrisp2 -Pusb -U flash:r:test.hex:i
Der 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.

Seriennummer ermitteln

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"

ISP Clock ändern

(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.

Beispiele für verschiedene Programmer

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

STK200/Ponyprog

STK500

AVRISP mkII

Dieser Befehl löscht einen ATmega8

avrdude -pm8 -cavrisp2 -Pusb -e

MyAVR USB Programmer

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.

AVRprog Bootloader

Dieses Beispiel zeigt wie man den AVRprog Bootloader verwendet. In diesem Beispiel wurde der Bootloader mit 9600 Baud compiliert und es wird COM1 verwendet

Linux

avrdude -pm8 -cavr109 -b9600 -P/dev/ttyS0 -e

Windows

avrdude -pm8 -cavr109 -b9600 -Pcom1 -e

Konfigurationsdatei für avrdude

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";

Mega168 Efuse Bug

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";
    ;

avrdude compilieren

Ubuntu/Debian

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 gcc

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

cd avrdude
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