Armins AVR-Buch - DCF77_Signal_auswerten

Zuletzt geändert am 09.12.2023, 17:23:37

DCF77_Signal_auswerten


(armin77, 08.02.2013, 13:21:20)

In diesem Beitrag geht es um die Auswertung des DCF77 Signals.
Damit lassen sich Zeitschaltungen oder ähnliche Projekte realisieren

Benutze hier den ATMega 32. Man kann aber auch den ATMega8 nutzen.
Dazu muß man die Zeile $Regfile="m32def.dat" in $regfile = "m8def.dat" ändern
und die Ein- und Ausgänge anpassen.
Ich benutze hier das DCF Modul von Conrad.

Bascom bietet einen fertigen komfortablen Befehl an. Config DCF77






Ich benutze es im Programm um jede Sekunde zu überprüfen, ob die Zeit korrekt empfangen wurde.
Ist die Zeit korrekt wird die Zeit und das Datum angezeigt und LED2 leuchtet, ansonsten wird "warten auf Empfang" über die
serielle Schnittstelle gesendet.
Die LED1 leuchtet im Sekundentakt wenn das Unterprogramm Sectic aufgerufen wird.

Komplett sieht das dann so aus:

Config Dcf77 = Pinc.0 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic


Weiteres steht in der Bascom Hilfe.



$Regfile="m32def.dat" 'soll der ATMega8 verwendet werden in $regfile = "m8def.dat" ändern
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 2400 'Einstellung der Geschwindigkeit der UART in BAUD

Config Dcf77 = Pinc.0 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts 'Interupts global einschalten

Portc.0 = 1 'Pullup-Widerstand aktivieren
Config Portd.7 = Output ' Unterprogramm Sectic wird aufgerufen, Sekundentakt

Config Portc.1 = Output 'Led zeigt an, daß das DCF Signal empfangen wurde
Dim Flag As Bit 'Flag für nächste Sekunde

Do

If Flag = 1 Then 'neue Sekunde angebrochen? Dann Anzeigen
Gosub Anzeige
Flag = 0
End If
Loop
End

Sectic:
Flag = 1 'Unterprogramm Setic wird jede Sekunde ausgeführt und das Flag gesetzt
Toggle Portd.7
Return

Anzeige:
If Dcf_status.7 = 0 Then 'DCF Signal korrekt empfangen? Wenn nein..
Print "warten auf Empfang"
Portc.1 = 0
Else 'Wenn korrekt empfangen..
Portc.1 = 1
Print "Datum: " ; Date$ ''datum Und Uhrzeit anzeigen tt.mm.jj
Print "Uhrzeit: " ; Time$ 'hh:mm:ss
End If
Return


Die Uhrzeit und das Datum wird über die serielle Schnittstelle ausgegeben.
Dazu muß man einen TTL RS232 Wandler an RX und TX des AVR anschließen.
Hier einer von Pollin.
Bild pollinrs232.jpg


Hier ein Bild der Terminal Ausgabe:


Bild DCF1.jpg


Hier ein Bild vom Aufbau mit einem Projektboard

Bild dcf23.jpg

Hier der dazu passende Schaltplan.
Der RS232 -TTL ist nicht eingezeichnet. Er wird an RX (Portd.0) und TX (Portd.1) des ATMega32 angeschlossen

Bild DCF77456.JPG