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

Atmel AVR Mikrocontroller mit OpenSuse: Die Hardware

Die benötigte Hardware ist ein AVR Controller mit etwas zusätzlicher Beschaltung. Die kann man mutig selbst erstellen oder fertig kaufen. In den folgenden Abbildungen dargestellt sind drei Boards, ein einfaches, bei eBay fertig für ca. 15€ erstanden und ein komplexeres, von www.pollin.de für ebenfalls ca. 15€, zum Selbstaufbauen und schließlich ein fertig aufgebautes Board für ca. 50 Euro.

Für die ISP-Programmierung benötigt man ein RS232-Kabel, auf dem 1:1 die Anschlüsse 3,4,5,6,7,8,9 durchgeführt sind.

Anforderungen an den PC, mit dem die AVR-Programme erstellt werden, sind niedrig. Ein 600Mhz-Notebook ist dicke ausreichend. Unabdingbar ist die RS232-Schnittstelle, wenn seriell übertragen werden soll. Da man beim Herumbasteln theoretisch die RS232-Schnittstelle durch Fehlbeschaltung und Unachtsamkeit zerstören kann, sollte man zur Sicherheit nicht seinen besten Rechner für solche Hardware-Aktionen nutzen.

Der AVR Controller kommt mit einigen Milliampere Strom aus, so dass ein einfaches Steckernetzteil mit 9V Gleichspannung ausreicht. Ein komplettes einfaches AVR Board braucht auch nur einige Dutzend mA. Manchmal kann man auch Wechselspannung einspeisen, denn viele Boards besitzen eine eigene Gleichrichtung und Stabilisierung. Vorübergehend langt sogar eine 9V-Batterie.


Einfaches AVR-Board mit ATmega8. 4 Schalter und 8 Dioden dienen als Input- und Output-„Geräte“. Oben links wird die Stromversorgung angeschlossen, in der Mitte oben erkennt man den RESET-Taster. Das ISP-Programmierkabel ist oben rechts angeschlossen. Auf der mittleren braunen Buchsenleiste sind die IO-Pins des Controllers nach außen geführt.

Das Pollin Board ( http://www.pollin.de). On-Board sind die RS232-Umsetzung für die ISP-Programmierung, so dass oben links direkt der Computer angeschlossen werden kann. Unten links ist ein eigenständiger RS232-Anschluss vorhanden. Das Board erlaubt, diverse Typen der AVR-Controller (ATMega, ATtiny) in die Fassungen einzusetzen. Drei Taster und zwei LEDs sind die On-board I/O-Geräte. Ein Steckplatz für ein EEPROM 24Cxx ist vorhanden, des weiteren zwei Steckplätze für ISP und JTAG Programmierung und auf der 40-poligen Steckerleiste sind zahlreiche Pins der Controller herausgeführt. 2 Jumperleisten erlauben die flexible Anpassung des Boards. Dieses Board gibt es mittlerweile in mehreren Varianten und es gibt auch Erweiterungsboards dazu.

Das LAB-MEGA Board von Rakers (http://www.rakers.de) Dieses Board ist mit SMD-Elementen aufgebaut und besitzt daher geringe Abmessungen. Es nutzt den ATmega128, der satte 53 I/O Pins und 128KB Flash Speicher bietet. Auf der Karte findet sich neben den „üblichen“ Dingen wie Spannungsversorgung, ISP/JTAG Interfaces auch eine USB Schnittstelle, ein I2C Expander, eine Echtzeituhr (PCF8583) sowie 2 RS232 Interfaces. Zahlreiche Pins sind auf einer 64-poligen Messerleiste VC64 herausgeführt. Die SMD Bauweise erschwert (ohne geeignetes Werkzeug) leider das Auswechseln defekter Bauteile und auch die Fehlersuche. Zu diesem Board gibt es Erweiterungsboards von Rakers.

ISP-Adapter

Es gibt unterschiedliche Adapter, für RS232, Parallel, USB, …

Serieller ISP-Adapter

Ich verwende einen selbstgebastelten. Bauanleitungen dazu gibt es zahlreich im Internet. Mein Adapter passt z.B. direkt an obiges Pollin-Board.


ISP-Adapter Schaltplan.

Die Schaltung passt komplett auf einer passend gemachten Lochrasterplatine
in einen RS232-Stecker hinein. Hier ist der Stecker ohne Gehäuse dargestellt.

Es gibt übrigens auch Boards mit einer 6-poligen Buchse statt der oben dargestellten 10-poligen. Dies gilt z.B. für das LAB-MEGA Board von Dr. Rakers.
Für solche Boards habe ich mir einen Adapter gelötet, der auf der einen Seite eine 10-polige Buchse und auf der anderen Seite einen 6-poligen Stecker hat.
Das Pin Mapping ist wie folgt:

10-polige Buchse (wie z.B. auf Pollin Board oder Ulrich Radigs Boards)  6-polige Buchse (z.B. Rakers LAB-MEGA)
9 – MISO 1
5 – /RESET 5
6 – GND 6
7 – SCK 3
1 – MOSI 4

Schließlichgibt es noch eine verwirrende Besonderheit beim ATmega128: Dort wird die ISP-Programmierung nicht über die auch vorhandenen Pins MOSI+MISO vorgenommen sondern über zwei „neue“ Pins namens PDI und PDO (nicht zu Verwechseln mit den Port-Pins PD1 und PD0 !!!).
Auch hier das Mapping:

ISP Pin Bezeichnung AT mega 128 Port-Pin am AT mega128
MOSI PDI PE0 (Port E, Pin 0)
MISO PDO PE1 (Port E, Pin 1)

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 RS232 Programmer

Falls bei Nutzung des USB-Programmers der Programmer nicht gefunden wird, sind eventuell die Regeln 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″

Kein serieller Port mehr am PC?

Die Nutzung der seriellen Schnittstelle für ISP-Programmierung ist ein sehr simpler Ansatz. RS232 kann auch zur bequemen Ausgabe z.B. von Fehlermeldungen, verwendet werden.

Leider haben viele neuere PCs keine serielle Schnittstelle mehr.
Manche Motherboards haben noch einen „seriellen Header“, der eine serielle Schnittstelle darstellt. Wenn man so etwas auf dem Motherboard hat, kann man sich einen Slot-Adapter kaufen und die Schnittstelle nutzen.

Wenn man nicht mal einen seriellen Header auf dem Mainboard hat, kann man einen USB<->Seriell-Adapter nutzen. Es gibt für unter 10 Euro Kabel, die als Adapter zwischen RS232 und USB dienen können. Unter Linux klinkt sich eine solches Kabel in den Gerätebaum z.B. als „/dev/ttyUSB0“ ein und kann dann genauso wie eine „echte“ serielle Schnittstelle genutzt werden.

Bei meinem OpenSuse 11.2 sieht die Einbindung (mittels dmesg ausgegeben) wie folgt aus:

 ...  [ 3529.694778] usbserial: USB Serial Driver core
 [ 3529.705376] USB Serial support registered for ch341-uart
 [ 3529.705409] ch341 6-1:1.0: ch341-uart converter detected
 [ 3529.718371] usb 6-1: ch341-uart converter now attached to ttyUSB0
 [ 3529.718650] usbcore: registered new interface driver ch341