Dieses Projekt wurde in der Elektronik-Zeitschrift Elektor ( http://www.elektor.de) in der Ausgabe Februar 2003 publiziert.
Die von mir gewählten Parameter sind eigenen Bedürfnissen anpassbar. Die Zeitauswahl wurde von mir so gewählt, dass sie einen weiten Bereich abdeckt. Von 15 Sekunden bis 1 Stunde. Dass, bei nur 16 Einstellmöglichkeiten nur die "wichtigsten" Zeiten einstellbar sind liegt daher klar auf der Hand. Dies soll aber kein Nachteil sein, denn diese sind leicht änderbar. Wird nur ein Bereich von 1 bis 10 Minuten benötigt, so lässt sich dies, mit ein wenig Rechenarbeit, realisieren.
Vorraussetzung dafür ist aber, dass Sie die Möglichkeit einer Entwicklungsumgebung und einer Programmiermöglichkeit für den PIC-Baustein haben.
Nicht nur, was die Zeiteinstellung betrifft, auch die Reihenfolge wie die einzelnen Leuchtdioden nach unten rieseln lässt sich verändern, und es müssen auch nicht unbedingt 112 Schritte (Zustände) sein. Die Anzahl der Schritte ergibt sich zwangsläufig aufgrund der Reihenfolge des Rieselns. Die einzige Bedingung dafür ist aber, dass sich immer nur eine Leuchtdiode pro Zustandsänderung ändert, ansonst müssen Sie sich eine andere Strategie erarbeiten und das Unterprogramm "NAECHSTZUST" entsprechen abändern.
Und wer meint es müssen immer 32 Leuchtdioden leuchten, der irrt! Es ist durchaus möglich, dass auch weniger leuchten. Sollen mehr als 32 leuchten, so sind umfangreichere Programmänderungen nötig. Abgesehen davon, ist dies auch "unrealistisch"!
Nun aber zu den einzelnen Änderungsmöglichkeiten im Detail:
Die Berechnung der Konstanten für die Zeiteinstellung soll am Beispiel von Schalterstellung 0 des HEX-Codierschalters S1 erläutert werden. In dieser Schalterstellung dauert die verrieselnde Zeit 15 Sekunden. Die entsprechenden Konstanten heißen ZEIT0H und ZEIT0L. Da es sich hier um einen 16-Bit-Wert handelt, muss dieser auf zwei Register aufgeteilt werden. Die Ziffer 0 steht für die Schalterstellung. Für die Schalterstellung 1 (30 Sekunden) lauten daher die entsprechenden Konstanten ZEIT1H bzw. ZEIT1L und bei Schalterstellung F (60 Minuten) heißen die Konstanten ZEIT15H bzw. ZEIT15L. Es müssen nur diese Konstanten angepasst werden!
Wie werden nun die Konstanten ermittelt, wenn die verrieselnde Zeit 15 Sekunden betragen soll?
Die Konstanten (ZEITxH und ZEITxL) beinhalten die Anzahl der ISR-Aufrufe zwischen zwei Zuständen. Es gibt hier insgesamt 112 Zustände. Die ISR wird alle 512 µs aufgerufen. Dieser Wert ergibt sich dadurch, da das TMR0-Register mit 0 geladen wird (es also wieder 256 µs dauert bis dieses Register wieder 0 wird und einen Überlauf generiert) und der Vorteiler mit 2 geladen wurde (OPTION-Register: b‘00000000‘)
Es ergibt sich daher folgende Formel:
gewünschte Zeit in µs Einstellwert = -------------------------------- Anzahl der Zustände x N x V x TP
Gewünschte Zeit = Hier 15000000 µs (=15 Sekunden)
Einstellwert = berechnete 16-Bit Konstante
Anz. der Zustände = 112
N = Zahl der Schritte bis zum TMR0-Überlauf (hier 256)
V = Vorteilerwert (hier 2)
TP = Taktperiode (1µs bei einem 4 MHz-Quarz)
Konkret für 15 Sekunden:
Die einzelnen Zeiten:
Schalterpos. Ges.Zeit Einstellwert ZEITxH ZEITxL (16-Bit-Wert) ---------------------------------------------------------- 0 15 Sekunden 261 2 5 1 30 Sekunden 523 3 11 2 60 Sekunden 1046 5 22 3 90 Sekunden 1569 7 33 4 2 Minuten 2092 9 44 5 3 Minuten 3139 13 67 6 4 Minuten 4185 17 89 7 5 Minuten 5231 21 111 8 8 Minuten 8370 33 178 9 10 Minuten 10463 41 223 A 12 Minuten 12555 50 11 B 15 Minuten 15695 62 79 C 20 Minuten 20926 82 190 D 30 Minuten 31389 123 157 E 45 Minuten 47084 184 236 F 60 Minuten 62779 246 59
Anmerkung:
Bei einer Änderung der Zeiten sollte auch die Frontfolie dementsprechend
angepasst werden. Zu diesem Zweck steht die Datei sanduhr.fpl zur Verfügung.
Diese wurde mit dem Programm "Fronplatten-Designer 2.0" der Firma ABACOM
erstellt.
Die Reihenfolge, wie die oberen Leuchtdioden nach unten rieseln wird mit zwei
Tabellen beschrieben. (siehe auch Unterprogramm
NAECHSTZUST). In der Tabelle TABWIRDERSETZT stehen
nacheinander die LED-Nummern, welche bei einem Zustandswechsel dunkel werden und in
der Tabelle TABNEUELED stehen die LED-Nummern, welche jetzt neu dazukommen. Wichtig:
es wird bei einem Zustandswechsel immer nur eine Leuchtdiode
ausgetauscht! Die restlichen 31 Leuchtdioden bleiben leuchtend. Zu beachten ist, dass
die Tabelle unten beginnt. Beim ersten Zustandswechsel (der Aufruf des Unterprogramms
ZUSTAND1, nachdem die Starttaste gedrückt wurde, gilt hier nicht als Zustandswechsel!)
wird also die Leuchtdiode LED3 dunkel (siehe Tabelle TABWIRDERSETZT) und die
Leuchtdiode LED36 leuchtet nun anstelle von LED3. Beim zweiten Zustandswechsel wird
LED36 wieder dunkel, dafür leuchtet nun LED44, beim dritten Zustandswechsel erlischt
LED44 und es leuchtet nun LED53, usw.
Der Befehl nop gleich nach dem addwf PC,f - Befehl darf bei den beiden
Tabellen nicht entfernt werden!
Hier die Nummerierung der Leuchtdioden:
Weiters muss die Konstante ZUSTANZ (im Listing) angepasst werden. Diese enthält die Anzahl der Zustände. In der aktuellen Version hat sie den Wert 112 (da es ja 112 Zustände gibt). Die Konstanten für die Zeiteinstellung (ZEIT0L bis ZEIT15H) müssen ebenfalls neu berechnet werden (Siehe 5.1. Zeitintervalle ändern)
Auch die Anzahl der leuchtenden LEDs kann angepasst werden. Es können auch weniger als 32 LEDs leuchten. Mehr als 32 ist zwar möglich, wenn man zusätzliche POSx-Register definiert, aber meiner Meinung bei insgesamt 64 Leuchtdioden nicht besonders sinnvoll!
Änderungen:
Wichtig:
Bei einem Zustandswechsel wird die zu ersetzende LED in den POSx-Registern
gesucht, wird diese dort nicht gefunden (Fehler in den Tabellen!!) so bleibt die
Sanduhr buchstäblich stehen, und es erfolgt kein Zustandswechsel mehr!! Wird z.B. die
Konstante LEDANZAKTIV mit dem Wert 20 geladen, so wird die zu ersetzende
Leuchtdiode auch nur in den Registern POS1 bis POS20 gesucht, wird sie dort nicht
gefunden, steht die Sanduhr!
In vielen Fällen kann auf den Jumper JP1 verzichtet werden, wodurch ein I/O-Pin des PIC-Controller (IC1) frei wird und für eine zusätzliche Funktion verwendet werden kann. Für manche Anwendungen der Sanduhr ist ein Schaltausgang für die Aktivierung/Deaktivierung eines anderen Gerätes während oder nach dem Rieseln notwendig. Dies läst sich nun mit dem freigewordenen Pin realisieren, wobei natürlich Anpassungen sowohl in der Software als auch in der Hardware notwendig sind:
Hardware:
Den Pull-Up-Widerstand R2 entfernen und an den Controller-Pin RA4 z.B. folgende
Transistor-Schaltstufe hinzufügen.
Der hier gewählte Transistor (BC557B) kann einen maximalen Kollektorstrom von 100mA liefern. Wird für das verwendete Relais mehr benötigt, so muss ein entsprechender Transistor verwendet werden. |
Software:
Das geänderte Listing befindet sich im Download-Bereich
auf dieser Seite.
Geändert bzw. Neu sind:
Konstante BEEPMODE: | 1 = Beep bei jedem Zustandswechsel der LEDs |
0 = kein Beep bei Zustandswechsel | |
Konstante SAUSMODE: | 0 = kein Schaltausgang |
1 = Beim Drücken der Starttaste wird der Schaltausgang aktiv (low); ist die eingestellte Zeit verrieselt oder mit der Stopptaste geht der Schaltausgang wieder in den inaktiven Zustand (high) zurück | |
2 = Der Schaltausgang geht in den aktiven Zustand (low), wenn die eingestellte Zeit verrieselt ist und geht wieder in den inaktiven Zustand (high) zurück, wenn entweder erneut die Starttaste gedrückt wird, oder durch Drücken der Stopptaste. | |
3 = Der Schaltausgang geht, nachdem die eingestellte Zeit verrieselt ist für eine kurze Dauer in den aktiven Zustand (low) über. (Dieser Mode erzeugt also einen Triggerimpuls) .Die Impulsdauer ist dabei mit einer Konstanten einstellbar. | |
Konstante SAUSDAUER: | Diese Konstante gibt die Impulsdauer x 500µs an, wenn die Konstante SAUSMODE den Wert 3 besitzt. |
Unterprogramm INIT: | Port A muss wie folgt definiert werden:
Pins RA0 bis RA3: Eingänge Pin RA4: Ausgang Das Register TRISA muss demnach mit dem Wert b‘01111‘ geladen werden. Weiters muss der Schaltausgang mit HIGH vorbelegt werden |
Unterprogramm NAECHSTZUST: | Die Abfrage ob der Jumper gesteckt ist entfällt, stattdessen wird anhand der Konstante BEEPMODE ein Beepton bei einem Zustandswechsel der Leuchtdioden ausgegeben. |
Unterprogramm SAUSBEISTART: | (Dieses Unterprogramm kommt hinzu)
Nach Drücken der Starttaste wird der Schaltausgang je nach Modus gesetzt oder rückgesetzt |
Unterprogramm SAUSNACHZEIT: | (Dieses Unterprogramm kommt hinzu)
Nach Ablauf der eingestellten Zeit wird der Schaltausgang je nach Modus gesetzt oder rückgesetzt |
Hauptprogramm: | Die Unterprogramm-Aufrufe für SAUSBEISTART und SAUSNACHZEIT an den entsprechenden Positionen |