Erweiterungen des Lauflichtes
Ziel: Das Lauflicht soll von links nach rechts laufen, dann von rechts nach links usw., also hin und her wandern.
Du hast in der letzten Aufgabe zum Lauflicht sicher ein neues Mkaro geschrieben:
#define SCHIEBE_BIT_RECHTS(PORT) ((PORT) = (PORT>>1))
Die 1 an den Pins soll nun 7 mal nach rechts geschoben werden, dann 7 mal nach links usw., es müssen also beide Makros genutzt werden.
Wir benötigen jetzt eine genau vorgegebene Anzahl von Schiebeaktionen. Dazu verwenden wir eine for-Schleife.
Die for-Schleife hat folgende Struktur:
for (j = Startwert; j < Endwert; Schrittweite) { Anweisungen }
Für unseren Fall würde das konkret so aussehen:
for (j = 1; j < 8; j++) { SCHIEBE_BIT_LINKS(LED_PORT);
}
Die Laufvariable j wird zu Beginn auf 1 gesetzt und dann in 1er-Schritten (j++) nach oben gezählt. Die Schleife wird immer wieder durchlaufen, solange j <8 ist. Erreicht j den Wert 8 springt das Programm zur eventuell folgenden Anweisung nach der Schleife.
Aufgabe: Ergänze das Lauflichtprogramm um zwei Schleifen, so dass das oben erwähnte Ziel erreicht wird.
Ziel: In der Leuchtdiodenreihe sollen zwei Lichter aufeinanderzulaufen und dann wieder voneinander weg.
Zu Beginn wird das Muster der ersten Zeile geladen
LED_PORT = 0b10000001;
Bei jedem Schritt müssen jetzt zwei Pin verändert werden, und zwar in entgegengesetzte Richtungen. Dazu sind zwei neue Makros notwendig: SETZE_BIT und LOESCHE_BIT. Den Makros muss der Port und die Nummer des Pins übergeben werden, die geändert werden sollen. Im Abschnitt Bitmanipulationen ist beschrieben, wie die Bits geändert werden können.
#define SETZE_BIT(PORT, PIN) ((PORT) |= (1 << (PIN))) #define LOESCHE_BIT(PORT, PIN) ((PORT) &=~ (1 << (PIN)))
Zu Beginn des Hauptprogramms wird der aktive Port initialisiert:
LED_DDR = 0xff; //Alle Pin des Port werden auf Ausgang gesetzt LED_PORT = 0b10000001; //Die beiden äußeren Dioden leuchten
Die Änderungen an den Pins werden wieder in einer Schleife vorgenommen. Als ersten müssen die beiden gesetzten Pins, also Pin 7 und Pin 0 gelöscht werden. Dafür verwenden wird die Laufvariable j der for-Schleife.
for (j=0; j<7; j++) { LOESCHE_BIT(LED_PORT, j); LOESCHE_BIT(LED_PORT,7-j); }
Ein Testlauf müsste jetzt die beiden äußeren Pins auf 1 setzten, die Leuchtdioden gehen also aus.
Im nächsten Schritt werden die beiden Pins verändert die neben den äußeren liegen, also Pin 6 und Pin 1. Die Laufvariable steht immer noch auf 0. Damit ist das Pin neben dem Pin 0, also Pin 1 nicht anderes als die Laufvariable j+1. Der andere Pin, der verändert werden soll, ist Pin6, also 7-j-1. Die Schleife sieht dann so aus:
for (j=0; j<7; j++) { LOESCHE_BIT(LED_PORT, j); LOESCHE_BIT(LED_PORT,7-j); SETZE_BIT(LED_PORT,j+1); SETZE_BIT(LED_PORT,7-j-1); }
Ein Test zeigt, dass wirklich die beiden äußeren Pins gelöscht und die danebenstehenden gesetzt werden.
Was passiert nun im nächsten Schleifendurchlauf? Da die Laufvariable j um 1 erhöht wurde, werden die Pin 1 und 6 gelöscht und die Pin 2 und 5 gesetzt. Genau das ist aber in der Aufgabe gefordert.
Ein Problem taucht auf: Die beiden Pins in der Mitte leuchten bei zwei Durchläufen auf und erzeugen einen ungleichmäßigen Lauf des Lichtes.
Aufgabe: Verbessere das Programm und beseitige das Problem.
Ziel: Es sollen zwei Leuchtpunkte hintereinander laufen
Aufgabe: Schreibe das Lauflichtprogramm so um, dass die gewünschte Funktion realisiert wird.
Hinweis: Fertige eine Skizze ähnlich dem Bild an und schreibe an jede Zeile die Nummern der gesetzten Pins. Überlege dann, wie die Schleife geändert werden muss. Es ist nicht schwer!