Atmel-Evaluations-Board

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):
Atmel-Evaluations-Board
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.

ATtiny2313 (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:

  1. Atmel AVR auf Wikipedia
  2. Mikrocontroller.net - deutsches Webportal mit Infos rund um Atmel-AVR
  3. Atmel AVR Tutorial zum Erlenen von Assembler
  4. Atmel AVR Infos wapedia
  5. Programmierung des Atmel AVR mit gcc auf Linuxfocus
  6. GNU Development Environment for the AVR Microcontroller
  7. AVR Libc Home Page
  8. AVR GCC Tutorial auf Mikrocontroller.net
  9. Artikel über Atmel AVR im Linux Journal


Next: Das nächste Ziel war dann ein CLI (Command Line Interface) für die serielle Schnittstelle (USART).

zurück zur Übersicht