www.mikrocontroller.net

AVR Eclipse

Dieser Artikel beschreibt erste Erfahrungen mit Eclipse und der AVR-Toolchain.

Inhaltsverzeichnis

[bearbeiten] Allgemeines zu Eclipse

Eclipse ist eine IDE, die sich alleine nicht zur Programmierung von C/C++ eignet. Dafür gibt es dann das Eclipse-Plugin CDT (auch von ECLIPSE.ORG). Die CDT erweitert Eclipse mit der Möglichkeit, C/C++ zu programmieren. Das aber erstmal nur mit dem GCC. Um jetzt die Toolchain AVR-GCC (WINAVR) einzubinden, benötigt man noch ein weiteres Plugin (CDT AVRGCC oder auch CDT AVR Plugin). Es ist auch möglich, ohne die beiden letzt genannten Plugins zu arbeiten, dann sind die Einstellungen für den GCC an AVR-GCC anzupassen (unkomfortabler).

[bearbeiten] Was muss installiert sein ?

[bearbeiten] Unter Windows XP (2000)

Die Installation/Anwendung unter Windows wird noch beschrieben. Die Anweisungen unten im Artikel beziehen sich auf Linux!

Achtung: Folgende Beschreibung für Eclipse + Plugin unter Windows beziehen sich auf veraltete Versionen von dem AVR Eclipse Plugin. Sie wird demnächst überarbeitet und sollte bis dahin nur als Hintergrundinformation verwendet werden.

[bearbeiten] Eclipse-IDE

Die 3 folgenden Links beziehen sich auf die vorletzte Version V3.2.1 von Eclipse. NICHT die Europe Version!

  • Eclipse-IDE V3.2.1 (V3.3 oder neuer habe ich nicht mit dem unten aufgeführten AVR Plugin getestet)
  • Eclipse-CDT-Plugin V3.1.2 (nicht V4 verwenden, läuft nicht mit Eclipse 3.2.1!)

Das zusätzliche Plugin ist notwendig zum Einbinden des AVR-GCC.

  • CDT AVRGCC Plugin V1.0.16 von Peter Winter (Forenbeitrag, kenne nur diese Quelle zum Download)

Ab hier folgen die Links zur aktuellen (09.02.2008) Eclipse Europe Version und dem dazu passenden AVR Plugin. Diese Versionen haben nichts mit den oben aufgeführten Versionen zu tun.

Das zusätzliche AVR Plugin ist notwendig zum Einbinden des AVR-GCC.

  • CDT AVRGCC Plugin bindet demnächst auch AVRDUDE mit ein und wird auch weiter gepflegt.
    Eine kleine Installationsanleitung gibt es bei tinkerlog.
    Ich arbeite persönlich seit einer Weile mit dem Plugin. Es funktioniert gut, hat noch ein paar kleine Bugs. Ein Link zum Beitrag der aktuellen Version AVR Eclipse Plugin 2.0.1 Released. Dieses Plugin bindet den AVR-GCC gut ein. Ich kann aus eigener Erfahrung berichten das der Author sehr bemüht ist, Hilfestellung zu geben, die Bugs zu beheben und auch neue Features einzubauen (z.B. AVRDUDE). Danke Thomas :-)

[bearbeiten] Compiler

  • WINAVR Version 20070525, AVR-GCC Compiler Toolchain, siehe auch Artikel WinAVR

[bearbeiten] Programmer / Debugger

Zum Debuggen kommt unter anderem AVaRICE zum Einsatz, mit dem man auch programmieren kann. Wahlweise ist auch AVRDUDE zum programmieren zu verwenden. Das kann man machen, wie man möchte. Beide Programme sind in WINAVR (siehe oben unter Compiler) enthalten.

[bearbeiten] Unter Linux: (Gentoo)

[bearbeiten] Eclipse-IDE

[bearbeiten] Compiler

  • emerge crossdev
  • crossdev --target avr
    • binutils-2.16.1-r2
    • gcc-3.4.6
    • avr-libc-[latest]

[bearbeiten] Programmer

  • emerge uisp

[bearbeiten] Unter Linux: (Debian)

[bearbeiten] Eclipse-IDE

[bearbeiten] Compiler

  • binutils-avr 2.15-3
  • gcc-avr 1:3.4.3-2
  • avr-libc 1:1.2.3-3

[bearbeiten] Debugger

  • simulavr 0.1.2.2-1
  • gdb-avr 6.3-2
  •  ? avra 0.7-1

