AVR-Entwicklung mit dem Mac

Vor kurzem habe ich mit der Entwicklung von Schaltungen rund um Mikrocontroller von Atmel begonnen. Die AVR-Serie der Firma umfasst diverse Typen von Mikrocontrollern, denen allen gemein ist, dass sie sehr leicht zu programmieren sind und beinahe alle ohne viel externe Bauteile auskommen. Kurz: Ideale Voraussetzungen für erste Schritte in dieser Richtung.

Hardware

Ich suche schon seit einiger Zeit nach einem Mikrocontroller, der ohne großen Aufwand vom Mac aus programmiert werden kann. Für die meisten Mikrocontroller werden Programmierschnittstellen angeboten, die jedoch oft einiges an Geld kosten (im Bereich ab 100€). Für viele der Mikrocontroller gibt es auch Selbstbaulösungen, die aber in der Regel auf dem zu programmierenden Prozessor basieren - wie schlau. Bei den AVR ist die Situation etwas anders: Die einfachste Programmierschnittstelle, die ich finden konnte, benötigt lediglich fünf Widerstände, einen Transistor, zwei Zenerdioden und eine 9polige Sub-D-Buchse für die RS232-Schnittstelle.

Die RS232 (oder auch „serielle Schnittstelle“, obwohl dazu z.B. auch USB zählen würde) ist dann gleich die erste Hürde, die man zu nehmen hat: Soweit ich weiß hatte noch kein Mac eine RS232-Schnittstelle von Haus aus dabei. Einige Jahre alte Macs haben zwar möglicherweise eine RS422-Schnittstelle, aber eine RS232 ist mir am Mac noch nicht direkt untergekommen. Zum Glück gibt es inzwischen sehr günstige USB-RS232-Adapter, die für den gewünschten Zweck geeignet sind. Ich habe mir bei einer Auktion im Internet einen dieser Adaptoren für etwa 6€ (zuzüglich nochmal 6€ für den Versand) bestellt und habe mit diesen, wenn man von der Geschwindigkeit des AVR-Programmierens absieht, keine Probleme. Man sollte lediglich darauf achten, dass der Adapter auf dem PL-2303 basiert, dann kann man den Open-Source-Treiber OS X PL2303 benutzen, der bei mir auch unter MacOS X 10.5 problemlos läuft.

Nachdem RS232 geklärt ist, kann man den ersten „Programmierer“ zusammenbauen. Das oben genannte Gerät mit den wenigen Bauteilen habe ich bei Scott-Falk Hühn gefunden. Hier eine Variante der Schaltung, so wie ich sie umgesetzt habe:

Wer etwas sucht, findet noch eine ganze Reihe ähnlicher serieller Programmierer im Internet, teilweise mit MAX232 zur Umsetzung der Pegel zwischen RS232 und AVR, teilweise sogar mit noch weniger Bauteilen. Bei mir hat sich das Interface von Scott-Falk Hühn jedenfalls als zuverlässig, aber leider auf Grund des USB-RS232-Adapters recht langsam erwiesen. Dazu weiter unten mehr.

Software

Nachdem der AVR nun mit dem Mac verbunden werden kann, müssen noch einige Programme installiert werden (Wer Angst vor dem Terminal hat, überlegt sich das mit dem AVR sowieso besser nochmal!):

Ich habe seit einiger Zeit ein Verzeichnis /dh/ in dem selbst compilierten Sachen einsortiert werden, das also gegebenenfalls nach eigenem Geschmack ändern. Wichtig ist aber, dass man die binutils und den gcc in ein gemeinsames Verzeichnis installieren sollte, da es sonst später Probleme geben kann. Woher diese kommen, habe ich nicht nachgeforscht, ich hab mich einfach an den Rat gehalten.

Treiber und Apple Developer Tools

Sowohl den USB-RS232-Adapter-Treiber als auch die Apple Developer Tools kann man einfach über die Installer-Pakete installieren, falls sie nicht sowieso schon installiert sind.

AVR Toolchain

Um AVR-Programme schreiben zu können, benötigt man mindestens den GCC (und für diesen die binutils) in einer AVR-Crosscompiler-Version. Wer nicht nur Assembler, sondern auch C benutzen will, sollte auch die AVR-libc übersetzen. Um die übersetzten Programme letztlich auf den Chip zu bringen, bietet sich das Tool AVRDUDE an. Zu finden sind die genannten Pakete unter (von mir verwendetet Version in Klammern):

Hier in aller Kürze die Befehle, die ich benutzt habe, um die Pakete zu bauen:

INSTDIR=/dh/opt/avr

