Programmieren mit dem MC-AVR8 und avrdude
Aus ConeleK-Wiki
Einleitung
Dieser Artikel beschreibt, wie man mit Hilfe des Mikrocontroller Modul ATmega8 MC-AVR8 und dem Kommandozeilenprogramm avrdude [2] ein eigenes Programm auf den Mikrocontroller übertragen kann.
Als Programmiergerät wird hier beispielhaft der AVRISPmkII [3] verwendet.
Hinweis: Die nun folgenden Schritte wurden auf einem frischen Kubuntu Maverick Meercat (10.10) und Kubuntu Oneiric Ocelot (11.10) getestet. Prinzipiell sollte sich der Ablauf für andere Unices nicht unterscheiden, wobei "sollte" bekanntlich ein sträfliches Wort ist, wenn man etwas nicht tatsächlich ausprobiert hat. :-)
Für Windows wurde dieses Vorgehen noch nicht getestet, aber es sollte... Sie wissen schon.
| Mikrocontroller Modul ATmega8 MC-AVR8 [1] | |||
Inhalt
Inhaltsverzeichnis |
Ziel
Das Ziel im Folgenden ist es, zunächst ein in Assembler geschriebenes Programm (in Form einer ASM-Datei) in Intel Hexcode zu übersetzen und diesen anschließend mittels AVRISP mkII auf den Mikrocontroller zu übertragen. Später folgt ein Abschnitt über das Compilieren und hoch laden von C-Programmen.
Dieses Vorgehen mag einem angesichts toller Entwicklungsumgebungen wie AVRStudio oder Eclipse als sehr rustikal und umständlich erscheinen, aber es ist der sicherste Weg, festzustellen, dass Sie über die richtige Basisinstallation für weitere Schritte verfügen.
Möchten Sie direkt in die Programmierung mit AVR Studio oder AVR Eclipse einsteigen, so verweisen wir auf die einschlägigen Artikel:
Die Anleitung wird immer (unrealistischer weise) von einem reibungslosen Ablauf der Installation ausgehen. Im Abschnitt Troubleshooting haben wir einige Fehler zusammengetragen, die uns begegnet sind. Zögern Sie bitte nicht, uns diese mitzuteilen [4]!
Anleitung/Tutorial für Assembler-Programme
Der folgende Ablauf besteht grob aus den folgenden Schritten:
- Benötigte Programme (Tools) installieren
- Quelltext verfassen
- Assemblieren
- Mikrocontroller aufbauen und anschließen
- Programm in den Mikrocontroller laden
Schritt 1: Die Software
Sie werden die folgende Software benötigen, die Sie mittels Paketmanagement direkt herunterladen und installieren können:
-
avra #Assembler für AVR Mikrocontroller
-
avrdude #Software zur Programmierung von Mikrocontrollern
Für Debian/Ubuntu/Kubuntu:
sudo apt-get install avra avrdude
Anschließend testen Sie, ob sich die Programme aus der Konsole heraus ansprechen lassen:
avra --version
ruediger@comp1lx:~$ avra --version AVRA: advanced AVR macro assembler Version 1.2.3 Build 1 (15. November 2007) Copyright (C) 1998-2007. Check out README file for more info .....
- und
avrdude -?ruediger@comp1lx:~$ avrdude -? ..... ..... avrdude version 5.10, URL: <http://savannah.nongnu.org/projects/avrdude/>
Beides Mal sollte eine Meldung wie oben in der Konsole erscheinen.
Sie sind jetzt im Besitz aller Software, die für diese Anwendung notwendig ist!
Schritt 2: Das Programm
Natürlich brauchen Sie noch ein Programm, welches Sie auf den Mikrocontroller laden können. Dazu empfiehlt sich das kleine Programm "Ledblink.asm", welches im Artikel AVR Assembler: LED blinkt näher vorgestellt wird.
Laden Sie sich den Quelltext und die Hilfsdatei herunter! (Wählen Sie Rechte Maustaste -> Ziel speichern unter..., um die Dateien herunterzuladen.)
Benennen Sie die Datei 'M8def.txt' in 'm8def.inc' (Exakte Schreibweise!) um - dies hat technische Gründe.
Schritt 3: Das Assemblieren
Wir werden in diesem Schritt aus dem Assembler-Quelltext das Intel Hexcode-Format erstellen, welches avrdude nutzen kann, um den Mikrocontroller zu programmieren.
Sie befinden sich in einem Konsolenfenster und das aktuelle Verzeichnis enthält die Dateien Ledblink.hex und m8def.inc.
Nun kommt der Moment der Wahrheit:
avra Ledblink.asmDie Ausgabe dieses Befehls sollte in den letzten vier Zeilen etwa so aussehen:
.... .... Used memory blocks: Code : Start = 0x0000, End = 0x0015, Length = 0x0016 Assembly complete with no errors. Segment usage: Code : 22 words (44 bytes) Data : 0 bytes EEPROM : 0 bytes
und im Verzeichnis sollten jetzt die Dateien Ledblink.hex (Flash-Abbild) und Ledblink.eep.hex (EEPROM-Abbild) liegen.
Mit diesen Dateien wird nun im nächsten Schritt der Mikrocontroller programmiert!
Anmerkung: Es existiert auch eine bereits assemblierte Fassung im Intel Hexcode-Format (Wählen Sie Rechte Maustaste -> Ziel speichern unter..., um die Dateien herunterzuladen). Hiermit kann gleich das Programm über den ISP-Programmer in den Mikrocontroller geladen werden.
Schritt 4: Mikrocontroller aufbauen
Bauen Sie nun den Mikrocontroller auf wie es in der Anleitung dafür beschrieben ist.
Der Mikrocontroller sollte mit Strom versorgt werden und das Programmiergerät muss sowohl am PC als auch am Mikrocontroller angeschlossen sein.
Anders als in den Anleitung beschrieben wird die LED nicht blinken, denn das Programm dazu wollen wir ja im nächsten Schritt erst selber hochladen!
Anmerkung: wenn Sie nicht das CEK-Modul mit dem ATmega8 verwenden wollen, können Sie sich auch selbst ein einfaches Minimalsystem wie im 2.Bild rechts aufbauen. Dies wird in diesem Artikel beschrieben.
Schritt 5: Programm hineinladen
Zunächst wechseln Sie in der Konsole in das Verzeichnis, in dem sie das Programm assembliert haben, in diesem Beispiel ~/downloads$. Diese solle folgenden Inhalt haben:
ruediger@comp1lx:~$ cd downloads/ ruediger@comp1lx:~/downloads$ ls -1
Ledblink.asm Ledblink.cof Ledblink.eep.hex Ledblink.hex Ledblink.obj m8def.inc
Sie starten die Übertragung vom PC zum Programmer / Mikrocontroller mit dem Befehl:
avrdude -c avrispmkII -P usb -p m8 -Uflash:w:Ledblink.hex:a -Ueeprom:w:Ledblink.eep.hex:a -Ulfuse:w:0xe1:m -Uhfuse:w:0xd9:m
Das Erste, was nun erscheint, sieht etwa so aus:
ruediger@comp1lx:~$ cd downloads/
ruediger@comp1lx:~/downloads$ avrdude -c avrispmkII -P usb -p m8 -Uflash:w:Ledblink.hex:a -Ueeprom:w:Ledblink.eep.hex:a -Ulfuse:w:0xe1:m -Uhfuse:w:0xd9:m
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "Ledblink.hex"
avrdude: input file Ledblink.hex auto detected as Intel Hex
avrdude: writing flash (44 bytes):
...
...
daraufhin wird Sie das Programm informieren, dass nacheinander flash, eeprom, lfuse und hfuse geschrieben ('write') und überprüft ('verify') werden.
Die LED sollte nun blinken.
Herzlichen Glückwunsch! Sie haben den ATmega8 programmiert! :) :)
Wenn dies nicht der Fall ist und die Ausgabe der Konsole folgendes enhält, ist etwas schief gelaufen:
ruediger@comp1lx:~$ avrdude -c avrisp2 -P usb -p m8 -Uflash:w:Ledblink.hex:a -Ueeprom:w:Ledblink.eep.hex:a -Ulfuse:w:0xe1:m -Uhfuse:w:0xd9:m avrdude: usb_open(): cannot read serial number "error sending control message: Operation not permitted" avrdude: usb_open(): cannot read product name "error sending control message: Operation not permitted" avrdude: usbdev_open(): error setting configuration 1: could not set config 1: Operation not permitted avrdude: usbdev_open(): did not find any USB device "usb"
Ein einfacher Test ist es, den obigen Befehl als root bzw. mit sudo auszuführen:
sudo avrdude -c avrisp2 -P usb -p m8 -Uflash:w:Ledblink.hex:a -Ueeprom:w:Ledblink.eep.hex:a -Ulfuse:w:0xe1:m -Uhfuse:w:0xd9:m
Wenn dies nicht zum Erfolg führt, gehen Sie zu Punkt Troubleshooting
Zusammenfassung
Hier ist nochmals der ganze Ablauf in wenigen Zeilen:
- avra und avrdude installieren
- Ledblink.asm und m8def.txt herunterladen und 'M8def.txt' in 'm8def.inc' umbenennen
- Assemblieren:
avra Ledblink.asm - Mikrocontroller aufbauen und Programmiergerät (z.B. AVR ISP mkII) anschließen
- Hochladen:
avrdude -c avrisp2 -P usb -p m8 -Uflash:w:Ledblink.hex:a -Ueeprom:w:Ledblink.eep.hex:a -Ulfuse:w:0xe1:m -Uhfuse:w:0xd9:m
Anleitung/Tutorial für C-Programme
- Benötigte Programme (Tools) installieren
- Quelltext verfassen
- Compilieren
- Mikrocontroller aufbauen und anschließen
- Programm in den Mikrocontroller laden
Schritt 1: Die Software
Sie werden die folgende Software benötigen, die Sie mittels Paketmanagement direkt herunterladen können:
-
avr-gcc -
avrdude -
avr-objcopy (im Paket binutils-avr)
Für Debian/Ubuntu/Kubuntu:
sudo apt-get install avr-gcc avrdude binutils-avr
Anschließend testen Sie, ob sich die Programme aus der Konsole heraus ansprechen lassen:
avr-gcc --version
ruediger@comp1lx:~$ avr-gcc --version avr-gcc (GCC) 4.5.3 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
avr-objcopy --version
ruediger@comp1lx:~$ avr-objcopy --version GNU objcopy (GNU Binutils) 2.20.1.20100303 Copyright 2009 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) any later version. This program has absolutely no warranty.
avrdude -?ruediger@comp1lx:~$ avrdude -? Usage: avrdude [options] Options: -p <partno> Required. Specify AVR device. -b <baudrate> Override RS-232 baud rate. -B <bitclock> Specify JTAG/STK500v2 bit clock period (us). ... ...
Die einzelnen Befehle sollten Ausgaben wie in den Beispielen oben ergeben. Wenn ja, ist die erforderliche Software nun installiert.
Schritt 2: Das Programm
Natürlich brauchen Sie noch ein Programm, welches Sie auf den Mikrocontroller laden können. Dazu empfiehlt sich das kleine Programm "Ledblinkc.c", welches im Artikel AVR C: LED blinkt näher vorgestellt wird.
Laden Sie sich den Quelltext herunter! (Wählen Sie Rechte Maustaste -> Ziel speichern unter..., um die Datei herunterzuladen.)
Schritt 3: Das Compilieren
Wir werden in diesem Schritt aus dem C-Quelltext zunächst eine sogenannte ELF-Datei (Executable and Linkable File) erstellen. Daraus lässt sich dann eine Datei im Intel Hexcode-Format gewinnten, welches avrdude nutzen kann, um den Mikrocontroller zu programmieren.
Sie befinden sich in einem Konsolenfenster und das aktuelle Verzeichnis enthält die Datei Ledblinkc.c.
Nun kommt der Moment der Wahrheit - kann man das Programm compilieren?
avr-gcc -O3 -Os -mmcu=atmega8 -o Ledblinkc.elf Ledblinkc.c
Es sollen nun keine Fehlermeldungen erscheinen und Ergebnis befindet sich nun die Datei Ledblinkc.elf im aktuellen Verzeichnis.
Als nächstes müssen wir das Programm noch in das richtige Format für das Programmiergerät bringen:
avr-objcopy -j .text -j .data -O ihex Ledblinkc.elf Ledblinkc.hex
Im Ordner liegt jetzt die Datei Ledblinkc.hex (Flash-Abbild). Diese kann man sich mit einem Texteditor anschauen:
:1000000012C024C023C022C021C020C01FC01EC0F7 :100010001DC01CC01BC01AC019C018C017C016C014 :1000200015C014C013C011241FBECFE5D4E0DEBF3D :10003000CDBF10E0A0E6B0E0E4E7F0E002C005903C :100040000D92A436B107D9F70CD012C0D9CF8FEFDB :1000500005C000009150E9F7815011F09FEFF9CFF2 :10006000089581E087BBC09AF2DFC098F0DFFBCF34 :04007000F894FFCF32 :04007400FFFF010089 :00000001FF
Mit diesen Dateien wird nun im nächsten Schritt der Mikrocontroller programmiert!
Anmerkung: Es existiert auch eine bereits kompilierte Fassung im Intel Hexcode-Format (Wählen Sie Rechte Maustaste -> Ziel speichern unter..., um die Dateien herunterzuladen.). Damit kann der Mikrocontroller programmiert werden, ohne dass man zuvor kompilieren muss.
Schritt 4: Mikrocontroller aufbauen
Bauen Sie nun den Mikrocontroller auf wie es in der Anleitung dafür beschrieben ist.
Der Mikrocontroller sollte mit Strom versorgt werden und das Programmiergerät muss sowohl am PC als auch am Mikrocontroller angeschlossen sein.
Anders als in den Anleitung beschrieben wird die LED nicht blinken, denn das Programm dazu wollen wir ja im nächsten Schritt erst selber hochladen!
Alternativ können Sie auch ein Mikrocontroller Minimalsystem mit ISP-Interface aufbauen.
Schritt 5: Programm hineinladen
In diesem Beispiel wird der ISP-Programmer AVRISPmkII verwendet. Sie starten die Übertragung vom Computer über den ISP-Prorammer mit dem Befehl:
avrdude -c avrispmkII -P usb -p m8 -Uflash:w:Ledblinkc.hex:a -Ulfuse:w:0xe1:m -Uhfuse:w:0xd9:m
Nun erscheint in der Konsole eine Ausgabe, wie folgende:
ruediger@comp1lx:~$ cd downloads/
ruediger@comp1lx:~/downloads$ avrdude -c avrispmkII -P usb -p m8 -Uflash:w:Ledblinkc.hex:a -Ulfuse:w:0xe1:m -Uhfuse:w:0xd9:m
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "Ledblinkc.hex"
avrdude: input file Ledblinkc.hex auto detected as Intel Hex
avrdude: writing flash (120 bytes):
.....
.....
daraufhin wird Sie das Programm informieren, dass nacheinander flash, lfuse und hfuse geschrieben ('write') und überprüft ('verify') werden.
Die LED sollte nun blinken.
Herzlichen Glückwunsch! Sie haben den ATmega8 programmiert! :):)d
Wenn es Fehlermeldungen gibt, gehen Sie zum Punkt Troubleshooting.
Zusammenfassung
Hier ist nochmals der ganze Ablauf in wenigen Zeilen:
- ,
avr-gccundavrdudeinstallierenavr-objcopy - Ledblinkc.c herunterladen
- Assemblieren:
avr-gcc -O3 -Os -mmcu=atmega8 -o Ledblinkc.elf Ledblinkc.c
- Umwandeln in Intel Hexcode:
avr-objcopy -j .text -j .data -O ihex Ledblinkc.elf Ledblinkc.hex
- Mikrocontroller aufbauen und Programmiergerät (z.B. AVR ISP mkII) anschließen
- Hochladen:
avrdude -c avrisp2 -P usb -p m8 -Uflash:w:Ledblinkc.hex:a -Ulfuse:w:0xe1:m -Uhfuse:w:0xd9:m
Tipps
- Wenn Sie gerne mit dem Quelltext "spielen", kann es lästig sein, die gesamte Befehlssequenz immer wieder einzutippen. Sie können hiefür das Linux-Skript nutzen, welches den gesamten Vorgang beinhaltet. Einfach mit dem Interpreter Ihrer Wahl (BASH, CSH,...) aufrufen:
bash Ledblinkc_create.sh
- Sie können das Skript auch für Ihre eigenen Programme verwenden: Ersetzen Sie in der Zeile program="Ledblinkc" einfach ledblinkc durch den Basisnamen (Dateinamen ohne Erweiterung) ihrer C-Datei.
Troubleshooting
Paket avra kann nicht gefunden werden
oder auch: "Paket avrdude kann nicht gefunden werden"
Die Programme liegen nicht in den registrierten Paketquellen ihrer Distribution. Im Allgemeinen sollte eine kurze Suche mit den Schlagwörtern "avra packet <distribution>" dazu führen, dass Sie erfahren, wo man die Programme erhält.
Kubuntu/Ubuntu
Ersetzen Sie in folgendem Befehl "maverick" durch den Codenamen ihres (K)Ubuntus:
sudo apt-add-repository "deb http://de.archive.ubuntu.com/ubuntu/ maverick universe"
Sie erhalten den Namen mittels:
cat /etc/lsb-release
Ledblink.asm(24) : Error : Cannot find include file: m8def.inc
Sie müssen zusätzlich zum eigentlichen Assemblerquelltext auch die Hilfsdatei herunterladen und in 'm8def.inc' (Exakte Schreibweise!) umbenennen.
avrdude: stk500v2_command(): command failed, unknown status 0xc9
Dieser Fehler kann unter anderem in folgenden Fällen auftreten:
- Sie haben die sogenannten Fusebits falsch konfiguriert. Mehr dazu im Aritkel Fuses ATmega8.
- Das Programmiergerät hat keinen Kontakt zum Mikrocontroller, da dieser bspw. nicht mit Strom versorgt wird.
avrdude: usbdev_open(): did not find any USB device "usb"
Dieser Fehler kann unter anderem in folgenden Fällen auftreten:
- Das Programmiergerät ist nicht an ihrem PC angeschlossen. Überprüfen Sie die USB-Stecker.
- Sie haben den falschen Gerätetyp ausgewählt. Die Liste der verfügbaren Gerätetypen erhalten sie mit
avrdude -c ?
- Ihr Programmiergerät ist nicht an den USB-Bus, sondern an eine andere Schnittstelle angebunden. In diesem Fall müssen Sie zunächst herausfinden, wie diese bezeichnet wird (üblicherweise sind alle verfügbaren seriellen Schnittstellen im Verzeichnis /dev/ zu finden). Danach muss die -P-Option entsprechend angepasst werden.
- Es kann unter Umständen sein, dass Sie keine Berechtigung besitzen, den Programmierer über USB anzusprechen. Dies kann auf älteren Linux-Systemen der Fall sein.
Überprüfen Sie zunächst mittels des Befehls
lsusbwelche Geräte vom PC erkannt wurden. Die Ausgabe müsste eine Zeile der folgenden Form enthalten:
Bus 007 Device 005: ID 03eb:2104 Atmel Corp. AVR ISP mkII
Ist dies der Fall und können Sie trotzdem nicht auf das Gerät zugreifen, dann hilft es in manchen Fällen wie folgt vorzugehen:
udev-Rechteproblem
Ein Grund für Ihr Problem kann sein, dass Linux Ihnen keine Berechtigung gibt, auf den USB-Bus zuzugreifen. Der Verantwortliche hierfür nennt sich udev - ein Dienst, der dafür zuständig ist, eingesteckte Geräte im laufenden Betrieb zu erkennen. Dies lässt sich beheben, indem sie wie folgt vorgehen:
- Erzeugen Sie eine neue(!) Datei /etc/udev/rules.d/90-atmega.rules.
- Fügen Sie die folgende Zeile in die Datei ein, wenn Sie als Benutzer zur Gruppe plugdev gehören:
SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2104", MODE="0660" , GROUP="plugdev" - Eine weitere Möglichkeit ist es, den Eintrag MODE="0660" durch den Eintrag GROUP=<eine-gruppe-in-der-Sie-Mitglied-sind> zu ersetzen oder ihn damit zu kombinieren:
SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2104", MODE="0660", GROUP="group"oderSUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2104", GROUP="group" - Nun müssen Sie noch den udev-Service neustarten. Unter neueren Ubuntu-Versionen geht dies wie folgt:. Bei anderen Varianten auch mittels
sudo service udev restartsudo /etc/init.d/udev restart
- Ziehen Sie das USB-Kabel vom Programmierer ab und stecken Sie es erneut in den PC.
Wichtig ist dabei, dass sie eventuell die hexadezimalen Zahlen 03eb bzw. 2104 durch die entsprechenden Werte aus dem lsusb-Befehl ersetzen.
AVRdude Kommandozeilen-Befehle
Die Konfigrurationsdatei für AVRdude : /etc/avrdude.conf
Erläuterung der Kommandozeilen-Befehle
Hier wird nun erklärt, wie sich die Befehle zum Programmieren des Mikrocontrollers zusammensetzten. ToDo
Beispiele Kommandozeilen-Befehle
In den Beispielen wird folgende HW verwendet:
- Programmer: AVRISP mkII
- Mikrocontroller ATmega8
- Betriebsystem Linux Kubuntu 11.10
Beispiele:
| Aktion | Befehl |
| Programmiergeräte unterstützte | avrdude -c? |
| unterstützte Mikrocontroller | avrdude -p? |
| löschen Mikrocontroller | avrdude -p m8 -c avrispmkII -P usb -e |
| auslesen Mikrocontroller | avrdude -p m8 -c avrispmkII -P usb -v |
| Programm laden | avrdude -c avrispmkII -P usb -p m8 -U flash:w:Ledblinkc.hex:a -U lfuse:w:0xe1:m -U hfuse:w:0xd9:m Filename: Ledblinkc.hex Fuse Byte Low: 0xe1 Fuse Byte High: 0xd9 |
Anmerkung: avrispmkII = avrisp2
Bezugsquellen
- AVRISP mkII [5]
- CEK-Mikrocontroller-Modul MC-AVR8 [6]
- Alles weitere, was man für eine komfortable Experimentierschaltung benötigt ist aufgelistet im Hauptartikel zum MC-AVR8