[bearbeiten] Programmer

  • uisp 20050207
  •  ? avrp
  •  ? avrprog

[bearbeiten] Unter Linux: (Ubuntu 7.04)

[bearbeiten] Eclipse-IDE

[bearbeiten] Compiler

  • binutils-avr: 2.16.1-1
  • gcc-avr: 1:4.1.0-1
  • avr-libc: 1:3.4.3-2

[bearbeiten] Debugger

  • avr-gdb: 6.6; Nicht in den Repositories!
  • avarice: 2.5-1
  • simulavr: nicht getestet, sollte aber genauso funktionieren.

[bearbeiten] Programmer

  • avrdude: 5.2-2

[bearbeiten] Zusätzliche notwendige Programme/Libraries

  • gcc
  • binutils-avr
  • build-essential
  • ncurses-dev

[bearbeiten] Installation unter Ubuntu

[bearbeiten] AVR-Toolchain

Leider ist in den Repositories nur eine veraltete Version von avr-gdb (bzw. gdb-avr) enthalten. Diese Version hat bei mir zu Fehlern geführt. Deshalb wird die aktuelle Releaseversion 6.6 verwendet.

[bearbeiten] Schritt für Schritt

Als erstes werden die notwendigen Programme aus den Repositories installiert:

sudo apt-get install gcc gcc-avr avr-libc avrdude binutils-avr avarice build-essential ncurses-dev

Ubuntu 6.10:

sudo apt-get install gcc gcc-avr avr-libc avrdude binutils-avr avarice build-essential libncurses5-dev

Zusätzlich können auch noch folgende Packages interessant sein:

  • Simulavr: Ein Simulator für die AVR-Reihe
  • uisp: Alternativer Downloader
sudo apt-get install simulavr uisp

Jetzt kann man bereits das AVR-Target ansprechen, um z.B. die Fuses auszulesen:

avarice -j /dev/ttyUSB0 -P atmega128 -r
  • -j: Gibt das Gerät an, mit dem das Target verbunden ist.
  • -P: Zielarchitektur
  • -r: Read Fuses

Dazu ist die Manpage von avarice zu empfehlen:

man avarice

Als nächstes muss gdb-avr heruntergeladen und dann kompiliert werden:

wget ftp://ftp.gnu.org/gnu/gdb/gdb-6.6.tar.bz2
tar jxf gdb-6.6.tar.bz2
cd gdb-6.6
./configure --target=avr --prefix=/usr/local/avr
make
sudo make install
cd ..
rm -rf gdb-6.6

Dies installiert die aktuelle Version von gdb-avr unter /usr/local/avr. Diesen Pfad könnte man zur PATH-Variable hinzufügen, dies ist allerdings nicht zwingend notwendig.

[bearbeiten] Installation von Eclipse

Es sollte das Eclipse IDE for C/C++ Developers-Packet heruntergeladen und entpackt werden, da in diesem Packet bereits CDT vorinstalliert und keine (für diesen Einsatz) unnötigen Plugins installiert sind. Damit Eclipse für mehrere User zugänglich ist, sollte der entstandene Ordner nach /opt verschoben werden:

sudo mv eclipse /opt

Falls Eclipse langsam läuft oder Fehler hat, ist die Verwendung des propriertären Java-Packages von Sun einen Versuch wert.

sudo apt-get install sun-java6-jre

Falls danach noch immer gij statt java verwendet wird, muss in der Datei /etc/eclipse/java_home diese Zeile am Beginn eingefügt werden:

/usr/lib/jvm/java-6-sun
Stand von 2008.02.08:
sudo ln -s /usr/lib/jvm/java-6-sun /opt/eclipse/jre

Sollte die reguläre Installation auf Ubuntu 6.10 Amd-64 fehlschlagen (was bei mir der Fall war), kann die 32-Bit-Version mit der passenden Java Engine installiert werden:

sudo apt-get install ia32-sun-java6-bin
sudo update-alternatives --config java
#Folgende Frage mit [Enter] bestätigen (64-Bit-Version bleibt vorgabe).

# link für eclipse setzen
sudo ln -s /usr/lib/jvm/ia32-java-6-sun /opt/eclipse/jre

[bearbeiten] Alternative 1

Jetzt sollte das neueste AVR-Eclipse-plugin (20070813) heruntergeladen und installiert werden. Dazu muss das Packet entpackt und der Inhalt in den Ordner plugins im Eclipse-Ordner verschoben werden.

