doppel-m ...das Universum und der Rest.

  • Schrift vergrößern
  • Standard-Schriftgröße
  • Schriftgröße verkleinern

Crashkurs Assembler

Um einen Mikrocontroller halbwegs komfortabel zu Programmieren wird ein so genannter Assembler benutzt. Denn der Mikrocontroller versteht nur seine Maschinensprache, in der die einzelnen Kommandos durch Folgen von "Nullen und Einsen" ausgedrückt werden. Da dies für Menschen sehr umständlich zu handhaben ist, werden die Kommandos zunächst in Form festgelegter Kürzel (Mnemonics) dargestellt. Dieses Quellprogramm kann mit einem einfachen Texteditor erstellt werden. Der Assembler übersetzt das Quellprogramm in die Maschinensprache. Dieses Maschinenprogramm wird schließlich mit einem Programmiergerät oder Programmieradapter in den Mikrocontroller geladen. Häufig wird auch die Sprache des Quellprogramms selbst als Assembler(sprache) bezeichnet. Die einzelnen Assemblersprachen können sich je nach Mikrocontroller und Assemblerprogramm unterscheiden.

Die einzelnen Assembler-Befehle bewirken elementare Operationen: Daten von einer Speicherstelle zu einer anderen transportieren, Inhalt zweier Speicherstellen Vergleichen, arithmetische und logische Operationen ausführen, Daten testen, das Programm unter bestimmten Bedingungen Verzweigen, einen Befehl unter bestimmten Bedingungen überspringen oder zu einer bestimmten Stelle im Programm springen.

Der Weg des Assemblerprogramms
Texteditor
Assemblerprogramme können mit einem einfachen Texteditor am PC geschrieben werden. I.A. werden sie mit der Endung .asm gespeichert. Es gibt allerdings auch Entwicklungsumgebungen mit grafischer Oberfläche. Office-Programme sind für die Programmierung ungeeignet, da sie z.B. Formatierungs-Code in den Text einbauen.
Assembler
Der Assembler übersetzt das Assemblerprogramm des Programmierers in das Maschinenprogramm, das vom Mikrocontroller ausgeführt werden kann. Assembler unter Linux: tavrasm, avra, gavrasm; unter Windows: AVR-Studio bzw. WAVRASM.
erzeugte Dateien
Der Assembler erzeugt Dateien mit folgenden Endungen: *.hex - enthält die Befehle des Programms samt Adressen in Form von ASCII-Zeichen. *.lst (*.list) - enthält das Assemblerprogramm samt Adressen u. Fehlermeldungen des Assemblers. *.map - enthält u. A. die im Programm verwendeten symbolischen Namen samt zugeordneter Adressen. *.eep - (optional) enthält Daten, die in den EEPROM geschrieben werden sollen. *.obj - kann zur Simulation des Programmablaufs verwendet werden.
Programm in den Mikrocontroller laden
Um das Programm vom PC in den Mikrocontroller zu laden, wird ein ISP-Programmieradapter benötigt. Zudem wird die zum Adapter passende Steuersoftware benötigt, z.B. uisp (für Linux) u. yaap (für Windows). Diese Software bereitet die Daten der .hex-Datei auf und lädt sie per ISP-Adapter in den Mikrocontroller.

Im Folgenden wird als einführendes Beispiel ein kleines Assembler-Programm für den Mikrocontroller AT90S8515 aus der AVR-Familie der Firma Atmel vorgestellt. Es kann von Assemblern übersetzt werden, die zum AVR-Assembler kompatibel sind. Links stehen die eigentlichen Befehle und rechts kurze Kommentare, die der Assembler am Semikolon (;) erkennt und ignoriert. Durch Anklicken der Links wird ein kleines Fenster mit ausführlichen Informationen zum jeweiligen Thema geöffnet. Dies Beispiel ist keine vollständige Einführung in die Assemblerprogrammierung, sondern bietet stark komprimiert einen ersten Einblick.

Schaltung

Schaltplan zum Assembler-Programm puls.asm.In der Schaltung zum Assembler-Programm puls.asm wird die Grundschaltung des Mikrocontrollers wenig erweitert. Mit dem Taster T1 (blau) kann die Blinkfrequenz der Leuchtdiode LED (rot) auf schnell und langsam gestellt werden, indem der Anschluss PD0 auf Logik-Pegel 0 oder 1 geschaltet wird. Bei offenem Taster T1 zieht der Widerstand R1 PD0 auf 1-Pegel. Der geschlossene Taster T1 zieht PD0 auf 0-Pegel. Die Leuchtdiode liegt am Anschluss PC0. Mit T2 kann der Mikrocontroller zurückgesetzt werden (Reset). Der Schwing-Quarz Q erzeugt die Taktfrequenz, der Kondensator C3 dient der Entstörung, und nach links sind die Anschlüsse für den Programmier-Adapter herausgezogen.

Beispielprogramm "puls.asm"

Befehl Kommentar
  ;*** Beispielprogramm puls.asm ***
