Kiedyś umieściłem na obecnie niedostępnej stronie and.elektroda.eu materiał o dekodowaniu sygnału DCF. Urządzenie potrzebne było w urządzeniu, które wymagało synchronizacji czasu w pomieszczeniu gdzie wyprowadzenie anteny zewnętrznej do GPS było utrudnione. Poniżej umieszczam treść oryginalnego materiału, który może być pomocny przy budowaniu urządzeń z RTC synchronizowanych DCF.
Sygnał czasu DCF77 jest nadawany na częstotliwości 77,5KHz z mocą 50KW z miejscowości Mainflingen niedaleko Frankfurtu nad Menem w Niemczech.
Transmisja danych trwa minutę, transmisja bitu trwa sekundę dokładne informacje o sposobie transmisji można bez problemu odnaleźć w internecie.
Transmisja jest powolna, oraz zakłócają ją wszelkie zasilacze impulsowe jednak ma swoje zalety,
w przeciwieństwie do sygnału czasu z GPS odbiór możliwy jest również wewnątrz budynków,
jednorazowa synchronizacja zegara RTC w ciągu dnia czy też tygodnia jest zwykle wystarczająca do zachowania odpowiedniej dokładności.
Do dekodowania sygnału DCF potrzebujemy wolnego wejścia przerwania np. INT0 oraz 8b timer T0 i zegar RTC zewnętrzny lub np. oparty o timer T2 który może współpracować z zewnętrznym rezonatorem "zegarkowym" 32.768kHz
Timer T0 będzie służył do określania długości odstępów po między impulsami. W zależności od zaniku sygnału na 100ms lub 200ms interpretowane jest 0 lub 1.
Wejście przerwania INT0 będzie służyć do odbierania sygnału DCF.
Na początek krótka konfiguracja.
Definiujemy globalną zmienną static unsigned char dcf_tick oraz static unsigned char dcf_count.
Dla przerwania od timera T0 ustawiamy procedurę obsługi przerwania.
Dla odbieranych danych definiujemy tabelę static unsigned char dcf_data[8];
W tej tabeli będziemy wpisywać kolejne odebrane bity z sygnału DCF.
Aby łatwiej operować na bitach odebranych z DCF warto przygotować kilka procedur pomocniczych.
W programie definiujemy również zmienne years,months,days,hours,minutes które będą przechowywać aktualne dane czasowe.
Draft kodu zastosowania testowego dekodowania sygnału DCF:
Jeżeli chcesz zastosować powyższy przykład należy dostosować go do wersji wykorzystywanego mikroprocesora oraz doprowadzić kod do stanu produkcyjnego.
Po synchronizacji czasu, można zablokować odbieranie sygnału DCF oraz pracę T0 na pewien czas aby zbędnie nie obsługiwać przerwań od INT0 oraz T0.
W tak prosty sposób można uzyskać dekodować informacje czasowe zawarte w sygnale DCF77 oraz automatycznie synchronizować zegar RTC.
W sygnale DCF77 przekazywane są również informacje o pogodzie tzw. METEOTIME, jednak ich rozdzielczość dla Polski jest mała,
oraz przy dość dużych zakłóceniach sygnału odbiór utrudniony.
Procedurę odbioru można dopasować do innej częstotliwości taktowania mikrokontrolera niż 8MHz, można zmieniać zarówno dzielnik dla timera T0,
jak również wartości do wykrywania długości trwania impulsów w procedurze obsługi przerwania.
W przypadku sprzętowego RTC aktualizacja czasu może polegać na zapisaniu wartości do odpowiednich rejestrów.
Kolejną sprawą jest wskaźnik synchronizacji, można np. pokazywać jak dawno uzyskaliśmy synchronizację,
na wskaźniku podobnym np. do wskaźnika zasięgu jak w telefonie komórkowym gdzie jedna kreska może oznaczać np. czas sześciu godzin.
Poniżej film prezentujący działanie kodu do synchronizacji zegara RTC:
Sygnał czasu DCF77 jest nadawany na częstotliwości 77,5KHz z mocą 50KW z miejscowości Mainflingen niedaleko Frankfurtu nad Menem w Niemczech.
Transmisja danych trwa minutę, transmisja bitu trwa sekundę dokładne informacje o sposobie transmisji można bez problemu odnaleźć w internecie.
Transmisja jest powolna, oraz zakłócają ją wszelkie zasilacze impulsowe jednak ma swoje zalety,
w przeciwieństwie do sygnału czasu z GPS odbiór możliwy jest również wewnątrz budynków,
jednorazowa synchronizacja zegara RTC w ciągu dnia czy też tygodnia jest zwykle wystarczająca do zachowania odpowiedniej dokładności.
Do dekodowania sygnału DCF potrzebujemy wolnego wejścia przerwania np. INT0 oraz 8b timer T0 i zegar RTC zewnętrzny lub np. oparty o timer T2 który może współpracować z zewnętrznym rezonatorem "zegarkowym" 32.768kHz
Timer T0 będzie służył do określania długości odstępów po między impulsami. W zależności od zaniku sygnału na 100ms lub 200ms interpretowane jest 0 lub 1.
Wejście przerwania INT0 będzie służyć do odbierania sygnału DCF.
Na początek krótka konfiguracja.
Kod: C / C++
Definiujemy globalną zmienną static unsigned char dcf_tick oraz static unsigned char dcf_count.
Dla przerwania od timera T0 ustawiamy procedurę obsługi przerwania.
Kod: C / C++
Dla odbieranych danych definiujemy tabelę static unsigned char dcf_data[8];
W tej tabeli będziemy wpisywać kolejne odebrane bity z sygnału DCF.
Aby łatwiej operować na bitach odebranych z DCF warto przygotować kilka procedur pomocniczych.
Kod: C / C++
W programie definiujemy również zmienne years,months,days,hours,minutes które będą przechowywać aktualne dane czasowe.
Kod: C / C++
Draft kodu zastosowania testowego dekodowania sygnału DCF:
Kod: C / C++
Jeżeli chcesz zastosować powyższy przykład należy dostosować go do wersji wykorzystywanego mikroprocesora oraz doprowadzić kod do stanu produkcyjnego.
Po synchronizacji czasu, można zablokować odbieranie sygnału DCF oraz pracę T0 na pewien czas aby zbędnie nie obsługiwać przerwań od INT0 oraz T0.
W tak prosty sposób można uzyskać dekodować informacje czasowe zawarte w sygnale DCF77 oraz automatycznie synchronizować zegar RTC.
W sygnale DCF77 przekazywane są również informacje o pogodzie tzw. METEOTIME, jednak ich rozdzielczość dla Polski jest mała,
oraz przy dość dużych zakłóceniach sygnału odbiór utrudniony.
Procedurę odbioru można dopasować do innej częstotliwości taktowania mikrokontrolera niż 8MHz, można zmieniać zarówno dzielnik dla timera T0,
jak również wartości do wykrywania długości trwania impulsów w procedurze obsługi przerwania.
W przypadku sprzętowego RTC aktualizacja czasu może polegać na zapisaniu wartości do odpowiednich rejestrów.
Kolejną sprawą jest wskaźnik synchronizacji, można np. pokazywać jak dawno uzyskaliśmy synchronizację,
na wskaźniku podobnym np. do wskaźnika zasięgu jak w telefonie komórkowym gdzie jedna kreska może oznaczać np. czas sześciu godzin.
Poniżej film prezentujący działanie kodu do synchronizacji zegara RTC:
