Elektronik-Projekt: Elektronische Sanduhr


zurück zu Elektronik, Homepage

Dieses Projekt wurde in der Elektronik-Zeitschrift Elektor ( http://www.elektor.de) in der Ausgabe Februar 2003 publiziert.

Sanduhr im Betrieb

5. Modifikationshinweise

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:

nach oben

5.1. Zeitintervalle ändern

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.

nach oben

5.2. "Riesel"-Reihenfolge der LEDs ändern

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:

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)

nach oben

5.3. Anzahl der leuchtenden LEDs ä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!

nach oben

5.4. Schaltausgang anstelle Jumper JP1

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.

Schaltausgang an Port RA4 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
nach oben


zurück zu Elektronik, Homepage

Autor: Buchgeher Stefan
Erstellt: 30. September 2003
Letzte Änderung: 10. Oktober 2004