Pfad:
Home =>
AVR-DE =>
cq-dl-Beiträge => Teil 2
cq-dl-Beiträge zu ATMEL-AVR-Mikrocontrollern
Teil II: Software von ATMEL-AVR-Mikrocontrollern
Weil AVR-Prozessoren für eine ganz bestimmte Hardware eingesetzt werden sollen,
ist die Software auf die Hardware-Umgebung eng anzupassen. Das setzt voraus,
dass die Software speziell für die gewählte Schaltung geschrieben wird.
Wer so hardware-nah noch nie programmiert hat, wird zu Beginn eine
größere Mühe haben, wenn er sich an die Programmierung erst langsam
gewöhnen muss.
Das wird auch kaum einfacher, wenn man statt der Assemblersprache in C
oder in Basic programmiert. Das hat zwar den Vorteil, dass man ein paar
Sprachelemente schon kennt, aber so richtig hardware-nah kommen Hochsprachen
nicht ran. Wer die Fähigkeiten optimal ausreizen will, sollte sich der Mühe
unterziehen, Assembler zu lernen. Mit den AVR ist das besonders
erleichtert, weil man den Prozessor in der Schaltung selbst erproben kann
und weil es einige einfache Werkzeuge gibt, die Abläufe auf dem Trockenen zu
testen.
Hier werden nur einige Grundbegriffe der Softwareentwicklung für AVRs behandelt.
Es gibt zahlreiche umfangreiche Hilfen, vom Buch bis zum Internet. Die werden
am Ende kurz besprochen. Wie das fertig assemblierte Programm in den Chip kommt,
erklärt der nächste Teil dieser Serie.
Assembler programmieren ist zunächst das Schreiben von reinem Text in eine reine
Textdatei. Die folgenden Zeilen versetzen die acht Anschlusspins von Port B
in einem AVR vom Typ AT90S2313 in den lesenden Zustand (alle Pins sind Eingänge)
und schalten 10k-Pull-Up-Widerstände an diese Eingänge. Beim Lesen sollten also
alle Eingänge eine logische Eins zeigen.
(=> Screenshot mit dem Beispielprogramm im AVR-Editor wavrasm
von ATMEL)
Dieser lesbare Text wird in einer Textdatei gespeichert. Er ist als solches
noch nicht brauchbar für den AVR. Erst nach dem Übersetzen mit einem Assembler
wird daraus ein maschinen-verständliches Programm, das in den Chip gefüttert
werden kann.
Als Editoren eignen sich sehr einfache Programme (z.B. Notepad für Windows oder
KWrite für Linux) oder spezielle Editoren wie der von ATMEL verfügbare
Assemblereditor wavrasm, der Editor im Studio von ATMEL bzw. der sehr schön
gestaltete AVR-Assembler-Editor von Tan Silliksaar. Spezielle Editoren für
AVR-Assembler erkennen z.B. die Instruktionen oder prüfen während der Eingabe
nach, ob ein Symbol schon definiert ist und färben die Wörter dann anders ein.
Auf diese Weise findet man schneller Schreibfehler (das sind ca. 95% der Fehler
in Assembler; die verbleibenden 5% sind Denkfehler und viel schwerer zu finden).
(=> Screenshot eines Programmes mit dem ATMEL Studio-Editor)
(=> Screenshot mit dem Beispielprogramm im AVR-Editor
von Tan Silliksar)
Der Text ist trotz der Erläuterungen, die immer mit einem Semikolon
beginnen, aber auch so kaum lesbar. Deshalb gibt es die Möglichkeit, statt der
hexadezimalen Zahlen und der Konstruktion R16 auch zu schreiben:
; Beispielprogramm in Assembler, leserlicher
;
; Definitionen
.EQU PORTB = $18
.EQU DDRB = $17
.EQU PINB = $16
.DEF MeinRegister = R16
; Programm
clr MeinRegister
out DDRB,MeinRegister
ser MeinRegister
out PORTB,MeinRegister
in MeinRegister,PINB
;
; Ende des leserlichen Programmes
Der Assembler versteht also Symbole. Symbole (PORTB) sind für Menschen etwas
leichter zu merken als Hexadezimalzahlen ($18). Allerdings muss dem
Assembler das alles erst mitgeteilt werden (mit .EQU), von selbst weiss er das
nicht. Dass PORTB die Ein- und Ausgabepins PB0 bis PB7 am AVR meint, muss der
hardwarenahe Programmierer erst mal wissen. Dass DDRB das Datenrichtungsregister
von Port B meint, auch. Wenn man dort Nullen (clr MeinRegister steht für
CLEAR und bedeutet, dass alle acht Bits im Register zu Null gesetzt werden)
hinschreibt, dann sind alle Ausgangstreiber an diesen Pins ausgeschaltet. Wenn
man dann noch Einsen nach PORTB schreibt (ser MeinRegister steht für
"SET Register" und setzt alle Bits im Register auf 1), sind die
Pull-Up-Widerstände eingeschaltet und ziehen die Eingänge auf logisch 1.
Wenn nun noch die Eingänge des Ports (PINB) eingelesen werden (in), dann hat
MeinRegister anschliessend den Wert 1111.1111 binär, $FF in hexadezimal oder
255 in dezimal.
Mit diesem großartigen Programm, das man im Quelltext über diesen
Link downloaden kann, kann man bis dahin nur wenig
anfangen, es zeigt aber folgendes:
- Ob ein Pin sich als Eingang oder als Ausgang verhält, hängt alleine davon ab,
was das Programm gerade einstellt. Das kann auch im Programmablauf wechseln,
wenn man bidirektionale Ports braucht.
- Alle Hardware wird in sogenannten Ports kontrolliert. Das sind Speicher, die
in Abhängigkeit von ihrem Inhalt das gesamte Verhalten der Hardware bestimmen.
- ähnlich wie die Eingangs- und Ausgangspins lassen sich asynchrone
Schnittstellen, Analogvergleicher, u.v.a.m. vom Programmierer ein-
und ausschalten oder sonstwie kontrollieren.
- Ein Assemblerprogramm kann mit Symbolen zwar etwas leserlicher gestaltet
werden, aber die Prozessorinstruktionen (hier: clr, out, ser und in) lassen sich
nicht ersetzen. Sie sind Symbole derjenigen Befehlsabläufe, die im Prozessor
fest vorgegeben sind. Die muss man halt nachschlagen oder auswendig lernen.
Das Übersetzen von Symbolen in hexadezimale Zahlenwerte und das Übersetzen von
Instruktionen in binäre Bitfolgen erledigt der Assembler.
(=> Screenshot: Aufruf des Assemblers mit dem Beispielprogramm)
Der Assembler ist ein Programm, das unsere Textdatei BEISPIEL.ASM als Futter
kriegt und dafür eine Reihe neuer Dateien ausspuckt:
- BEISPIEL.HEX: Diese Datei enthält die Bitfolge für den Prozessor, codiert im
sogenannten Intel-Hex-Format. Das ist auch mit einem Texteditor lesbar, aber
darf unverstanden bleiben. Damit wird anschließend die Programmiersoftware
gefüttert, die versteht das. (=> Screenshot: Assembliertes
Assemblerprogramm im Intel-Hex-Format)
- BEISPIEL.LST: Diese Datei enthält zusätzlich zu dem eingegebenen Text auch
die hexadezimale Übersetzung desselben in Instruktionen für den Prozessor. Die
kann man ansehen, muss man aber nicht. (=> Screenshot: Gelistetes
Assemblerprogramm nach dem Assemblieren)
- BEISPIEL.OBJ: Diese Datei wird benötigt, um das Programm zu simulieren. Das
kommt jetzt gleich dran. Sie ist nur maschinenlesbar.
Oft muss man einen komplexen Ablauf programmieren. Dann lohnt es sich, diesen
Ablauf in Päckchen zu programmieren und die einzelnen Päckchen auf dem
Trockenen zu erproben. Das Trockendock für AVR Assembler heißt Studio und wird
von ATMEL kostenlos zur Verfügung gestellt.
Das Studio wird mit der Object-Datei gefüttert, ein Zielchip ausgewählt und
seine Taktfrequenz vorgewählt. In dem erscheinenden Quelltext von Beipiel.asm
lassen sich sogenannte Breakpoints setzen. Dann wird der Ablauf entweder im
Einzelschrittverfahren oder mit "Go" gestartet. Nach jedem Schritt bzw. bei
Erreichen eines Breakpoints bleibt der Ablauf stehen. Jetzt können in Ruhe
Register oder Ports auf ihren Inhalt hin untersucht werden. Im Prozessor-View
kann die abgelaufene Zeit abgelesen werden, der Inhalt der Prozessorflags kann
inspiziert werden, usw.
(=> Screenshot: Das Beispielprogramm im Studio nach Bearbeiten der ersten
beiden Instruktionen)
Nach Bearbeiten der ersten vier Befehle hat sich am Registerinhalt von R16 und
beim Port B etwas getan. Im Studio wird mit Rot die Aufmerksamkeit des
Simulierers erregt.
(=> Screenshot: Das Beispielprogramm nach Bearbeiten der ersten vier
Instruktionen)
Selbstverständlich kann der Inhalt von Registern oder von Port-Bits manuell
geändert werden, wenn man bestimmte Reaktionen der Software provozieren will.
Es gibt noch viele weitere Manipulationsmöglichkeiten, auf die hier nicht im
Detail eingegangen werden soll. Damit stehen mächtige Werkzeuge zur Verfügung,
mit denen sich erste Schritte machen lassen.
Hilfen zum Erlernen der Assemblersprache gibt es in Büchern oder im Internet.
Bücher haben den Nachteil, dass sie wegen der beschränkten Klientel teuer
sind und rasch veralten. Im Internet gibt es zahlreiche Beispiele für
AVR-Assemblerprogramme. Eine recht gute Sammlung in englisch führt Kanda
Systems (http://www.avr-forum.com).
über 100 meist englisch-sprachige AVR-Programmierer haben sich im AVR-Webring
(
http://R.webring.com/hub?ring=avr&list) zusammengeschlossen, einer Linksammlung
mit vielen Beispielen. Gut bestückte und gepflegte deutschen Linksammlungen
zum Thema haben
http://www.mikrocontroller.net/links.htm und
http://www.lug-kiel.de/links/micros.html.
Speziell für den blutigen Anfänger in Sachen Bits und Ports mit ausführlichen
Erläuterungen ist die Webseite
http://www.avr-asm-tutorial.net gemacht. Die Seite ist zweisprachig. Der Autor freut sich
über zusätzlichen Verkehr auf seiner Seite.
©2002 by Gerhard Schmidt, DG4FAC
Webseite mit den Beiträgen:
http://www.avr-asm-tutorial.net/cq-dl/index.html
Benutzung, Kopie und Weiterverbreitung der Seiten zulässig, solange die Copyright-Angaben im Text bleiben.