Pfad: Home => AVR-DE => cq-dl-Beiträge => Teil 2 Logo
Experimentierschaltung

cq-dl-Beiträge zu ATMEL-AVR-Mikrocontrollern

Teil II: Software von ATMEL-AVR-Mikrocontrollern

Software selbstgemacht

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 mit Editor

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)

Symbole und Instruktionen

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:
  1. 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.
  2. Alle Hardware wird in sogenannten Ports kontrolliert. Das sind Speicher, die in Abhängigkeit von ihrem Inhalt das gesamte Verhalten der Hardware bestimmen.
  3. ähnlich wie die Eingangs- und Ausgangspins lassen sich asynchrone Schnittstellen, Analogvergleicher, u.v.a.m. vom Programmierer ein- und ausschalten oder sonstwie kontrollieren.
  4. 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.

Assemblieren

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:
  1. 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)
  2. 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)
  3. BEISPIEL.OBJ: Diese Datei wird benötigt, um das Programm zu simulieren. Das kommt jetzt gleich dran. Sie ist nur maschinenlesbar.

Simulieren

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 Lernen

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.