Motivation:
Um mit den Atmel-Microcontrollern zu experimentieren, habe ich mir
auf Empfehlung eines Kollegen hin das Atmel
Evaluations-Board (PDF bei Pollin
oder hier) von Pollin-Shop bestellt (14,95 Euro):

Das Schematic findet man im Pollin-PDF
(veraltet) oder eingescannt hier (dazu noch die Bauteil-Liste).
Der Bausatz ist als Experimentierboard für verschiedene
Atmel-µC gedacht und muss nach dem Auspacken erst noch von
Hand zusammengelötet werden. Unterstützt werden: ATmega
8/16/32/8535, ATtiny2313/12/15, 24xx-EEPROMS. Das reicht für
meine Zwecke vollkommen aus.
Da ich einen Atmel-µC mit 1xUART und mind. 2xPWM ins Auge
gefasst hatte, fiel die Wahl auf den ATtiny2313
(billig für 1,50 Euro, genügend Reserve-Interfaces) mit
2KB ISP-Flash. Auf der Atmel-Website findet man ein ausführliches Handbuch mit allen Details zum Microcontroller.
(Quelle: Wikimedia.org)
Programmierung:
Zur Programmierung (auch "Flashen" genannt) empfiehlt
Pollin in der Anleitung die proprietäre Software
"PonyProg", die entweder unter Windows oder
vor-compiliert für Redhat 7 als Download angeboten wird. Die
neuesten Sourcen konnte ich nicht fehlerfrei compilieren.
Auf der Suche nach Opensource-Tools für Linux bin ich bei Debian
Package Search auf das Tool avrp gestossen, das
aber, wie sich nach Lesen der man-Page und einen Test
herausstellte, nicht mit dem Evaluations-Board von Pollin
zusammenarbeitet, da dafür ein Atmel-Programmer notwendig
ist, bei dem mehr Elektronik zwischen Serial-Port und
Atmel-µC steckt.
Schließlich bin ich fündig geworden bei UISP - einer
universellen ISP-Programmer-Software für
Atmel-µC's. Der uisp unterstützt sowohl
Atmel-Programmer, als auch primitivere Programmer-Boards mit
Direktverdrahtung zwischen Serial-Port und Microcontroller, wie es
auf dem Pollin-Board der Fall ist.
Die Seriell/ISP-Verdrahtung auf dem Pollin-Board ist wie folgt:
RTS=SCK, ^TxD=Reset, DTR=Mosi, CTS=Miso. Laut
uisp-FAQ hat man mit
diesem "Wiring" die "Programming Method":
dasa2, d.h. den Parameter
-dprog=dasa2.
Da an meinem Laptop kein Seriell-Port vorhanden ist, nutze ich
einen USB-Serial-Adapter. Das Device für die serielle
Schnittstelle ist damit /dev/ttyUSB0. Für
uisp ist der "Target Device"-Parameter dann
-dserial=/dev/ttyUSB0.
Ein Löschen des Flash-Speichers auf dem Atmel-µC mit
uisp gibt dann beispielsweise folgenden Output:
akagisan@laptop:~/avr$ uisp -dprog=dasa2 -dpart=ATtiny2313 -dserial=/dev/ttyUSB0 --erase
Atmel AVR ATtiny2313 is found.
Erasing device ...
Reinitializing device
Atmel AVR ATtiny2313 is found.
Eigene Programme:
Für den avra-Assembler findet man Documentation
zur Atmel- Assemblersprache im "AVR
Assembler User Guide". Ausführliche Details zu den
Assemblerbefehlen findet man in dem PDF Document "AVR Instruction
Sets".
Als erstes habe ich für einen Test des Boards ein primitives
Assembler- Programm geschrieben, das die LED1 einschaltet: led1_on.asm Und dazu gleich noch ein
passendes Makefile: Makefile
Mit make wird aus dem led1_on.asm File durch avra
das hex-File led1_on.hex (im
Intel-Format) generiert, das mit dem uisp dann in den
Atmel-Flashspeicher geschrieben wird.
Der Aufruf make upload löscht dann zuerst den Flash-
Speicher mit dem oben gezeigten uisp --erase und schreibt
anschließend das Programm in den Atmel-Flash mit folgenden Parametern:
uisp -dprog=dasa2 -dserial=/dev/ttyUSB0 --upload --verify if=led1_on.hex
uisp-Problem:
Damit war es aber noch nicht getan. Ich bekam erstmal folgende
Fehlermeldung (hier mehr Debug-Meldungen mit Parameter
-v=3):
uisp -v=3 -dprog=dasa2 -dserial=/dev/ttyUSB0 --hash=1 --upload --verify if=led1_on.hex
Reset inactive time (t_reset) 1000 us
AVR Direct Parallel Access succeeded after 0 retries.
Vendor Code: 0x1e
Part Family: 0x91
Part Number: 0x0a
Atmel AVR ATtiny2313 is found.
Page Write Disabled
FLASH Write Delay (t_wd_flash): 11111 us
EEPROM Write Delay (t_wd_eeprom): 11111 us
Uploading: flash
#Error: Data polling readback status: write=0x12 read=0xff
If device was erased disable polling with the -dno-poll option.
make: *** [upload] Error 2
Was war los? Auch die Option -dno-poll half nicht,
sondern fabrizierte noch mehr
Fehlermeldungen. Bei einem Vergleich mit dem Output bei meinem
Kollegen, der das (ältere) Atmel-Board mit einem ATmega16
hatte, fiel die Zeile Page Write Disabled auf, wo bei
ihm Page Write Enabled, size=128 stand.
Google gab mir mit dem uisp-Bug #14040
einen weiteren Hinweis auf die (Flash) Page-Size in
uisp/src/Avr.C, die ich dann im ATtiny2313-Manual,
Seite 164 fand: 16 words, also 32 Byte. Also habe ich die
aktuellen uisp-Sources
geholt, die Pagesize vom ATtiny2313 in
uisp-20050207/src/Avr.C von 0 auf 32 geändert
(Patch hier: uisp-tn2313-pagesize.patch)
und den uisp neu compiliert und installiert. Dann endlich klappte
der Upload und ein Verify:
uisp -v=2 -dprog=dasa2 -dserial=/dev/ttyUSB0 --hash=1 --upload --verify if=led1_on.hex
AVR Direct Parallel Access succeeded after 0 retries.
Atmel AVR ATtiny2313 is found.
Uploading: flash
###########
(total 10 bytes transferred in 1.40 s (7 bytes/s)
Polling: count = 2, min/avg/max = 96.60/97.44/98.29 ms
Verifying: flash
###########
(total 10 bytes transferred in 1.02 s (10 bytes/s)
Die LED1 auf dem Atmel-Board leuchtete dann wie erwartet ;-)
Damit war nun endlich der Weg frei für weitere Projekte mit
dem Atmel-μC.
Links:
- Atmel AVR auf Wikipedia
- Mikrocontroller.net - deutsches Webportal mit Infos rund um Atmel-AVR
- Atmel AVR Tutorial zum Erlenen von Assembler
- Atmel AVR Infos wapedia
- Programmierung des Atmel AVR mit gcc auf Linuxfocus
- GNU Development Environment for the AVR Microcontroller
- AVR Libc Home Page
- AVR GCC Tutorial auf Mikrocontroller.net
- Artikel
über Atmel AVR im Linux Journal
zurück zur Übersicht
|