Um die Inhalte dieses Kapitel zu verstehen und nachvollziehen zu können, sollten vorher die AVR-Assembler Grundlagen durchgearbeitet worden sein.
Das Ziel in diesem Projekt ist eine Ampelschaltung - bestehend aus einer Signalampel für den Verkehr (rot/gelb/grün) und einer Fußgängerampel (rot/grün) - so zu programmieren, dass verschiedene Aktionen ausgelöst werden:
Das Projekt teilt sich in mehrere Stufen auf. In der ersten Stufe wird versucht, sich dem Problem zu nähern.
Stufe 1
Über das STK-200 Board wird mit den auf dem Board befindlichen LEDs (Bargraphanzeige) und Tastern gearbeitet; als Mikrocontroller wird ein ATmega8515 eingesetzt und ein Programm entwickelt, das den Normalbetrieb simuliert. Alternativ kann natürlich der Schaltungsaufbau aus LEDs und Taster auch auf einem Steckbrett vorgenommen werden (s. Schaltungsaufbau).
Material für alle Stufen | |
Material |
1x STK-200 Board mit Schaltnetzteil und USB-Verbindungskabel 1x Mikrocontroller ATmega8515 1x Programmer ISP2
alternativ zum STK-200 Board: 1x Steckbrett 5x LED (rot 2x, grün 2x, gelb 1x) 5x Widerstand 1kOhm 1x Taster 1x Widerstand 10kOhm diverse Steckdrähte |
Die benutzte Hardware
Der ATmega8515 verfügt über fünf Ports (A, B, C, D und E) mit insgesamt 35 bidirektionalen I/O-Schnittstellen mit internen pull-up Widerständen, die sich einzeln ansteuern lassen.
Sowohl die LEDs als auch Taster sind active-low geschaltet. Von den acht vorhandenen Tastern wird in Übung 1 nur T0 benötigt.
Die Taktung des Controllers wird so übernommen, wie werkseitig eingestellt; das heißt, der interne RC Oszillator mit 1,0 MHz Taktfrequenz wird genutzt (S. 39 Datenblatt).
Eine Verkehrampel (drei Lichter) und eine Fußgängerampel (zwei Lichter) lassen sich auf einer Bargraphanzeige wie folgt darstellen:
Die Schaltung kann natürlich auch separat auf einem Steckbrett aufgebaut werden, wenn man nicht über ein STK200 verfügt; die entsprechende Verdrahtung zeigt der folgende Schaltungsaufbau. Nicht dargestellt ist die Spannungsversorgung und allgemeine Anschlussbelegung für den Controller.
Schaltungsaufbau
Das Programm
Wie arbeitet das Programm?
Neu ist in diesem Programm der "Programmkopf", der immer mit mindestens einer RJMP-Direktive endet. Er wird bei verschiedenen Projekten zukünftig stets ähnlich aussehen und lässt sich bei Auflegung eines neuen Projektes einfach in das Programm kopieren. Im vorliegenden Fall ist er noch von geringem Umfang.
Startet man nach dem Kompilieren des Programms den Debugger und öffnet im Fenster "I/O View" PORTB und PORTD, dann lässt sich gut verfolgen, was das Programm leistet. Mit F11 kann Programmzeile für Programmzeile abgearbeitet werden.
Nach dem Programmstart werden die Ports B0 - B2 sowie B4 und B5 auf Ausgang gesetzt. Im Register DDRB sind die entsprechenden Bits 1. Entsprechend sind im Register DDRD alle Ports auf 0 (Eingang) gesetzt.
Über den Befehl
wird der Registerinhalt von PIND in R16 eingelesen und anschließend über logisch AND mit 0x01 verglichen oder, was gleichbedeutend ist, es wird mit Hilfe des logischen AND PortD.0 maskiert und auf 1 überprüft. Ist das der Fall, wird der Verzweigungsbefehl übergangen und mit dem nachfolgenden Befehl im Programm weitergemacht.
Eine nicht gedrückte Taste liegt auf HIGH oder 1, eine gedrückte auf LOW oder 0. Durch einen Klick auf Bit0 im Register PIND im "I/O View" des Debuggers wird simuliert, dass keine Taste gedrückt wurde (wg. active low). Das Programm verzweigt deshalb über
zur Marke t0_offen, lädt in das Hilfsregister hreg_1 den Wert $FF (alle Bits werden auf 1 oder HIGH gesetzt) und überträgt dies in das Register PORTB. Alle Portpins sind auf 1 oder HIGH gesetzt mit der Folge, dass keine der LEDs in der Bargraphanzeige leuchtet, die Ampelanlage ist abgeschaltet.
Nimmt man die 1 im Register PIND im Fenster "I/O View" des Debuggers zurück (einfach anklicken) und durchläuft mit F11 das Programm zeilenweise weiter, dann verzweigt das Programm bei BRNE nicht zur angegebenen Marke, sondern fährt unmittelbar mit der folgenden Programmzeile fort, da der Inhalt des Registers hreg_1 ungleich dem Wert $01 ist.
In der nachfolgenden Programmzeile wird der Wert $EB (entspricht binär 0b1110_1011) in das Hilfsregister hreg_1 geladen und anschließend an das Register PORTB übergeben. Die LEDs am Ausgang von PortB sind active low geschaltet, d.h., dass eine 0 oder LOW die jeweilige LED zum Leuchten bringt; in diesem Fall LED2 und LED4. Das sind nach Abb. 2 für die Verkehrsampel das grüne Licht und für die Fußgängerampel das rote Licht.
Die Ampeln funktionieren und sie reagieren auf Tastendruck über T0. In Stufe zwei müssen wir uns um die Zeitsteuerung der Lichtanlage kümmern.
In einem ersten Versuch zur Zeitsteuerung soll, sobald der Taster T0 gedrückt wird, die Verkehrs- und Fußgängerampel für ca. 5 Sekunden eingeschaltet werden.
-> wird fortgesetzt <-