AVR-Programmierung unter Linux (mit USB-Seriell-Adapter)
Um mein Wissen zu erweitern habe ich vom IT-Seminar ein AVR Starter-Kit (STK500) und ein USB-Seriell-Adapter bekommen. Es werden allerdings ein paar Schritte benötigt, bevor man den AVR unter Linux programmieren kann. Die benötigten Schritte werden in diesem Tutorial erklärt.
Zuerst werden einige Pakete benötigt, die man sich installieren muss.
Unter Ubuntu bzw. Debian werden die folgenden Pakete benötigt (in anderen Distributionen weichen die Namen eventuell geringfügig ab):
gcc, gcc-avr, avr-libc, avrdude, binutils-avr, avarice, avarice-build-essential, libncurses5-dev
Unter Ubuntu bzw. Debian lassen sich die Programme mit dem folgenden Befehl installieren:
sudo apt-get install gcc gcc-avr avr-libc avrdude binutils-avr avarice avarice-build-essential libncurses5-dev
Anschließend muss man sich um das sogenannte Makefile kümmern. Hierfür könnt ihr mein Makefile benutzen, dass ich mit mfile.tcp erstellt und anschließend geringfügig abgeändert habe.
In diesem Makefile müsst ihr nun noch unter AVRDUDE_PORT eure Verbindung zum AVR-Controller einstellen. Wenn ihr das Board mit einem Seriellenkabel verbunden habt, solltet ihr ohne Probleme Hilfestellung bei Google finden. Solltet ihr, so wie ich, einen USB-Seriell-Adapter verwenden, dann müsst ihr als Port die richtige USB-Verbindung nehmen.
Da es etwas lästig ist, dauernd den Port von /dev/ttyUSB0 zu /dev/ttyUSB1 umzustellen, nur weil man das Board kurz ausgesteckt hat oder es vom Strom genommen hat, habe ich mir eine UDEV-Rule geschrieben, die immer einen Link auf /dev/avr erstellt, so dass man als Port nur /dev/avr angeben muss.
Das Anlegen einer solchen UDEV-Rule ist nicht sonderlich kompliziert. Zuerst müsst einige Daten über euren AVR herausfinden. Dafür gebt ihr folgenden Befehl in der Konsole ein:
sudo lsusb
Die Ausgabe sieht dann in etwa so aus:
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
Entscheidend ist bei meiner Ausgabe nur die 4. Zeile. Um noch genaueres über den AVR zu erfahren gebt ihr nun den Befehl
sudo lsusb -v | less
ein und geht so lange nach unten bis eine ähnliche Ausgabe wie die folgende erscheint:
Bus 002 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x067b Prolific Technology, Inc.
idProduct 0x2303 PL2303 Serial Port
bcdDevice 3.00
iManufacturer 1 Prolific Technology Inc.
iProduct 2 USB-Serial Controller
iSerial 0
bNumConfigurations 1
Aus dieser Ausgabe benötigt man nun die Zeile idProduct. Die idProduct (in meinem Fall 2303) wird nun für die UDEV-Rule benötigt.
Nun muss lediglich im Verzeichnis /etc/dev/rules.c eine Datei mit folgendem Inhalt als 01-avr.rules gespeichter werden.
# AVR
BUS=="usb", KERNEL=="ttyUSB?", SYSFS{idProduct}=="2303", SYMLINK+="avr"
Um zu Testen ob die UDEV-RULE funktioniert, muss man den Befehl
sudo /etc/init.d/udev reload
ausführen und anschließend das Board kurz aus und wieder einstecken. Wenn nun die Gerätedatei/dev/avr vorhanden ist hat alles geklappt.
Jetzt könnt ihr mit dem Programmieren beginnen. Wichtig ist nur, dass ihr das Programm als main.c abspeichert und sich im selben Ordner das Makefile befindet. Nun könnt ihr mit dem Befehl
make all
das Programm kompilieren. Der Befehl
make program
überträgt den Maschinencode auf das Board und der Befehl
make clean
reinigt das Verzeichnis anschließend von den kompilierten Dateien. Dieser Schritt wird vor erneutem Kompilieren benötigt.