MezData-Logo Creative Commons License 358 Lösungen Button :AVR: Schnelleinstieg in AVR-Assembler

Wichtige Assembler Sprach-Elemente

Element Bedeutung Beispiel Erklärung zum Beispiel
; Einleiten eines Kommentars ; Kommentar bla bla  
.include Einbinden einer Datei .include "2313def.inc" Die 2313-Definitionen werden eingebunden
.equ Definition von Konstanten.
Wert ist nicht mehr änderbar im weiteren Quelltext
.equ papagei = 1 Der Bezeichner papagei hat nun den Wert 1
.equ fisch = -papagei * 2 Werte können auch durch Ausdrücke
(Expressions) berechnet werden
.set Definition einer Variablen.
Eine erneute Zuweisung eines Wertes ist möglich
.set cpuclock = 6000 Der Bezeichner cpuclock hat nun den Wert 6000
.set mothercycle = cpuclock*20/8 Werte können auch durch Ausdrücke
(Expressions) berechnet werden
.def Weist einem Register einen symbolischem Namen zu .def temp = R16 temp ist R16
label: Eine Einsprungmarke init: Die Marke (engl. label) init
Hinweise zu .equ, .set: Der Assembler kann mühselige Rechenarbeit übernehmen: Bestimmte Werte, die öfter im Programm gebraucht werden, z.B. die Frequenz mit der der Kontroller arbeitet können unter symbolischen Namen gespeichert werden. Die Werte lassen sich direkt oder durch einfache Ausdrücke beschreiben. Der Assembler errechnet die Werte und setzt diese an den entsprechenden Stellen ein.

Der Assembler versteht auch die Darstellung als ASCII Zeichen: 'a','A' usw.

Darstellung von Werten
Dezimal 255 10
Hexadezimal 0xFF $FF 0xA $0A
Binär 0b11111111 0b00001010

Umgang mit Ports (Datenrichtung, Ein- Ausgabe)

Der Mikrokontroller hat mehrere I/O Pins (Anschlüsse) die als 8Bit Ports gruppiert sind. Beim ATtiny2313 gibt es PORTB (PBn) und PORTD (PDn).

Der Wert jedes Pins (z.B. PB0) kann eingelesen werden (in tmp,PINB). Die Pins können als Ausgang geschaltet werden, indem im Data Direction FlipFlop (z.B. DDB0) der Wert 1 geschrieben wird. Der Wert des Ausgangs wird dann durch PORTB0 bestimmt. Nach einem Reset sind alle Pins hochohmige Eingänge weil die FlipFlops den Wert 0 (Inital Value) haben.

Ein Pin kann auch als Eingang mit PullUp-Funktion programmiert werden. Dabei liefert der MOS PullUp-Transistor (siehe Zeichnung rechts) einen geringen Strom, er wirkt wie ein Widerstand nach VCC (+). Man spart sich dadurch einen externen Widerstand. PINBn ist nun solange log. 1 bis der Pin z.B. mit einem Taster auf GND gezogen wird. Der PullUp-Transistor ist eingeschaltet, wenn DDBn = 0 und PORTBn = 1 ist.

Die Pins können zusätzliche Funktionen haben, siehe die Bezeichner in den Klammern bei der Zeichnung oben, z.B. serielle Schnittstelle.

Die einzelnen FlipFlops (z.B. PORTBn) werden zu Registern (z.B. PORTB) zusammengefasst.

Durch das Einschreiben entsprechender Werte in die Port-Register kann nach dem Reset die Funktion festgelegt werden:

DDBn PORTBn I/O Pull-up Kommentar
0 0 Input No Tri-State (Hochohmig)
0 1 Input Yes Der Ausgang liefert einen geringen PullUp-Strom für z.B. Taster auf GND
1 0 Output No Push-pull Zero Output (Ausgang ist 0)
1 1 Output No Push-pull One Output (Ausgang ist 1)
Beispiel: An PortB sollen 8 LED gegen GND (Masse, 0 Volt) angeschlossen werden,
alle Pins sind Ausgänge. Die LED 0 und 3 sollen leuchten:
Beispiel: Hardware-Test, der PortD ist mit Tastern gegen Masse verbunden,
die Pull-ups sind an. An PortB sind LED gegen GND angeschlossen.
Die Eingänge sollen "eins zu eins" an den Ausgängen ausgegeben werden:
.def temp = R16 ;R16 als temporaeres Register

init:
   ldi temp,0xff
   out DDRB,temp        ;PortB als Ausgang
   ldi temp,0b00001001  ;LED 0 und 3 leuchten
   out PORTB,temp       ;das Leuchtmuster ausgeben
.def temp = R16 ;R16 als temporaeres Register

init:
  ldi temp,0xff
  out DDRB,temp  ;PortB als Ausgang
  out PORTD,temp ;bei PortD die Pull-ups anschalten
loop:
  in  temp,PIND  ;PortD einlesen
  out PORTB,temp ;an PortB ausgeben
  rjmp loop      ;immer wieder  

Befehle, die mit Ports zu tun haben

Befehl Operand Beschreibung Beispiel Erklärung zum Beispiel
IN Rd,P Einlesen eines Port in Register in R16,PIND PortD einlesen in R16
OUT P, Rd Ausgeben eines Register in Port out PORTB,R16 R16 an PortB ausgeben
SBI P, b Setze Bit b in Port P sbi PORTB,2 Das Bit 2 an PortB setzen
CBI P, b Lösche Bit b in Port P cbi PORTB,2 Das Bit 2 an PortB löschen
SBIC P, b Überspringe, wenn Bit b in Port P gelöscht sbic PIND,4 wenn Bit gelöscht ist, wird der folgende Befehl übersprungen.
D.h. der folgende Befehl wird ausgeführt wenn Bit gesetzt..
SBIS p, b Überspringe, wenn Bit b in Port P gesetzt sbis PIND,4
rjmp testmode
Gehe in Tesmode wenn bei Power-On PGRM gedrückt,
d.h. gedrückt bedeutet Pin ist auf GND, Bit ist 0.