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. |
|
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. |