.INCLUDE "8515def.inc" ;Binde Programmcode aus der Datei 8515def.inc ein.
;Enthält u. a. vordefinierte symbolische Namen
;z. B. für Register.
[Info: .INCLUDE - 8515def.inc - Register]
.DEF Temp =R16 ;Weise dem Register R16 den symbolischen Namen
;Temp zu (dient als Zwischenspeicher).
[Info: .DEF - Register]
.DEF Taktzahl =R17 ;Weise dem Register R17 den symbolischen Namen
;Taktzahl zu.
;Taktzahl enthält Zahl der Takte, nach denen ein
;Pulswechsel erzeugt wird.
;Wird durch den Logikpegel am Pin 0
;von Port C dargestellt (Gehäuse-Pin 21).
;Damit wird eine LED angesteuert.
[Info: .DEF]
.EQU PORTC_PULSBIT =0 ;Setze symbolische Variable PORTC_PULSBIT=0.
;Unten wird Bit 0 (Pin 0) des Port C durch
;diese Variable auf 0 gesetzt.
;Löscht Puls-LED.
[Info: .EQU]
.EQU TAKTE_PRO_PULS =16 ;Setze symbolische Variable TAKTE_PRO_PULS=16.
;Pulszustands (LED an/aus) wird nach dieser
;Anzahl Counter-Interrupts geändert.
[Info: .EQU]
.CSEG
.ORG 0x00
;Setze Beginn eines Code-Segments.
;.ORG setzt den Beginn hier
;auf den hexadezimalen Wert 0.
[Info: .CSEG - .ORG]
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp PULS
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
;Hier stehen die Sprungbefehle,
;die zu den Programmteilen führen, die
;je nach Interrupt ausgeführt werden sollen.
;Wir benötigen für unser
;Programm nur den Timer-Interrupt.
;Er wird durch den Befehl rjmp PULS
;aufgerufen. Weiter unten steht nach
;dem Label PULS der Programmteil, zu
;dem gesprungen wird, wenn
;der Timer-Interrupt nach Ablauf der
;festgesetzten Zeit vom Mikrocontroller
;ausgelöst wird.
;Falls andere Interrupts ausgelöst
;werden sollten, würde das Programm
;in den Initialisierungsteil nach
;dem Label RESET springen.
[Info: rjmp - Timer/Counter - Interrupt - Label]
.ORG 0x0d ;Setze Adresszähler des aktuellen Segments
;auf den angegebenen Wert, hier hexadezimal
;0x0d. Das ist die Adresse nach den obigen
;Sprungbefehlen.
[Info: .ORG]
RESET: ;Label (Sprungmarke).
;Die meisten Interruptvektoren (oben)
;zeigen in diesem Beispiel auf das Label RESET.
;Bei den entsprechenden Interrupts wird
;in diesen Programmteil gesprungen.
[Info: Label]
ldi Temp, low(RAMEND)
out SPL, Temp
ldi Temp, high(RAMEND)
out SPH, Temp
;Die Startadresse des Stack (Stapelspeicher)
;wird festgelegt und der Stackpointer
;(Stapelzeiger) auf diesen Wert gesetzt.
;Die weitere Nutzung des Stack übernimmt
;in unseren Beispielprogramm der
;Mikrocontroller selbst.
[Info: Stack - ldi - out]
sbi DDRC, PORTC_PULSBIT
sbi PORTC, PORTC_PULSBIT
;Konfiguriere Pin 0 von Port C als Ausgabe.
;Setze Bit 0 in Port C auf 1.
[Info: Port - sbi]
ldi Temp, 5
out TCCR0, Temp


ldi Temp, 2
out TIMSK, Temp

ldi Taktzahl, TAKTE_PRO_PULS
;Zähltakt=Systemtakt/1024.
;Jeder 1024ste Takt des Quarzoszillators
;erhöht den Inhalt des Zählregisters um 1.

;Freigabe der Timer/Counter-Interrupts


;Lade 16 (TAKTE_PRO_PULS)
;in das Register R17 (Taktzahl).
[Info: Timer/Counter - ldi - out]
sei ;Freigabe der Interrupts allgemein
[Info: sei - Interrupt]
ENDLOSSCHLEIFE:

rjmp ENDLOSSCHLEIFE
;Diese Endlosschleife ruft mit dem Sprungbefehl
;rjmp sich ständig selbst auf. Die
;wesentlichen Aktionen unseres Programms
;finden im Programmteil PULS statt,
;der per Timer-Interrupt automatisch
;in kurzen Zeitabständen aufgerufen wird.
[Info: Interrupt - Timer/Counter - Label - rjmp]
PULS: ;Dieser Programmteil wird bei jedem
;Interrupt des Timer/Counter 0 ausgeführt.
;Hier wird die Pulsfrequenz gesetzt
;und entschieden, ob die LED mit 0 oder 1
;angesteuert wird (an/aus).
[Info: Timer/Counter - Label]
dec Taktzahl
brne ZURUECK
;Verringere Inhalt der Variable Taktzahl um 1.
;Springe zur Sprungmarke ZURUECK (s. u.),
;falls Taktzahl noch nicht =0
;(ansonsten werden die folgenden Befehle
;ausgeführt).
;D.h.: Nach jedem 16ten Interrupt werden
;die folgenden Programmzeilen ausgeführt.
;Dadurch wird die Blinkfrequenz verkleinert.
[Info: dec - brne - Timer/Counter - Label]
sbis PIND, 0
ldi Taktzahl, TAKTE_PRO_PULS/4
;Überspringe nächsten Befehl,
;falls Pin 0 von Port D = 1 (Gehäuse-Pin 10).
;Der symbolische Name PIND ist in der
;Datei 8515def.inc definiert. Über
;diese Adresse können die Logikpegel
;an den Pins von Port D gelesen werden.
;Setze Taktzahl auf TAKTE_PRO_PULS/4 (=16/4)
;Leuchtdiode blinkt 4 Mal schneller.
[Info: sbis - ldi - 8515def.inc]
sbic PIND, 0
ldi Taktzahl, TAKTE_PRO_PULS
;Überspringe nächsten Befehl,
;falls Pin 0 von Port D = 0 (Gehäuse-Pin 10).
;Setze Taktzahl auf TAKTE_PRO_PULS (=16).
[Info: sbic - ldi]
sbis PORTC, PORTC_PULSBIT
rjmp PULS_1
rjmp PULS_0
;Überspringe nächsten Befehl, falls Pulsbit=1.
;Springe zum Label PULS_1.
;Springe zum Label PULS_0.
[Info: sbis - Label - rjmp]
PULS_0:
cbi PORTC, PORTC_PULSBIT
rjmp ZURUECK
;Label (Sprungmarke)
;Setze Pulsbit=0.
;Springe zum Label ZURUECK.
[Info: cbi - rjmp - Label]
PULS_1:
sbi PORTC, PORTC_PULSBIT
rjmp ZURUECK
;Label (Sprungmarke)
;Setze Pulsbit=1.
;Springe zum Label ZURUECK.
[Info: sbis - rjmp - Label]
ZURUECK:
reti
;Label (Sprungmarke).
;Beende den Interrupt und
;Springe zurück in die Endlosschleife.
[Info: reti - Label]

Weiterführende Informationen

Die AVR-Mikrocontroller bietet wesentlich mehr Möglichkeiten, als hier dargestellt werden kann. Die Funktionen umfassen verschiedene Zähler, Zeitnehmer, Pulsweitenmodulatoren, Komparatoren, Schnittstellen und vieles mehr. Weiterführende Informationen finden Sie unter den folgenden Links.

Links

Praxisorientierte Einführung in die AVR-Mikrocontroller und ihre Programmierung
Inkl. Shop, Projekten und Hinweisen zu Linux
http://www.mikrocontroller.net

Tutorium der Assemblersprache von AVR-Mikrocontrollern von Atmel
Inkl. Bauanleitung für einen preisgünstigen Programmieradapter für den Parallel-Port
http://www.avr-asm-tutorial.net/avr_de/

Assembler und ISP-Software für AVR-Mikrocontroller
- unter Linux
http://cdk4avr.sourceforge.net
(umfangreiches Programmpaket, enthät neben uisp auch Assembler u. a.)
avra: http://avra.sourceforge.net
tavrasm: http://www.tavrasm.org
- unter Windows
AVR-Studio von Atmel mit Assembler und Simulator:
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2724
gavrasm (auch für Linux): http://avr-asm-tutorial.net/gavrasm/index_de.html
yaap: http://myplace.nu/avr/

Atmel: AVR-Produktübersicht, technische Dokus, Tools, ...
http://www.atmel.com/products/avr/

Atmel: AVR-Anwendungsbeispiele
Unter den vielen Anwendungsbeispielen der Atmel Corporation zu den AVR-Mikrocontrollern
ist auch eine ausführliche Bauanleitung samt Assembler-Code für einen preisgünstigen
In-System-Programmierer (AVR910)
http://www.atmel.com/dyn/products/app_notes.asp?family_id=607

Mikrocontroller-Programmierung am Beispiel des PIC16C65A
http://www.pe.tu-clausthal.de/IPPT/Praktikum/Computerpraktikum/microcontroller.html

Mikrocontroller-Programmierung am Beispiel des 8051 von Siemens
http://www.hjberndt.de/mc/

Vorlesungsskript Mikrocontroller, TU Cottbus (Pdf-Datei)
http://www.informatik.tu-cottbus.de/~fsi/skripte/Info_V_SS00/InfV2-K11.pdf

Vorlesungsskript Mikrocomputertechnik, FH Mnchen
Insbesondere Programmierung des Mikroprozessors 68HC11 von Motorola
http://www.netzmafia.de/skripten/mikrocomputer/


Verwandte Beiträge