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!):
- Treiber für den USB-RS232-Adapter nicht vergessen!
- Apple Developer Tools (bei Mac OS X mitgeliefert).
- AVR-binutils
- AVR-gcc
- AVR-libc
- libusb
- AVRDUDE
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
- Für den einfachen RS232-Programmierer muss man bei AVRDUDE den „programmer type“ -c ponyser angeben, der Port ist etwas in der Art von -P /dev/tty.PL2303-1B1, abhängig vom benutzten USB-Port.
- Der USBtiny ist erst ab Version 5.5 in AVRDUDE integriert, der „programmer type“ ist dann als -c USBtiny, der Port mit -P usb anzugeben.
- USBtiny benötigt genau 12 MHz, eine andere Taktung ist nicht ohne weiteres möglich!
- Damit man den USB-Port bei AVRDUDE benutzen kann, muss man das Tool mit der libusb compilieren. Die Befehle oben sind schon entsprechend angegeben.
- Die gestrichelten Verbindungen sind optional, sie dienen dazu, den AVR in der Schaltung (zum Beispiel mit dem Minimal-Programmierer) neu flashen zu können.
- Der USB-Programmierer kann entweder über K2 selbst programmieren oder über K3 programmiert werden. Beide Anschlüsse gleichzeitig sollte man nicht beschalten!
- Auf LED1 und ihren Schutzwiderstand R8 kann man verzichten, man hat dann allerdings kein Feedback an der Schaltung, wann programmiert wird.
- Der Abblockkondensator C1 sollte möglichst nah am IC untergebracht und dann direkt mit Pin 10 und 20 verbunden werden, um seine entstörende Wirkung gut erbringen zu können.
- K1 und K2 unterscheiden sich von der üblichen AVR-ISP-Schnittstelle. Ich habe einen Pin für Vcc hinzugefügt. Natürlich könnte man diese Anschlüsse weglassen, man muss dann aber den zu flashenden AVR anderweitig mit Strom versorgen.
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.