Dies ist eine kostenlose Homepage erstellt mit hPage.com.

Ein DCF_77 Beispiel


 

Wer in seinen zukünftigen Projekten auch mal die Funkzeit einbinden möchte.
Für den hab ich hier mal ein Beispielcode , wie ich es realisiert habe. In C.
Es soll nur als Beipsiel dienen.
Es gibt auch andere zahlreiche Beispiele im Netz, wie man das realisieren kann.
Ich habe versucht einen recht kurzen Code zu schreiben, der auch nur wenige Bytes im Flash und Speicher belegt.
 
 
 
 
Was macht der Code ?:
Eigentlich ganz einfach. Über einen Timer wird regelmäßig alle 10ms überprüft, ob ein Pegelwechsel statt gefunden hat. Wenn das der Fall ist, wird überprüft wie lang die Pause gerade war. Somit sind ca. 900ms eine 0 und 800ms eine 1. Dieses Ergebnis wird im _DCF.BUFFER[_DCF.ADR] im Speicher abgelegt. Und die _DCF.ADR um 1 erhöht. Somit repräsentiert das _DCF.ADR Byte das aktuelle Bit, bzw. die Funkzeit Sekunden. Wenn dann mal alle 59 Bits empfangen wurden. Wird die ganze Funkzeit auf Parität überprüft. Und als gültig oder ungültig ausgewertet. Wenn der Pegelwechsel mal länger sein sollte, wird noch geprüft, ob es eine Pause sein könnte. Weil bei der 59 Sekunde ja kein Impuls kommt. Wo durch dem Empfänger signalisiert wird, das die Funkzeit gleich von vorne beginnt.
Ich hoffe mal, ich konnte ihnen das recht gut erklären.
 
 
 
Ich nutze meistens die Module von ELV und kann die auch nur bestens weiterempfehlen
  1. kosten gerade mal 10 Euro und können mit 1,2 Volt bis 30 Volt betrieben werden
  2. Der Ausgang vom Modul wird schon mit einem Transistor verstärkt. Und gibt somit ein sauberes Signal aus
  3. Störquellen wie Handy oder Netzteile oder dergleichen können das Modul stören , muss man testen

 

 
Habe selbst die Erfahrung gemacht,  das von aktuellen Smartphones die Netzteile echt schlecht geschirmt sind. Und teilweise sehr starke Strörfelder erzeugt werden
 
 
Programmeinbindung:
Die dcf_77.c & dcf_77.h Datei müssen Sie ihrem Projekt hinzufügen.
Im AVR Studio mit Add Exiting Item , über Rechtsklick auf ihrer Solution
Und die Header- Datei mit #include in ihr Projekt einbinden 
Die Funktion DCF_erfassen muss alle 10ms aufgerufen werden 
Zum Beispiel durch eine ISR, wo diese Funktion zyklisch aufgerufen wird.
Dann muss im Hauptprogramm nur überprüft werden ob das DCF Paket vollständig ist.
Durch die Abfrage if (_DCF.SYNCRO==49) gefolgt mit der Anweisung _DCF.SYNCRO=DCF_auswerten().
Nun wird, wenn das DCF Paket vollständig ist. Das DCF Paket ausgewertet. Und in der DCF.SYNCRO steht eine 50 für alles OK.
Oder ein Wert kleiner als 50, wenn ein Fehler vorliegt.
Sollte das Paket in Ordnung sein. Muss jetzt nur noch der Aufruf folgen if (DCF.SYNCRO==50) DCF_umrechnen(); .
Dann wird die empfange Funkzeit übernommen.
 
 
Das Hauptprogramm sähe dann ungefär so aus:
#include <avr/io.h>
#include "dcf_77.h"    <- hier diese Datei einbinden
#include "main.h"
 
 
int main(void){
 
   ........
 
   while(1)
  {
 
   //////////////////////////////////////////////////////////////////////////
   //DCF_vollständig = dann überprüfe das Paket, Rückgabewert=eventuelle Fehler
   if(_DCF.SYNCRO==49) _DCF.SYNCRO=DCF_auswerten();
 
   /////////////////////////////////////////////////////////////////////////
   // DCF_paket in Ordnung
   if(_DCF.SYNCRO==50) DCF_umrechnen();
   }
 
}
 
/////////////////////////////////////////////////////////////////////////////
// Timer Interrupt alle 10ms
ISR (TIMER1_COMPA_vect)
{
 
// so  (dann wird die Funktion aber immer abgearbeitet)
 DCF_erfassen();
 
 // oder so ! (erfasst die Funkzeit , nur wenn noch nicht syncron )
if (_DCF.SYNCRO<50) DCF_erfassen();
 
}
 
 
 
 
DOWNLOAD: DCF_77_05_05_2015.zip
P.S. in der dcf_77.h Datei die  Zuweisungen  an Ihr Projekt anpassen
 
 
 
Dies ist eine kostenlose Homepage erstellt mit hPage.com.