Datumsanzeige mit DCF77 (4) – die Software “main()”

Sehen wir uns die main()-Routine an. So schaut alles einfach aus:

int main(void)
{
    init_leds();
    init_keys();
    init_dcf();
    init_time();
    init_timer();
    sei();
    wait_2sec();
    while(1)
    {
        proc_dcf();
        proc_status();
        proc_leds();
    }
}

Einmalig am Anfang werden abgearbeitet:

In init_leds() werden die Ports B0…7 (für die LED-Spalten), C0…7 und D0…3 (für die LED-Zeilen) als Ausgänge definiert und zunächst auf “0” (aus) geschaltet.

init_keys() definiert die Eingänge A1/A2 für die Tasten als solche definiert, mit internen Pullup-Widerständen, so dass die Eingänge beim Lesen “1” liefern, wenn keine Taste (die gegen Masse schalten = “Active Low”) gedrückt ist.

init_dcf() schaltet die DCF-Ports A0 (Daten) als Eingang) und A3 (Reset) als Ausgang. Außerdem wird A3 auf 1 (Reset!) gesetzt.

init_time() setzt die Variablen für die Uhrzeit zurück bzw. lädt die letzte Uhrzeit/Datum aus dem EEPROM.

init_timer() initialisiert den Timer. Dieser löst 16.000mal in der Sekunde eine Unterbrechung (Interrupt) des Hauptprogramms aus. Dabei wird die Routine ISR(TIMER1_COMPA_vect) aufgerufen.

sei(): Interruptfreigabe: Ab jetzt wird der Timer gestartet, d.h. Signale, Tastendrücke können verarbeitet werden und die LEDs werden angesteuert.

wait_2sec() zeigt eine Startmeldung an, wartet 2 Sekunden und schaltet dann den Reset-Pin (Port A3) für das DCF-77-Modul wieder auf 0.

In der Schleife werden danach permanent abgearbeitet:

proc_dcf() überprüft ob eine Botschaft (message) vorliegt, dass von DCF-77-Signal eine “1”, eine “0”, ein fehlerhaftes Bit oder ein Ende-Bit (einmal pro Minute) empfangen wurde. Die Daten werden zwischengespeichert und beim Ende-Bit ausgewertet. Falls die Prüfsummen dabei richtig sind, werden Datum und Uhrzeit neu gestellt.

proc_status() nimmt Botschaften über Tastendrücke entgegen und verarbeitet entsprechend den aktuellen Status des Geräts in der Variablen “clock_status”. Hier gibt es definierte Werte für “normal” (Datum und Uhrzeit werden angezeigt) oder z.B. verschiedene Werte beim Einstellen von Datum und Uhrzeit manuell, damit klar ist, wie auf Tastendrücke zu reagieren und was eigentlich anzuzeigen ist.

proc_leds() legt abhängig vom aktuellen Status in “clock_status” die Werte/Bitmuster fest, die von den LEDs ausgegeben werden sollen, ggf. mit Blinken etc. Bei Status “normal” ist das nur Datum/Uhrzeit. Die “Ausgabe” an LEDs geschieht durch das bloße Schreiben der Bitmuster für alle 12 Zeilen in 12 Speicherzellen.

Die Verarbeitung des DCF77-Signals, der Tasten geschieht über dort generierte “Botschaften” ebenso wie die Ansteuerung der LEDs in der Interrupt-Routine ISR(TIMER1_COMPA_vect).

Dieser Beitrag wurde unter Mikrocontroller/Arduino abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.