Zum Schluss muss noch, die avr-objsplit.bat-Datei, wie folgt, umgeschrieben, nach /usr/bin/avr-objsplit kopiert und ausführbar gemacht werden.

#!/bin/bash

avr-objcopy -j .text -j .data -O ihex *.elf flash.hex
avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex *.elf eeprom.hex
if [ ! -f eeprom.hex ]; then
        echo ":00000001FF" > eeprom.hex
fi

Ändern der Rechte:

chmod +x avr-objsplit

[bearbeiten] Einstellungen

Jetzt müssen noch gewisse Einstellungen in Eclipse angepasst werden: Unter Window->Preferences->AVRDUDE Preferences:

  • AVRDUDE executable: /usr/bin/avrdude
  • Programmer auswählen
  • Programmerport auswählen
  • Target MCU Type auswählen

[bearbeiten] Projekteinstellungen

Jetzt kann ein neues C-Project angelegt werden, wobei als Projekttyp "AVR Cross-Target Project" ausgewählt werden muss. Mittels den "Next"- und "Advanced"-Buttons kommt man zu den Projekteinstellungen, wobei folgendes einzustellen ist:

  • C/C++-Build->Settings->Tool settings->Compiler->Other Options:
    • MCU Type, Frequenz. Außerdem sollte "Generate Debugging Info" aktiviert werden.
  • C/C++-Build->Settings->Tool settings->Linker->Other Options:
    • MCU Type

Jetzt kann zum Punkt "Erster Test" gesprungen werden.

[bearbeiten] Alternative 2

Dabei werden die Projekteinstellungen eines Standard-C-Projekts so verändert, dass die AVR-Toolchain verwendet wird.

Mein erster erfolgreicher Versuch lief mit einen "managed C Projekt". Ich hoffe in der folgenden Beschreibung fehlt kein Schritt:

  • File / New / Managed Make C Project
    • Project Name "test2" [Next]
    • Project Type "Executable (GNU)" [Next]
    • C/C++ Indexer "full ..." [Finish] (hab ich später geändert siehe unten)

[bearbeiten] Projekteinstellungen

  • File / New / SourceFile
    • [Browse] "test2" [OK]
    • Source File: "test2.c" [Finish]
  • Project / Properties
    • C/C++ Build / ToolSettings
      • GCC-C-Compiler
        • Command: gcc ändern auf avr-gcc -mmcu=atmega16 -c
        • Das -c ist wichtig, damit nur kompliert aber nicht gelinkt wird.
        • Directorys Eintrag /usr/avr/include einfügen
        • Debugging gewünschten Wert einstellen (z.B. -g)
      • GCC-C-Linker
        • Command: gcc auch ändern auf avr-gcc -mmcu=atmega16
        • Libraries: Library Search Path= /usr/avr
        • Miscellaneous: Linker Flags = -Wl,-Map,avr.map
      • GCC Assembler
        • Command: as ändern auf avr-as
    • C/C++ Build / Build Steps
      • Post-Build-Step
        • Command: avr-objcopy -j .text -j .data -O ihex test2 test2.hex
    • C/C++ Indexer
      • Available Indexers = CTags Indexer (declarations only)
      • Include Files: Index Include paths einschalten

[bearbeiten] später eingefügt:

  • Project / Properties
    • C/C++ Build / Build Steps
      • Pre-Build-Step
        • Command: uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --erase
  • Project / Properties
    • C/C++ Build / Build Steps
      • Post-Build-Step
        • Command: avr_upload
  • Project / Properties
    • C/C++ Build / Build Settings
      • Build Output
        • Artifact Name: avr_main

avr_upload ist eine kleine Batchdatei im Verzeichniss /usr/bin , die ich neu angelegt hab:

#!/bin/sh
# .lst-Datei erzeugen (optional)
# avr-objdump -h -S avr_main > avr.lst
# Datei in Intel-hex erzeugen
avr-objcopy -j .text -j .data -O ihex avr_main avr.hex
# Intel-hex-Datei uploaden
#uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --upload if=avr.hex
# Intel-hex Datei uploaden und verifizieren.
uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --upload if=avr.hex --verify

[bearbeiten] Eclipse Plugin

Im Forum gibt es ein Plugin für Eclipse, das einen Großteil dieser Einstellungen bereits beinhaltet. Der Thread steht unter:

http://www.mikrocontroller.net/forum/read-2-229419.html#new

Das Plugin wird dort zum Download angeboten. Aber es ist sicher hilfreich die dortige Anleitung zu beachten.

http://www.mikrocontroller.net/attachment.php/285349/org.eclipse.cdt.avrgcc_1.0.16.zip

HINWEIS: Bitte die aktuelle Version benutzen. Folgende Warnung bezieht sich auf die älteren Versionen (vor Version 1.0.14). WARNUNG: Bei mir funktionierten Timer-Interrupts mit dem Plugin nicht (die jedoch tadellos mit der WinAVR Makefile funktionierten). Vielleicht habe ich nur eine Option übersehen, seid aber auf der Hut. Wenn ihr Unregelmäßigkeiten bei IRQs feststellt, versucht's erstmal ohne das Eclipse-Plugin (bevor ihr stundenlang an eurem Code und euch selbst zweifelt :-) ).

[bearbeiten] Erster Test

Die jeweiligen Alternativen beziehen sich auf die oben genannten verschiedenen Möglichkeiten.

[bearbeiten] Alternative 1

Wenn bereits ein Board zur Verfügung steht, ist es zu empfehlen, ein einfaches Programm zu schreiben, welches z.B. eine LED toggelt (siehe Alternative 2). Dieses Programm muss dann mittels Build Project kompiliert werden. Dann kann mittels AVR Target->download der AVR bespielt werden.

[bearbeiten] Alternative 2

Die folgenden Angaben beziehen sich auf ein sehr einfache Entwicklungsboard mit SPI-Anschluss über die serielle Schnittstelle. Bestückt wurde von mir nur die Spannungsversorgung, der SPI auf RS232 Teil zum Programmieren des Prozessors, Prozessor und Quarz, sowie einige Taster und LEDs. Den Schaltplan gibts als PDF hier.

[bearbeiten] Ziel: Eine LED soll blinken

Mein Test läuft auf einem ATMega16, der einen 8MHz-Quarz hat. Der Quarz wird aber nicht genutzt, weil bisher keine Fuses gesetzt sind. Die einzige verwendete LED ist an Port D (PD6) angeschlossen.

[bearbeiten] Das Kabel

Das Board hat eine 9-polige Buchse(Mama), der PC hat einen 9-poligen Stecker(Papa). Das Kabel muss somit direkt durchverbunden werden. Keines der Kabel wird gekreuzt. Am besten kauft man ein 9-polig beschaltetes "Verlängerungskabel" für die serielle Schnittstelle.

[bearbeiten] Prozessor erkennen

Zuerstmal wollte ich testen, ob mein selbstgelötetes Board auch funktioniert. Ohne Prozessor sind die 5 Volt da, und auch sonst keine "Rauchzeichen". Prozessor eingesetzt, und an den PC angeschlossen.

Unter Linux kann der Befehl uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --rd_fuses verwendet werden. Entscheidend ist die erste Zeile der Antwort. Da sollte stehen: Atmel AVR ATMega16 is found. Wenn nicht ??? --- Bei mir war einfach nur der Strom für das Board noch nicht wieder eingesteckt.

  • uisp = Programm zum Programmieren, Lesen und Löschen des AVR
  • -dprogr=dasa2 = Angabe der Pinbelegung der seriellen Schnittstelle. Je nach Hersteller des Programmierboards werden unterschiedliche Pinbelegungen verwendet. dasa2 ist die, die bei mir gepasst hat.
  • -dserial=/dev/ttyS0 = Ich verwende die Schnittstelle COM1(ttyS0). Wer COM2(ttyS1) verwendet, muss /dev/ttyS1 angeben.
  • -rd_fuses = lesen der FUSE-Bits

[bearbeiten] Prozessor löschen

  • uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --erase

[bearbeiten] Programm eintippen

(oder einfach von hier kopieren)

#include <avr/io.h>
  
#define running  1  

// Unterprogramm mit Zeitschleife fuer ATMega16 ohne Quarz
void delay_ms( unsigned int ms )
{
    unsigned int  i;
    unsigned int  j;
       
    for ( i = ms;  i;  i-- ) 
    {
        for ( j = 51;  j;  j-- )
        {
        }
    }    
}

