Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Arbeiten mit AVR Studio - Teil 2

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.

Übung 1 - Wozu braucht man einen Debugger?

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

 

  • Gib das Programm taster2.asm in den Editor von AVRStudio ein und speichere es ab.
  • Starte den Debugger über das AVRStudio Hauptmenü mit Debug - Start Debugging oder über Strg-F7. Als sichtbares Zeichen erscheint links vor der aktuell zu bearbeitenden Programmzeile ein gelber Pfeil.
Abbildung 1 - Mit Strg-F7 wird der Debugger eingeschaltet. Als sichtbares Zeichen erscheint im Programm links ein gelber Pfeil.
  • Bewege mit F11 den gelben Pfeil Zeile für Zeile durch das Programm, bis zu der Stelle im  Programmblock, die in Abb. 2 angezeigt wird.
Abbildung 2 - Der Programmzeiger ist beim Sprungbefehl BREQ 2 angekommen. Links oben im Bild erkennt man, dass das Z-Flag gesetzt wurde.

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.

Abbildung 3 - Prozessorfenster (AVR Studio 4.19)

Weiterführende Aufgaben

  • Wie müsste ein Programm aufgebaut sein, das eine LED einmal kurz aufblinken lässt?
  • Wie müsste ein Programm aufgebaut sein, das eine LED zehnmal hintereinander ein- und wieder ausschaltet?
  • Wie müsste ein Programm aufgebaut sein, das eine LED im Sekundentakt blinken lässt?

Übung 2 - Ein Macro erstellen

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:

  • stk200_io R16, DDRB, DDRD, PORTB

Dazu muss aber vorher über die Direktive

  • .INCLUDE "stk200_io.inc"

die Datei im Programm geladen werden; ggf. unter Angabe des Verzeichnispfades. Das so geänderte Programm taster2.asm zeigt Abb. 5.

Abbildung 5 - Programm taster2.asm mit Macroaufruf.

Im diesem Abschnitt wurden die Op-Codes

  • SBIC - Skip if bit n in I/O Reg is cleared
  • CBI - Clear Bit in I/O Reg
  • SBI - Set Bit in I/O Reg
  • IN - Load an I/O Location to Reg
  • CPI - Compare with Immediate
  • BREQ - Branch if Equal

 

und die Direktiven

  • .LIST
  • .MACRO
  • .ENDMACRO

eingeführt.

Im folgenden Abschnitt wird gezeigt, wie Warteschleifen und Lauflichter programmiert werden. Und es wird der Einsatz des Debuggers unter AVR Studio gezeigt. Interessiert? Dann geht es hier weiter mit AVR Studio - Teil 3.

Druckversion | Sitemap
© Reinhard Rahner - Gettorf