# Alles entpacken
tar xjf binutils-2.18.tar.bz2
tar xjf gcc-core-4.2.2.tar.bz2
tar xjf avr-libc-1.6.1.tar.bz2
tar xzf libusb-0.1.12.tar.gz
tar xzf avrdude-5.5.tar.gz

# Objectverzeichnisse vorbereiten
mkdir avrdude-5.5-object
mkdir libusb-0.1.12-object
mkdir avr-libc-1.6.1-object
mkdir binutils-2.18-object
mkdir gcc-4.2.2-object

# Binutils bauen
cd binutils-2.18-object
../binutils-2.18/configure --prefix=$INSTDIR --target=avr
make
sudo make install
cd ..

# GCC bauen
cd gcc-4.2.2-object
../gcc-4.2.2/configure --prefix=$INSTDIR --target=avr --disable-nls --disable-libssp --with-dwarf2 --enable-languages=c
make
sudo make install
cd ..

# AVR-libc bauen
cd avr-libc-1.6.1-object
../avr-libc-1.6.1/configure --prefix=$INSTDIR --target=avr --build=`../avr-libc-1.6.1/config.guess` --host=avr
make
sudo make install
cd ..

# libusb bauen
cd libusb-0.1.12-object
../libusb-0.1.12/configure --prefix=$INSTDIR
make
sudo make install
cd ..
# AVRDUDE bauen (incl. libusb)
cd avrdude-5.5-object
LDFLAGS=-L$INSTDIR/lib CFLAGS=-I$INSTDIR/include CPPFLAGS=-I$INSTDIR/include ../avrdude-5.5/configure --prefix=$INSTDIR
make
sudo make install
cd ..

Wenn bis an diese Stelle alles geklappt hat, dann ist unter /dh/opt/avr/bin alles installiert, was man benötigt, um Programme für den AVR zu compilieren und um diese Programme auf den Chip zu übertragen. Der Pfad sollte also (z.B. in der bash mit export PATH="../../../dh/opt/avr/bin:$PATH") in den Suchpfad mit aufgenommen werden. Da die compilierten Programme alle den Prefix avr oder avr- haben, muss man sich wenig Gedanken machen, dass dadurch die schon vorhandenen Programme verdeckt würden.

USB-Programmierer

Mit dem einfachen Programmierer und den Tools lassen sich schon die ersten Programme auf den Chip bringen. Einfache Beispiele finden sich genug im Internet, zum Beispiel im AVR-GCC-Tutorial.

Allerdings, ich hatte es oben schon erwähnt, ist die Umsetzung von USB auf RS232 hier eine ziemliche Bremse. Am Linux-Rechner dauert das Programmieren von 2KB nur ein paar Sekunden, über den USB-RS232-Adapter aber gleich zwei Minuten. Wenn man den Umgang mit dem AVR noch lernen und vieles über Versuch & Irrtum herausfinden muss, dann ist das nicht erträglich. Aus diesem Grund habe ich den einfachen Programmierer recht schnell dazu benutzt, einen schnelleren USB-Programmierer auf Basis eines ATtiny zusammenzubauen. Also am besten gleich von Anfang an folgende Teile bereitlegen:

IC1 ATtiny2313
R1 Widerstand 22kΩ
R2 Widerstand 1,5kΩ
R3, R4 Widerstände zwischen 27Ω und 68Ω
R5, R6, R7 Widerstände mit 220Ω
R8 Widerstand 330Ω
C1 Kondensator 100nF
C2 Elektrolyt-Kondensator 10µF
C3, C4 Kondensatoren 27pF
D1, D2 Zenerdioden 3,6V
LED1 Leuchtdiode
Qz1 Quarz 12MHz
K1 USB-Kabel oder eine USB-B-Buchse
K2, K3 6-polige Buchsenleisten o.ä.

Das ganze habe ich nach folgendem Plan zusammengebaut:

Die Software (und auch die Vorlage, auf der obiger Schaltplan basiert) für den USBtiny findet sich bei Dick Streefland. Also noch einmal den RS232-Programmer anwerfen und geduldig warten. Nicht vergessen, die Fuses des ATtiny auf „externer Quarz/ohne Teiler“ (bei mir: lfuse auf 0xDF) zu stellen!

Wissenswert

Ausblick

Die AVR haben es mir angetan, ich werde dieser Prozessorfamilie sicher noch einige Zeit treu bleiben. Nicht zuletzt, da sie unter Mac OS X so gut unterstützt werden, wie kaum eine andere Reihe. Auch wenn dieser Artikel bewußt riesige Lücken hat, wenn es darum geht, wie die Schaltungen aufgebaut werden und was man mit den Schaltungen tun könnte, dem Ziel, einen Mikrocontroller vom Mac aus zu programmieren bringt er die eine oder andere Leserin hoffentlich näher.