Atmel AVR Mikrocontroller mit OpenSuse: Tools

Man kann unter Linux und unter Windows Code für den AVR entwickeln. In meinen Texten ist das Linux-Umfeld beschrieben. Man kann zahlreiche Entwicklungsumgebungen und Tools verwenden, hier beschreibe ich meine Umgebung. Benötigt werden die folgenden Tools:

  • avr-gcc (Cross Compiler für C, erzeugt AVR Code). Dieser Compiler nutzt die avr-libc, eine libc-Implementierung für die AVR Plattform.
  • Eclipse (integrierte Entwicklungsumgebung) mit CDT (C/C++ Development Plugins) und AVR-Eclipse Plugin
  • avrdude (Kommandozeilentool für Code-Upload auf den Mikrocontroller, bedient ISP-Schnittstelle des Controllers, damit werden also die erzeugten Programme in den Controller geladen) und/oder Ponyprog (mit graphischer Oberfläche)

Die Installation der Tools unter OpenSuse geht einfach via Yast. In älteren Versionen war die avr-gcc Toolchain für AVRs im Hauptrepository vorhanden, mittlerweile muss man das AVR-Repository per Hand hinzufügen (YaST -> Software Repositories), zu finden für die jeweiligen Versionen unter:

http://download.opensuse.org/repositories/CrossToolchain:/avr/

die Repos-URL für OpenSuse 12.1 ist z.B.

http://download.opensuse.org/repositories/CrossToolchain:/avr/openSUSE_12.1/