int main( void )
{
    // PortD6 als Output konfigurieren
    DDRD |= _BV(PD6);

    // Hauptschleife des Programms
    while ( running )
    {
    	// LED einschalten, und dann warten
        PORTD |= _BV(PD6);
        delay_ms( 1000 ); 
        
    	// LED ausschalten, und dann warten
        PORTD &= ~_BV(PD6);
        delay_ms( 29000 );         
    }
}
Beim Speichern innerhalb Eclipse wird das Programm compiliert, und die Ausgabe sollte etwa wie folgt ausssehen:
**** Incremental build of configuration Debug for project AVR_Test ****

make -k -q main-build 
make -k pre-build main-build 
uisp -dprog=dasa2 -dserial=/dev/ttyS0 -dpart=atmega16 --erase
Atmel AVR ATmega16 is found.
Erasing device ...
Reinitializing device
Atmel AVR ATmega16 is found.
 
Building file: ../tests/test1.c
Invoking: GCC C Compiler
avr-gcc -mmcu=atmega16 -I/usr/avr -O0 -g -Wall -c -fmessage-length=0 -otests/test1.o ../tests/test1.c
Finished building: ../tests/test1.c
 
Building target: AVR_Test
Invoking: GCC C Linker
avr-gcc -mmcu=atmega16 -L/usr/avr -Wl,-Map,avr.map -oAVR_Test ./tests/test1.o
Finished building target: AVR_Test
 
make --no-print-directory post-build
avr_upload
Atmel AVR ATmega16 is found.
Uploading: flash
 
Build complete for project AVR_Test

Mit etwas Glück blinkt jetzt die LED.


[bearbeiten] Debugging

Debuggen funktioniert mit Eclipse entweder mit avarice oder simulavr, wobei ersteres zum OnDeviceDebugging dient und zweiteres einen Simulator darstellt. Zusätzlich ist avr-gdb notwendig, welches wie unter Installation unter Ubuntu beschrieben, installiert werden kann.

[bearbeiten] simulavr

simulavr -g -p 1212 -d atmega16 -P simulavr-disp

startet den Simulator.

[bearbeiten] avarice

avarice -j /dev/ttyS0 -P atmega128 :1212

startet einen Server, der auf Port 1212 lauscht und das OnDeviceDebugging übernimmt.

[bearbeiten] Eclipseeinstellungen

Unter Eclipse muss ein neues Debug-Target erzeugt werden, was in den Projekteinstellungen unter Run/Debug-Settings funktioniert. Es muss C/C++ application ausgewählt werden und folgende Einstellungen müssen geändert werden:

  • Debugger
    • gdbserver auswählen
    • GDB debugger: Pfad zu avr-gdb (/usr/local/avr/bin/avr-gdb)
    • verbose console mode einschalten
  • Connection
    • TCP, localhost, port 1212 (siehe simulavr/avarice-Aufruf).

Unter Debugger muss für die Verwendung des Simulators Command-Datei mit folgendem Inhalt angegeben und daher auch erstellt werden:

file link.elf
targ rem :1212
load

link.elf ist die Datei, welche durch den Build erstellt wird. Dies muss daher angepasst werden.

Beim On Device Debugging muss keine Command-Datei angegeben werden.

[bearbeiten] Auslesen von IO-Registern

Wenn verbose console mode eingeschaltet ist, kann in diesem Konsolenfenster direkt mit avr-gdb kommuniziert werden. Dadurch können unter anderem die Register ausgelesen werden:

p/x *(char *)Adresse

gibt den Wert der Adresse als char aus.

p/t *(char *)Adresse

returniert den Binärwert.

Die Adresse setzt sich aus einer Startadresse und einem Offset zusammen, wobei diese sich im entsprechenden io-Header der Architektur befindet. Beispielweise setzt sich die Adresse für das UCSR0B-Register eines Atmega128 aus der Startadresse 0x800020 und dem Offset 0x0A zusammen.

Für oft verwendete Register empfiehlt es sich, diesen mittels

set $name=(char *)Adresse

einen Namen zuzuweisen. Diese könnte man in einer Datei speichern und diese als command-Datei beim Debugger angeben, wodurch man sich diese händischen Eingaben spart und mittels

p/x *$name
bzw.
display *$name

zugegreifen kann.

[bearbeiten] Weiteres

Bei Problemen kann dieser Thread verwendet werden, in den ich, wann immer es sich bei mir ausgeht, schauen werde.

Jeder ist aufgerufen hier weiterzumachen, wenn er mehr weiss, oder es besser gestalten kann.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net