Themen:

AVR, avr-gcc, CAN, CPLD, Elektronik, Mikrocontroller, MSP430, PIC, Roboter, Schaltungen, Sensoren, Software, Testboards

WinAVR (Tutorial)

Tags: avr-gcc
Stand: 5. Oktober 2006, 14:43
16 Kommentar(e)

Wer seine AVRs gerne in C programmieren möchte wird irgendwann über den avr-gcc Compiler stolpern. Er ist eine Portierung des Open Source Compilers gcc und somit mit allem Quelltexten verfügbar. Speziell für die Leute die Windows benutzen, gibt es ein Programmpaket welches den Einstieg sehr erleichtert: WinAVR. Darin ist alles enthalten was man für das Programmieren braucht: Compiler, Linker, avr-libc, sogar ein Editor (Programmers Notepad) ist vorhanden.

Die aktuellste Version bekommt man auf http://sourceforge.net/projects/winavr/. (Achtung, die Datei ist ca. 24 MB groß).

Der Compiler ist sehr leistungsfähig und braucht selbst den Vergleich mit käuflichen Compiler nicht zu scheuen.

Allgemeines

Wenn man ein neues Projekt beginnt, sollte man sich immer ein neues Verzeichnis anlegen. In dieses Verzeichnis kommen dann alle benötigten Dateien für dieses Projekt, also auch zum Beispiel das Makefile (wenn man denn eins benutzen will).

Installation von WinAVR

Die Installation ist denkbar einfach. Man startet die Installationsroutine, stellt den Zielordner ein und der Rest läuft automatisch ab. Auch das setzen der Umgebungsvariablen, welches man in den ersten Versionen des Compiler noch von Hand erledigen musste, wird von der Installationsroutine erledigt.

Makefile

Das Makefile dient allgemein zur Aktualisierung und Regenerierung von miteinander in Beziehung stehenden Dateien. Der Grundgedanke dabei ist, dass gewisse Dateien in Abhängigkeit zu anderen Dateien stehen. So hängen beispielsweise Objektdateien von Ihren jeweiligen Quellcode und Header-Dateien ab.
Ändert man jetzt eine Datei, so kann es passieren, dass dadurch wiederum andere Dateien sich ändern und neu compiliert werden müssen. Damit man sich darum nicht kümmern muss kann man einfach ein Makefile benutzten. Darin stehen dann die ganzen Kommandos und Optionen für den Compiler.

In dem Installationsverzeichnis von WinAVR findet sich in dem Ordner /sample ein Beispiel Makefile. Dies kann man entweder für seine Zwecke anpassen, oder aber den Makefile-Generator Mfile von Jörg Wunsch benutzen. Diesen kann man sich unter http://www.sax.de/~joerg/mfile/ herunterladen. In den aktuellen WinAVR Versionen ist dieser schon enthalten und es sollte auch ein entsprechender Link dorthin im Startordner angelegt worden sein.

Dort kann man jetzt einfach über das Menü die benötigten Optionen auswählen.

Einstellen

Hauptsächlich sollte man die Optionen Main file name und MCU type ändern. Wenn man das Programm später simulieren will (mit AVRStudio oder ähnlichem) sollte man außerdem bei das entsprechende Debug format auswählen. Will man später die in WinAVR enthaltene Programmiersoftware avrdude benutzen, sollte man außerdem noch die Optionen für Programmer und Port anpassen. Doch dazu später mehr. Per kann man dann die Datei unter dem Name “Makefile” in dem aktuellen Projekt Ordner abspeichern.

Programmers Notepad 2

Programmers Notepad

In dem WinAVR Programmpaket ist auch das Programm Programmers Notepad 2 enthalten. Dies ist ein einfacher Texteditor, der aber ein paar sehr nützliche Funktionen bietet (wie Snytax Highlighting, verschiedene Styles, die Möglichkeit Tools zu definieren usw.).

In der Grundinstallation sind schon vier Tools vordefiniert. Make All compiliert das Projekt zu dem die aktuell geöffnete Datei gehört, Make Clean löscht alle temporären Dateien die dabei entstehen wieder und Program überträgt das aktuelle Projekt auf den AVR (natürlich nur falls die entsprechenden Werte für Programmer und Port im Makefile gesetzt wurden und der AVR verbunden ist).

