Alle hier dargestellten Vorgänge und Erklärungen lassen sich auf alle anderen Atmel-Controller vom Typ ATtiny und ATmega gut übertragen. Im Einzelnen muss immer das Datenblatt hinzugezogen werden; die Bezeichnungen unterscheiden sich - wenn überhaupt - nur geringfügig voneinander.
Wenn ein Programm erst einmal fertig geschrieben ist und läuft, ist man zufrieden. Auch das Programm taster2.asm (siehe unten) arbeitet reibungslos. Sobald eine oder mehrere Tasten gedrückt werden, leuchten die entsprechenden LEDs der Bargraf-Anzeige auf bzw. erlöschen, sobald der oder die Taster losgelassen werden. Aber da ist noch ein Fehler in folgendem Programm, den wir uns jetzt mit dem Debugger genauer anschauen.
; Programm: taster2.asm
.NOLIST
.INCLUDE "m8515def.inc"
.LIST
; ----------------- I/O Ports festlegen
ldi r16, 0xFF
out ddrb, r16
ldi r16, 0x00
out ddrd, r16
ldi r16, 0xFF
out portb, r16
; ----------------- Abfrage T0 ... T7
taster:
in r16, pind
cpi r16, 0x00
breq 2
rjmp led_an
rjmp led_aus
; ----------------- Unterroutinen
led_an:
out portb, r16
rjmp taster
led_aus:
out portb, r16
rjmp taster
.EXIT
Übung 1 - Debugging
Da keine Taste gedrückt wurde (alle Eingänge zeigen 0, das Z-Flag ist gesetzt), sollte der Programmzeiger zur Programmzeile rjmp led_aus springen. Statt dessen landet er bei ldi r16. $00.
Die Ursache ist schnell gefunden; die Sprunganweisung 2 setzt den PC (program counter) auf Programmzeile 2 zurück, statt, wie beabsichtigt, zwei weiter vor. Anstelle von 2 muss es heißen: $0A. Tauscht man diesen Wert aus, macht das Programm genau das, was man vorher geplant hatte. Der Programmzähler, alle Registerinhalte und das Statusregister können im Debug-Modus übrigens im Prozessorfenster (s. Abb. 3) angeschaut werden.
Weiterführende Aufgaben
Macros sind eine Ansammlung von Instruktionen, die durch ein einziges Statement aufgerufen werden. Für einen Mikrocontroller ist ein Macro eine neue Instruktion.
In der vorherigen Übung und in vielen zukünftigen Übungen werden die Instruktionen im Block I/O Ports festlegen bei der Benutzung eines STK200 Boards immer die gleichen sein. Deshalb liegt es nahe, diese Programmzeilen in einem Macro zusammenzufassen.
Ein Macro ist eingebettet in die Direktiven
.MACRO
...
.ENDMACRO.
Die Direktive .MACRO erwartet in der selben Zeile einen Makronamen.
Das Teilprogramm des Blocks "I/O Ports festlegen" im Programm taster2.asm sieht dann wie folgt aus:
.MACRO stk200_io
LDI @0, $FF
OUT @1, @0
LDI @0, $00
OUT @2, @0
LDI @0, $FF
OUT @3, @0
.ENDMACRO
Es gelten die folgenden Entsprechungen bzw. Zuweisungen:
@0 wird zugewiesen R16
@1 wird zugewiesen DDRB
@2 wird zugewiesen DDRD
@3 wird zugewiesen PORTB
Die Datei wird als reine Textdatei ohne Formatierungszeichen unter dem Namen "stk200_io.inc" abgespeichert. In einem Assemblerprogramm wird dieses Macro durch seinen Namen aufgerufen:
Dazu muss aber vorher über die Direktive
die Datei im Programm geladen werden; ggf. unter Angabe des Verzeichnispfades. Das so geänderte Programm taster2.asm zeigt Abb. 5.
Im diesem Abschnitt wurden die Op-Codes
und die Direktiven
eingeführt.
Hier geht es weiter mit AVR Studio - Teil 4.