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 übertragen. Im Einzelnen muss immer das Datenblatt hinzugezogen werden; die Bezeichnungen unterscheiden sich - wenn überhaupt - nur geringfügig voneinander.

In diesem Kapitel geht es darum, wie man Taster abfragt und tasterabhängige Aktionen auslöst. Im Kapitel AVR-Assembler - Teil 2 - Zustand eines Drucktasters abfragen, haben wir uns das erste mal mit Drucktastern befasst. Ausgenutzt wurde die Möglichkeit, unter BASCOM Assemblerprogramme in ein BASIC-Programm zu integrieren. In diesem Kapitel wird ausschließlich mit AVR Assembler und der Oberfläche AVR Studio 4.19 gearbeitet.

In Kapitel AVR-Assembler - Teil 2 wurde gezeigt, wie der Zustand eines Tasters (offen - geschlossen) in einem Assemblerprogramm erfasst wird. Darauf wird jetzt aufgebaut. Beim STK200 sind die acht auf der Platine fest installierten active low Taster bereits mit einem Pull-up Widerstand versorgt.

Übung 1 - Einen Taster abfragen

Taster0 abfragen
Material
  • 1x  STK200 mit ATmega 8515-16PU
  • 1x  Schaltnetzteil 9V DC, 1000 mA
  • 1x  ISP2 Programmer
  • 1x  AVR Studio 4.19 auf PC
Aufgaben
  • Lege ein neues Projekt taste1 an
  • Gib das Assemblerprogramm taste1 in den Editor ein und speichere es ab.
  • Brenne das Programm in den Controller und starte es anschließend.
  • Überprüfe, ob LED0 aufleuchtet, solange Taster0 gedrückt wird.

Schaltungsaufbau

Abbildung 1 - Schaltungsaufbau mit Bargraph-Anzeige und acht Tastern. Nicht dargestellt ist die Spannungsversorgung des Controllers.

Das Programm taste1.asm

Wie arbeitet das Programm taster1.asm?

Auf die drei Direktiven .NOLIST, .include und .LIST wird nicht mehr eingegangen.

Der einzig neue Befehl in diesem Programm ist:

  • SBIC Reg, n   ; Skip if Bit n in I/O Register Reg is Cleared;
                             
    Reg Element aus {R0 ... R31}

.

bedeutet so viel, dass die nachfolgende Programmzeile übersprungen wird, wenn in die Bitstelle n des bezeichneten Registers Reg eine 0 geschrieben wird.

 

Beispiel

SBIC PIND, 0

Die nachfolgende Programmzeile wird übersprungen, wenn in die Bitstelle 0 des I/O Registers PD eine 0 geschrieben wird. Das ist in dieser Übung immer dann der Fall, wenn der Taster gedrückt wird (active low).

Die nachfolgende Programmzeile im Programm taster1.asm lautet: RJMP LED_AUS. Sie wird übersprungen, wenn Taster0 gedrückt wird. Das Programm fährt mit dem Befehl: RJMP LED_EIN fort. In dieser Unterroutine wird

  1. LED0 eingeschaltet
  2. zur Sprungmarke taster zurückgekehrt.

Wie muss Programm taster1.asm geändert werden, damit bei einem beliebigen Tastendruck die zur Taste entsprechende LED an geht? Darum kümmern wir uns in Übung 2 - Taster abfragen.

Übung 2 - Mehrere Taster abfragen

Mehrere Taster abfragen
Material
  • 1x  STK200 mit ATmega 8515-16PU
  • 1x  Schaltnetzteil 9V DC, 1000 mA
  • 1x  ISP2 Programmer
  • 1x  AVR Studio 4.19 auf PC
Aufgaben
  • Lege ein neues Projekt taste2 an
  • Gib das Assemblerprogramm taste2 in den Editor ein und speichere es ab.
  • Brenne das Programm in den Controller und starte es anschließend.
  • Überprüfe, ob die zum Taster Tx zugehörige LEDx aufleuchtet, solange Taster Tx  gedrückt wird (x eine Zahl zwischen 0 und 7).

Der Schaltungsaufbau ist identisch mit dem aus Übung 1. Aber was muss sich im Programmcode ändern, damit die Aufgabe gelöst werden kann?

Erinnern wir uns, der SBIC-Befehl reagiert, wenn an einer BITstelle im I/O Register D eine 0 eingetragen wird, oder anders gesagt, wenn einer der Taster an PortD gedrückt wird. Jetzt wird geschaut, welche der acht Taster wurden gedrückt. Dabei ist auch möglich, dass mehr als einer gedrückt wird.

Das Programm taster2.asm

Wie arbeitet das Programm taster2.asm?

Im Programmblock "I/O Ports festlegen" wurden zwei Instruktionszeilen neu aufgenommen. Durch sie wird erreicht, dass die LEDs mit dem Programmstart ausgeschaltet sind.

Neue Befehle sind:

  • CPI Reg, zahl            (ComPare with Immediate)
  • BREQ zahl               (BRanch if EQual)

 

Im Programmblock "Abfrage der Taster T0 ... T7" wird zunächst die Bitfolge von PORTD mit R16 eingelesen und mit 0 verglichen.Wurde kein Taster gedrückt, dann liegt in R16 0b0000_0000 und das Z-Flag ist gesetzt. Wurde irgendein Taster gedrückt, ist R16 ungleich 0.

Der Verzweigungsbefehl BREQ reagiert auf das Ergebnis der Abfrage. Bei 0 wird das Programm in der übernächsten Programmzeile (2 Sprünge -> rjmp led_aus) weitergeführt; die LEDs werden alle ausgeschaltet.
 

Übung 3 - Wozu brauche ich einen Debugger?

Wenn ein Programm erst einmal fertig geschrieben ist und läuft, ist man zufrieden. Auch das Programm taster2.asm 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 im Programm, den wir uns jetzt mit dem Debugger genauer anschauen.

  • 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 2 - 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. 3 angezeigt wird.
Abbildung 3 - 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 angeschaut werden.

Abbildung 4 - 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 4 - 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 Druckversion | Sitemap
© Reinhard Rahner - Gettorf