Programmers Notepad > Tools

Wer sich mit der Programmiersprache C noch nicht so gut auskennt, der sollte sich den C-Kurs von der Seite von Christian Schifferle anschauen (siehe Download Bereich).

Einige sehr gute Beispielprogramme findet man zum Beispiel unter:

Außerdem habe auch ich ein paar Beispiele erstellt:

Ein ganz einfaches Programm das ein kleines Lauflicht realisiert könnte zum Beispiel folgendermaßen aussehen:

C:
#include <avr/io.h>
#include <util/delay.h>

// Sollte normalerweise schon im Makefile definiert sein.
// In dem Fall hier einfach löschen.
#define F_CPU 7372800   

void ioinit(void);

// Hauptprogramm
int main(void) {
    unsigned char i;   

    ioinit();   
   
    // Endlosschleife
    while (1) {
        PORTB = i;
        i++;
       
        // Eine Sekunde warten
        _delay_ms(1000);
    }   

    return 0;
}

// Initialisierung
void ioinit(void)
{
    DDRB = 0xff;    // PortB als Ausgang deklarieren
    PORTB = 0x00;   // Ports auf LOW schalten
}

Simulieren des Programms mit dem AVR Studio

Um sehen ob das geschriebene Programm auch das macht was es soll, kann man das Programm vor den eigentlichen übertragen zum AVR simulieren lassen. Dafür bietet sich unter Windows das AVRStudio von Atmel an. Nach dem Starten sollte sich folgendes Fenster öffnen:

AVRStudio Startbildschirm

Dort klickt ihr auf und wählt dann in eurem Projektverzeichnis die .elf Datei aus. In dem folgenden Dialogfenster müsst ihr noch den verwendeten Controller einstellen und schon kann es losgehen.

AVRStudio > Auswählen des AVR Typs

Es sollte sich jetzt folgender Bildschirm zu sehen sein:

AVRStudio > Oberfläche

Dort kann man das Programm jetzt ablaufen lassen. Im rechten unteren Teil kann man sich die Variablen anzeigen lassen. Dies geht über einen Rechtsklick und . Das Programm kann man dann über die Buttons rechts oben starten.

AVRStudio > Simulator Optionen

Dann viel Spass beim Ausprobieren ;-) …

(ein kleiner Hinweis noch: Man sollte nicht versuchen irgendwelche Warteschleifen simulieren zu lassen. Selbst auf schnellen PCs dauert das sehr, sehr lange…)

Programmieren des AVRs

Die AVRs haben den großen Vorteil, dass sie sich sehr einfach in der Schaltung über eine sogenannte ISP-Schnittstelle programmieren lassen. So muss man nicht jedes mal die Prozessor ausbauen, sondern kann das sehr einfach über ein kleines Kabel machen (mindestens fünf Leitungen, meistens werden allerdings 10-Polige Flachbandkabel benutzt, siehe dazu auch das Kapitel AVR Programmieradapter, dort werden die gebräuchlichsten einmal vorgestellt).

Um den Controller dann zu programmieren bekommen gibt es mal wieder mehrere Möglichkeiten. Die einfachste ist das im WinAVR Packet enthaltene Programm avrdude zu benutzen. Diesen kann man ganz einfach über ein Tool im Editor (oder eben über die Kommandozeile) aufgerufen werden.

Allerdings muss man erst im Makefile den benutzten Programmieradapter einstellen. Häufig wird dazu ein Adapter für den Parallelport verwendet. Wenn man so einen Adapter lieber kaufen will, wird man zum Beispiel bei http://shop.mikrocontroller.net/ oder http://shop.embedit.de/ fündig (Es gibt natürlich auch noch viele andere Läden). Die Einstellungen dazu sehen dann im Makefile wie folgt aus:

AVRDUDE_PROGRAMMER = stk200
AVRDUDE_PORT = lpt1

Jetzt muss man nur noch das vorher definierte Tool aufrufen.

Um mit avrdude die Fusebits zu setzen muss man direkt die Hex-Werte angeben. Diese kann man sich entweder aus dem Datenblatt suchen, oder den AVR Fusebit Generator nutzen.

