Dieser ArtikelBenutzerSuche |
AVR EclipseDieser Artikel beschreibt erste Erfahrungen mit Eclipse und der AVR-Toolchain.
[bearbeiten] Allgemeines zu EclipseEclipse 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-IDEDie 3 folgenden Links beziehen sich auf die vorletzte Version V3.2.1 von Eclipse. NICHT die Europe Version!
Das zusätzliche Plugin ist notwendig zum Einbinden des AVR-GCC.
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.
[bearbeiten] Compiler[bearbeiten] Programmer / DebuggerZum 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
[bearbeiten] Programmer
[bearbeiten] Unter Linux: (Debian)[bearbeiten] Eclipse-IDE
[bearbeiten] Compiler
[bearbeiten] Debugger
[bearbeiten] Programmer
[bearbeiten] Unter Linux: (Ubuntu 7.04)[bearbeiten] Eclipse-IDE
[bearbeiten] Compiler
[bearbeiten] Debugger
[bearbeiten] Programmer
[bearbeiten] Zusätzliche notwendige Programme/Libraries
[bearbeiten] Installation unter Ubuntu[bearbeiten] AVR-ToolchainLeider 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 SchrittAls 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:
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
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 EclipseEs 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-sunStand 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 1Jetzt 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] EinstellungenJetzt müssen noch gewisse Einstellungen in Eclipse angepasst werden: Unter Window->Preferences->AVRDUDE Preferences:
[bearbeiten] ProjekteinstellungenJetzt 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:
Jetzt kann zum Punkt "Erster Test" gesprungen werden. [bearbeiten] Alternative 2Dabei 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:
[bearbeiten] Projekteinstellungen
[bearbeiten] später eingefügt:
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 PluginIm 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 TestDie jeweiligen Alternativen beziehen sich auf die oben genannten verschiedenen Möglichkeiten. [bearbeiten] Alternative 1Wenn 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 2Die 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 blinkenMein 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 KabelDas 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 erkennenZuerstmal 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.
[bearbeiten] Prozessor löschen
[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] DebuggingDebuggen 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] simulavrsimulavr -g -p 1212 -d atmega16 -P simulavr-disp startet den Simulator. [bearbeiten] avariceavarice -j /dev/ttyS0 -P atmega128 :1212 startet einen Server, der auf Port 1212 lauscht und das OnDeviceDebugging übernimmt. [bearbeiten] EclipseeinstellungenUnter 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:
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-RegisternWenn 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 *$namebzw. display *$name zugegreifen kann. [bearbeiten] WeiteresBei 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. |