Als das Licht laufen lernte
Ziel: Es soll ein Lauflicht mit 8 Leuchtdioden realisiert werden
Was ist ein Lauflicht? Ganz einfach, ein Licht, was scheinbar von einer Seite zur anderen wandert.
Dazu wird in der Leuchtdiodenreihe die linke eingeschaltet, eine Weile gewartet, dann ausgeschaltet und sofort die nächste eingeschaltet. Dann wieder eine Weile warten usw.
Ist man am Ende angekommen, wird die linke wieder angemacht....
Die Stuktur des Programms ist schnell erkennbar.
Da die Leuchtdioden über die Vorwiderstände an der negative Spannung angeschlossen sind, müssen wir immer 7 der 8 Bit des Ports auf 0 schalten und eine 1 von links nach rechts schieben. Hier ist das noch mal genauer beschrieben.
Als erstes stellen wir in einem neuen Projekt die Grundstruktur des C-Programmes her:
#include <avr/io.h> #include <util/delay.h> //Hardware #define LED_PORT PORTB #define LED_DDR DDRB int main(void) { while (1) { } }Im Hauptptogramm legen wir alle Pins des PortB auf Ausgang und schalten alle Pins, außer Pin 8, auf 0.
LED_DDR = 0xff; //Alle Pin des Port werden auf Ausgang gesetzt LED_PORT =0b00000001; //Das Bit0 wird gesetzt, die rechte Leuchtdiode leuchtet
Im Test erkennt man, dass das gewünschte Pin eine 1 enthält:
Jetzt muss dieses auf 1 gesetzte Bit Schritt für Schritt nach links geschoben werden.
Nun kommt der eigentliche Kracher im Programm: wir verwenden zum Schieben des Bits ein Makro. Makros sind kurze Programmabschnitte, die man immer wieder benötigt, aber nur einmal schreiben muss.
Unser Makro heißt
SCHIEBE_BIT_LINKS (PORT) ((PORT) = (PORT<<1)
und wird vor dem Hauptprogramm eingetragen:
Wie verwendet man dieses Makro?
Es wird das Makro mit seinem Namen aufgerufen und in die Klammer das Port geschrieben, welches verändert werden soll.
In dem Makro selber wird in der Bitfolge, die in LED_PORT steht, einfach ein Bit nach links verschoben.
Fast fertig.
Der Test des kleinen Programmes zeigt uns, dass bei jedem Schleifendurchlauf die 1 auf dem Port eine Stelle nach links wandert.
Wenn sie jedoch am linken Rand angekommen ist, verschwindet sie im Nichts. Wir müsen dem Programm noch mitteilen, dass nach den 8 Schritten die Null am Pin 0 wieder auftauchen muss.
Dazu fragen wir zu Beginn der Schleife, ob der Port vollständig mit Nullen gefüllt ist. Wenn das der Fall ist, laden wir einfach unser Anfangsmuster in den Port und weiter geht es.
Wenn das Programm in den Controller geladen wird, sieht man kein Lauflicht! Wir haben die Warteschleife vergessen. Die kennen wir aber noch vom Blinklicht.
Nach dem Einbau der Warteschleife müsste das Lauflicht ordentlich laufen.
Aufgabe: Ändere das Programm so um, dass das Licht von links nach rechts läuft!