Ein weiteres Tool, das häufig benutzt wird, ist das Freeware Programm PonyProg. Die Einstellung der Fuses kann verwirrend sein, da eine 0 im Datenblatt (programmiert) einem gesetzten Häkchen bei PonyProg entspricht, eine 1 im Datenblatt bedeutet dann KEIN Häkchen in PonyProg (unprogrammiert).

PonyProg

PonyProg kann man von der Seite kostenlos herunterladen. Es gibt auch eine deutsche Version des Programms. Dazu muss man sich die deutsche PonyProg2000.exe Datei herunterladen und in das Installationsverzeichnis kopieren (die ursprüngliche Datei muss dabei überschrieben werden).

Bevor es losgehen kann muss man allerdings noch eine Kalibrierungsroutine ausführen und den verwendeten Programmieradapter einstellen. Wenn dann der Controller eingestellt ist kann man mit einem klick auf “write Device” das Programm in den Controller laden.

Programmieren der AVRs mit PonyProg

Um PonyProg aus dem Makefile heraus aufzurufen muss man dort noch die folgenden Zeilen eintragen (vorher natürlich an die Pfade anpassen):

# make pony = Download the hex file to the device, using Ponyprog.
# Please set Path to Ponyprog below first!
# customize the Ponyprog settings using Ponyprog.
# Programming support using PonyProg

PONYEXE = C:\Programme\PonyProg2000\PONYPROG2000.EXE

pony: $(TARGET).hex $(TARGET).eep
    echo -e "SELECTDEVICE $(MCU)\nLOAD-PROG $(TARGET).hex\nLOAD-DATA $(TARGET).eep\nWRITE&VERIFY-ALL" >isp.e2s

$(PONYEXE) isp.e2s

Vor dem echo -e (...) muss ein <TAB> stehen, ansonsten erkennt make den Befehl nicht richtig. Ist alles richtig eingestellt kann man dann mit dem Kommando “make pony” in der Kommandozeile (oder per Tool im Programmers Notepad) den AVR mit Pony Prog programmieren lassen.

Das Ganze ist allerdings nur sinnvoll wenn man einen Programmer verwendet den avrdude nicht unterstützt. Ansonsten sollte avrdude das Programm der Wahl sein.

Zum Anfang

Kommentare

# Flo meinte am 21. November 2006, 11:47 dazu:

Danke für das tolle Tutorium!!

MfG, Flo

PS: der Link http://homepage.sunrise.ch/mysunrise/pfleury/avr-software.html scheint kaputt zu sein.

# Fabian Greif meinte am 22. November 2006, 00:35 dazu:

Hab den Link korrigiert, die aktuelle Adresse scheint http://homepage.hispeed.ch/peterfleury/avr-software.html zu sein.

# steffen meinte am 29. November 2006, 12:42 dazu:

um volle funktion des Beispielprogramms "Lauflicht" zu gewährleisten sollte die Zeile void init(void); in void ioinit(void); geändert werden

# Dirk E. meinte am 12. Januar 2007, 10:00 dazu:

Ein tolles Tutorial, hat mir sehr geholfen. Wollte nur noch auf zwei drei Sachen hinweisen, da ich Probleme hatte aus avrdude über lpt zu brennen. Folgende Stolpersteine haben sich mir noch in den Weg gelegt:

  1. Die Datei C:\Programme\WinAVR\bin\giveio.sys musste noch installiert werden, damit man mit avrdude die Parallelschnittstelle ansprechen kann. Am einfachsten geht das mit dem batchscript C:\Programme\WinAVR\bin\install_giveio.bat.

  2. In meinem BIOS stand der die Parallelschnittstelle auf Bidirektional. Avrdude benötigt aber ECP/EPP.

  3. Ich habe im Makefile den LPT Port 1 eingestellt, aber die Adresse im BIOS ist 0x3BC und somit musste ich LPT3 einstellen da Avrdude die Adressen wie folgt verdrahtet hat.

lpt1 0x378 lpt2 0x278 lpt3 0x3BC

Ich hoffe die Hinweise können noch anderen helfen.

Freue mich schon auf neue Codeschnipsel und Tutorials. Weiter so! Gruss Dirk

# Michael meinte am 4. Februar 2007, 01:58 dazu:

Super Tutorial, ist wirklich sehr gut für den allerersten Einstig.

Die Hinweise von Dirk bezgl. avrdude sind auch sehr hilfreich, Dank auch dafür.

Gruß

# Heinz Coenen meinte am 7. Februar 2007, 17:56 dazu:

Die Beschreibung ist ok. In der englischen Fassung steht: ?Don?t create a new project-just open the count.cof file?. Das funktionierte nicht. Mit der xyz.elf- Datei ging es ohne Probleme.

# Matthiasnf meinte am 24. Februar 2007, 15:17 dazu:

bei mir geht leider gar nichts. Ich habe die entsprechenden Programme installiert, kann auch im AVR STudio Assembler Programme schreiben und sie auf mein STK500 übertragen. Nur C-Programme lassen sich nicht im AVR STudio öffnen und ausserdem sagt mein Programmers Notepad: make.exe: *** No rule to make target `all?.
selbst bei primitivsten Programmen, die ich aus dem Netz gefischt habe. Mir fehlt wirklich der allererste Einstieg. Vielleicht hat jemand einen Tip. Danke Matthias

# Hauke Michelsen meinte am 26. Februar 2007, 14:23 dazu:

Hallo Matthiasnf ich bin auch neu mit GCC , den Fehler (no rule?) hat ich auch, da fehlt einfach das makefile welches in das Verzeichnis deiner Anwendung reinkopiert werden muss, dann geht es!

# Eugen meinte am 26. April 2007, 12:00 dazu:

Ein sehr gutes Tutorial. Das hat mir sehr geholfen. Allgemein ist die Seite www.kreatives-chaos.com einfach supper.

Danke!

# PeKa meinte am 20. Juni 2007, 12:21 dazu:

Hat mir sehr weitergeholfen, vielen dank!

Die .elf Datei öffnen bringt aber leider mein AVRStudio zum Absturz nachdem alles geladen wurde? : / Naja wird ja irgendwie schon noch klappen.

# Julian Emmert meinte am 25. September 2007, 19:20 dazu:

Hallo Leute, nachdem ich das ?no rule? Problem dank eurer Hilfe glöst habe, kommt danach: libusb0.dll not found reinstalling may help oder so ähnlich. Kann mir jemand bitte helfen?!

# Alois meinte am 1. Februar 2008, 12:15 dazu:

Zu LIB Usb Problem:
Es gab bei einigen WINAVR Versionen dieses Problem, das die Entwickler einen anderen Programieradapter verwendeten. Zur Lösung einfach zuerst eine ältere WINAVR Version installieren und danach deine WINAVR Version in das gleiche Verzeichnis installieren. Danach sind alle fehlenden dll´s dabei!

# Alois meinte am 1. Februar 2008, 12:17 dazu:

TIP zur AVRDUDE:
Ich verwende folgende Oberfläche (GUI) für den AVRDUDE: http://avr8-burn-o-mat.aaabbb.de/ Kann dieses Programm nur Empfehlen!

# Peter meinte am 9. Januar 2009, 22:47 dazu:

Super Tutorial. Vielen Dank!
Jedoch überspielt bei mir Ponyprog doppel so schnell wie AVR-Dude (Writing-Vorgang). Wie kann das sein? Danke!

# Fabian Greif meinte am 11. Januar 2009, 13:44 dazu:

Bei den einfachen Parallelport-Programmern ist das Begrenzende gar nicht die Zeit die der AVR zum Schreiben braucht sondern die Geschwindigkeit mit der die Daten zum AVR gesendet werden.
Da scheinen avrdude und PonyProg unterschiedliche Voreinstellungen zu haben. Mindestens bei avrdude kann man das aber einstellen. Bei PonyProg habe ich keine Ahnung, das habe ich seit mindestens 2 Jahren nicht mehr verwendet.

Allerdings kommt es bei solchen Programmern und zu hohen Geschwindigkeiten immer mal zu Übertragungsfehlern so dass man die Geschwindigkeit nicht beliebig hoch setzen kann.

# Fabian Greif meinte am 1. Februar 2009, 15:18 dazu:

Da anscheint Spam-Bots Interesse an diesem speziellen Artikel gefunden haben werde ich die Kommentare für den Artikel erstmal deaktivieren.