Alle genannten Tools können nach Hinzufügen dieser Repositories einfach installiert werden. Nur Ponyprog (das es für Windows und Linux gibt) habe ich direkt von dessen Homepage (http://www.lancos.com/) geladen. Unter http://www.mikrocontroller.net/articles/AVR_Eclipse ist die Installation für verschiedene andere Linuxe beschrieben.

Vorgehen bei der Entwicklung

Der C-Code wird mit Eclipse erzeugt. avr-gcc führt das Cross-Compiling für die AVR-Plattform durch und erzeugt alle benötigten Dateien. Der eigentliche Code -als .hex-Datei- wird dann mittels avrdude oder Ponyprog über die ISP-Schnittstelle des AVRs in den AVR hineingeladen (ISP=In System Programming). Es gibt zahlreiche Möglichkeiten den Controller an den PC anzubinden (seriell, parallel, USB, …). Ich habe mir ein serielles Kabel gelötet, das war am einfachsten.

Code compiliert nicht? Für neueren Source-Code kann es notwendig sein, dass man eine aktuellere Version der avr-libc verwenden muss. Diese steht u.U. nicht als RPM o.ä. zur Verfügung, weil zu neu. Ein Vorgehen, wie das unter OpenSuse funktioniert, habe ich hier beschrieben.

Erstellen und Compilieren des Programms

Die Erstellung der C Source erfolgt mit dem Editor innerhalb von Eclipse. Mit diesem Tool kann unter Project die Compilierung mittels ‚make‘ direkt angestoßen werden („Build Project“), Ergebnis ist ein oder zwei HEX (.hex) Files. Eines geht in den Flash-Speicher, eines in den EEPROM-Speicher des Controllers. Nicht immer wird ein EEPROM-Teil benötigt.

AVR programmierung mit Eclipse
Erstellung des Codes für den AVR. Aus der C Source test.c wird die Hex-Datei flash.hex erzeugt.

Laden des Programms in den Controller

Eclipse legt alle Dateien in einem Workspace ab. Innerhalb des Workspaces erfolgt die Organisation nach Projekten. Hier ein Listing für mein erstes Testprojekt:

soc:/home/dennis/avr-eclipse-ws/avrtest000/Standard # ls -l
 insgesamt 48
 -rwxr-xr-x 1 dennis users 5892 28. Nov 21:50 avrtest000.elf
 -rw-r--r-- 1 dennis users   13 28. Nov 21:50 eeprom.hex
 -rw-r--r-- 1 dennis users  414 28. Nov 21:50 flash.hex
 -rw-r--r-- 1 dennis users 1028 28. Nov 21:50 makefile
 -rw-r--r-- 1 dennis users 9295 28. Nov 21:50 .map
 -rw-r--r-- 1 dennis users  229 28. Nov 20:49 objects.mk
 -rw-r--r-- 1 dennis users  343 28. Nov 21:50 sources.mk
 -rw-r--r-- 1 dennis users  589 28. Nov 21:50 subdir.mk
 -rw-r--r-- 1 dennis users 3976 28. Nov 21:50 test.obj

Wenn innerhalb von Eclipse der avrdude richtig konfiguriert wird, kann mittels des Eclipse-Buttons  der Code direkt auf den Controller geladen werden. Für mein besonderes Kabel musste ich die Pinbelegung für avrdude erst richtig definiere. Dies erfolgt in der Datei /opt/cross/etc/avrdude.conf. ich habe folgendes eingefügt:

programmer
 id    = "pony";
 desc  = "serial port banging ponyprog cable by DD";
 type  = serbb;
 reset = ~3;
 sck   = 7;
 mosi  = 4;
 miso  = 8;
 ;

 

(Übrigens habe ich später gesehen, dass genau diese Konfiguration unter der Namen „ponyser“ schon existiert…)

Ein „händischer“ Test von avrdude kann noch ohne Eclipse, wie folgt erfolgen (testweises Auslesen des AVRs, hier für einen atmega32, wenn ISP über die serielle Schnittstelle /dev/ttyS0 erfolgt):

avrdude -v -p m32 -P /dev/ttyS0 -c pony -U flash:r:ttt.hex:i

Das Schreiben erfolgt mittels

avrdude -v -p m32 -P /dev/ttyS0 -c pony -U flash:w:led01.hex:i

Unter OpenSuse muss der Nutzer in der Gruppe „uucp“ sein, um auf die serielle Schnittstelle als Non-Root zuzugreifen. Auch ein einfaches „chmod 666 /dev/ttyS0“ half bei mir nicht, erst das Hinzufügen der Gruppe erlaubte das Ausführen von avrdude.

Wenn avrdude per Hand funktioniert, kann die avrdude-Einbindung in Eclipse korrekt eingestellt werden. In meinem Fall sieht das wie folgt aus:


Konfiguration des avrdude-Programms innerhalb der Eclipse Preferences: Öffnen der Preferences mittels rechter Maustaste auf dem Projekt im Project Explorer View von Eclipse. Zunächst muß der zu verwendende ISP-Programmer definiert werden.

Als nächstes wird die genutzte Hardware (AVR-Typ) und die Taktfrequenz des AVRs eingetragen. Der Taktfrequenzwert steht im Programm als Define (F_CPU) zur Verfügung.

Bei den Build Settings sicherstellen, dass alle notwendigen HEX-Files miterzeugt werden.

Danach können alle Aktionen mit dem AVR innerhalb von Eclipse durchgeführt werden.

Nutzung von ponyprog: Ponyprog ist ein tolles Programm, um „mal schnell“ auf den AVR zuzugreifen. Man muss keine Manpages lesen und in Foren suchen, und kann in wenigen Minuten einen ersten Upload machen. Ponyprog läuft unter Windows und Linux. Ponyprog muss vor der Nutzung korrekt konfiguriert (wie ist der Controller angebunden, Setup -> Interface Setup) und kalibriert werden (Setup -> Calibration).

Hier Bilder zum Setup:


Einstellen des Controller-Typs (AVR micro) und des AVR-Typs (ATmega32).

Einstellen des Zugangs zum AVR, bei mir seriell über /dev/ttyS0, was COM1 entspricht

Danach kann ein HEX-File in Ponyprog eingeladen werden(Open Device File) und auf den Controller überspielt werden (Write Device). Es wird immer der komplette Speicher (also z.B. 8 Kbyte beim ATMega8) übertragen, auch wenn das eigentliche Programm nur ein paar Bytes lang ist. Nach dem Schreiben findet noch ein Verify statt. Das Programm startet unmittelbar nach dem Verify.


Herunterlesen des Codes von einem AVR auf den PC.

Im Erfolgsfall wird die Anzahl der übertragenen Bytes ausgegeben

Das Einladen des kompletten Speichers dauert beim ATMega8 mit 12MHz ca. 40 Sekunden, beim ATMega32 kann es entsprechend länger dauern.

Nutzung eines USB Programmers von Atmel

Mangels serieller Schnittstellen an neueren PCs (besonders bei Notebooks) bietet sich eher die Nutzung eines solchen Programmers an.


Der AVR ISP mkII von Atmel

Das Innere des Programmers – wesentlich komplexer als der triviale serielle Programmer

Falls bei Nutzung des USB-Programmers der Programmer nicht gefunden wird, sind eventuell die Regelkn für den Zugriff auf USB nicht ausreichend. Dazu die Datei /etc/udev/rules.d/15-usbavr.rules neu anlegen und dort  hineinschreiben:

# Atmel AVR ISP mkII SUBSYSTEM==“usb“, SYSFS{idVendor}==“03eb“, SYSFS{idProduct}==“2104″, GROUP=“users“, MODE=“0660″

Austausch der vorhandenen avr-libc durch eine neuere Version

Falls man Quellcode aus dem Internet bezieht, kann es vorkommen, dass dieser mit neueren Versionen der avr-libc entwickelt wurde. Man merkt das daran, dass Funktionen vom Compiler und dem Linker als unbekannt gemeldet werden. Man kann dann versuchen, ein neueres Paket für seine Plattform zu installieren. Wenn man OpenSuse und Yast regelmäßig nutzt, hat man allerdings schon das neueste Paket für diese Plattform. Man kann dann aber die avr-libc selbst compilieren. Ich habe dies wie folgt gemacht:

  1. Download der neuesten avr-libc von http://www.nongnu.org/avr-libc/. Die Source findet man unter  http://download.savannah.gnu.org/releases/avr-libc/
  2. Compilieren der avr-libc. Hier kann man nach dem README und dem INSTALL vorgehen. Diesen Schritt würde ich als Non-Root machen, um zu verhindern, dass man sich mit falschen Parametern die vorhandene avr-libc zerschießt. Ich habe das configure-Kommando wie folgt aufgerufen:
    ./configure –build=`./config.guess` –host=avr –prefix=/home/dennis/avrlibc
    Damit wird die libc unterhalb meines Homeverzeichnisses gebaut.
  3. Statt einem „make install“ habe ich dann per Hand die beiden erzeugten Verzeichnisse (avr/include, avr/lib) in das Verzeichnis kopiert, in dem die alte Bibliothek liegt. Dies ist bei OpenSuse /opt/cross. Die dort vorhandenen Verzeichnisse avr/lib und avr/include habe ich vorher gesichert.
  4. Zum Schluss noch aus dem gesicherten lib-Verzeichnis die ldscripts in das neue lib-Verzeichnis kopieren:
    cp -a ./lib.orig/ldscripts ./lib

Danach sollte ein Kompileren wieder möglich sein und die neue Bibliothek wird benutzt.

OpenSuse 11.3 ohne avrlibc-Paket

Aus mir unbekannten Gründen ist die avrlibc in OpenSuse 11.3 nicht dabei. Wie weiter oben beschrieben kann diese aber relativ einfach nachinstalliert werden. Erst nach mehreren Versuchen habe ich eine libc-Version gefunden, die mit dem gcc 4.5, der in 11.3 als Cross Compiler dabei ist, auch kompilierbar ist. Dies ist die Version 1.6.7 (nicht gingen bei mir: 1.7.0, 1.6.5, 1.6.9)

Der compilierte Inhalt unterhalb von …/avr/include muß nach/lib64/gcc/avr/4.5/include, der von …/avr/lib  nach /lib64/gcc/avr/4.5/.
Danach lässt sich AVR Code compilieren und Linken.

Zurück zur Hauptseite