programowalny zegar z DCF77 (2).pdf

(276 KB) Pobierz
Programowany zegar z DCF77, część 2 - AVT-5022
Programowany zegar z DCF77
P R O J E K T Y
Programowany zegar
z DCF77, część 2
AVT−5022
W†drugiej czÍúci opisu
programowanego zegara
z DCF77 autor ods³ania jego
programowe tajniki. Jest to
doskona³a okazja do poznania
moøliwoúci Bascoma!
Chyba najciekawszym fragmen-
tem programu steruj¹cego zegarem
jest podprogram analizuj¹cy od-
bierany sygna³ DCF77 i†koryguj¹-
cy aktualny czas oraz datÍ. Przed-
stawiono go na list. 3 .
Uruchomiony zosta³ TIMER1 ,
skonfigurowany do pracy z†pre-
skalerem o†stosunku podzia³u 64.
A†zatem czÍstotliwoúÊ podawana
na wejúcie rejestru tego timera
wynosi dok³adnie 125000Hz. Na-
leøy teø zauwaøyÊ, øe w†przypad-
ku wyst¹pienia przepe³nienia ti-
mera1 nast¹pi skok do podprogra-
mu DCF_START (dyrektywa ON
TIMER DCF_START ).
Podczas konfigurowania pro-
gramu udzielone zosta³o takøe
zezwolenie na obs³ugÍ przerwania
zewnÍtrznego INT0 . To, czy prze-
rwanie bÍdzie inicjowane opada-
j¹cym, czy wstÍpuj¹cym zboczem
sygna³u moøemy okreúliÊ za po-
moc¹ polecenia konfiguracyjnego
CONFIG INT0 = FALLING lub
CONFIG INT0 = RISING . Podczas
analizy podprogramu dekodowa-
nia transmisji musimy pamiÍtaÊ,
øe sygna³ DCF zosta³ odwrÛcony
w fazie (zanegowany) przez uk³ad
z tranzystorem T7.
OmÛwiliúmy sposÛb dekodo-
wania sygna³u DCF, ktÛry okaza³
siÍ niezbyt skomplikowany. Pozo-
sta³a jednak otwarta jedna sprawa:
sk¹d program wie, øe jest to
sygna³ DCF i†naleøy rozpocz¹Ê
jego dekodowanie? Na szczÍúcie
jednoznaczne okreúlenie startu
transmisji sygna³u DCF nie jest
takøe spraw¹ trudn¹. Zauwaømy,
øe transmisja koÒczy siÍ na 58
impulsie, a†impuls 59 w†ogÛle nie
wystÍpuje. Czas trwania przerwy
pomiÍdzy pocz¹tkami wszystkich
impulsÛw jest sta³y i†wynosi do-
k³adnie jedn¹ sekundÍ. Jest tylko
jeden wyj¹tek: przerwa pomiÍdzy
ostatnim i†pierwszym impulsem
wynosi nie jedn¹, ale dwie sekun-
dy! To w³aúnie zjawisko wyko-
rzystamy do jednoznacznego
okreúlenia pocz¹tku transmisji syg-
na³u (kodu) DCF.
Podczas wystÍpowania impul-
sÛw DCF TIMER1 by³ wykorzys-
tywany do pomiaru ich czasu
trwania. Podczas pomiaru czasu
prawid³owego impulsu timer1 nie
ulega³ nigdy przepe³nieniu,
a†maksymalna wartoúÊ jego rejes-
Elektronika Praktyczna 7/2001
35
32196156.014.png
Programowany zegar z DCF77
List. 3.
'Podprogram analizujący odbierany kod DCF77
Dcf:
Pause_counter = 0 'wyzerowanie zmiennej określającej czas upływający pomiędzy impulsami,
'patrz: listing podprogramu DCF_START
Dcf_flag = Not Dcf_flag 'zmienna określająca poziom impulsu DCF zostaje zanegowana
If Dcf_flag = 0 Then 'jeżeli na wejściu INT0 jest stan niski, co oznacza początek impulsu, to:
Config Int0 = Rising 'przerwanie INT0 ma reagować na wstępujące zbocze sygnału
Dcf_receiving_flag = 1 'ustaw zmienną sygnalizującą fakt odbierania impulsu
Counter1 = 0 'wyzeruj rejestry timera0
Start Timer1 'w celu zmierzenia czasu trwania impulsu uruchom timer0
Else 'jeżeli na wejściu INT0 jest stan wysoki, co oznacza koniec odbierania impulsu, to:
Stop Timer1 'wstrzymaj pracę timera0
Config Int0 = Falling 'przerwanie INT0 ma reagować na opadające zbocze sygnału
Dcf_receiving_flag = 0 'wyzeruj zmienną sygnalizującą fakt odbierania impulsu
'W tym momencie program ma “trochę czasu” na dokonanie analizy czasu trwania odebranego
'uprzednio impulsu DCF i wyciagnięcie z niej odpowiednich wniosków. Dla impulsu o czasie trwania
'100 ms, czyli oznaczającego logiczne 0, stan timera0 powinien wynosić 12500. A zatem,
'uwzględniając konieczny margines błędu wynikający z cech transmisji AM:
If Timer1 < 15000 And Timer1 > 10000 Then Dcf_bit = 0
'jeżeli stan rejestru timera0 zawiera się pomiędzy 10000 a 15000, to odebrany bit ma wartość 0
If Timer1 > 20000 And Timer1 < 30000 Then Dcf_bit = 1
'jeżeli stan rejestru tmera0 zawiera się pomiędzy 20000 a 30000, to odebrany bit ma wartość 1
'Czas trwania impulsu DCF drastycznie wykraczający poza zadane wartości może świadczyć tylko o
błędzie w transmisji i musi powodować jej anulowanie. A zatem:
If Timer1 < 10000 Then Start_dcf_flag = 0
'anuluj transmisję jeżeli zawartość rejestru timera0 jest mniejsza od 10000
If Timer1 < 20000 And Timer1 > 15000 Then Start_dcf_flag = 0
'anuluj transmisję jeżeli zawartość rejestr timera0 jest mniejsza od 20000 i większa od 15000
If Start_dcf_flag = 1 Then
'Jeżeli czas trwania odebranego impulsu mieścił się w zadanym przedziale i została określona jego
'wartość logiczna, to w zależności od numeru impulsu program musi wykonać następujące czynności.
Select Case Dcf_counter
Case 1: _sec =0 'jeżeli odebrany został impuls o numerze 0, to wyzeruj
'zmienną sekund
Case 21: Dcf_temp.0 = Dcf_bit'bit 0 zmiennej pomocniczej DCF_TEMP
'przyjmuje wartość odebranego impulsu
' TU WŁAŚNIE NASTĘPUJE
' POCZĄTEK TRANSMISJI DCF77
End If
Return
Mam nadziejÍ, øe analiza
przedstawionych listingÛw frag-
mentÛw programu steruj¹cego na-
szym zegarem pozwoli Czytelni-
kom na pe³ne zrozumienie spo-
sobu dekodowania sygna³u DCF
i†zasady pracy programowego ze-
gara czasu rzeczywistego (RTC).
Nie wspomnieliúmy jeszcze o†do-
datkowych funkcjach zegara:
o†sposobie realizacji timera i†bu-
dzikÛw, a†takøe o†stoperze.
ZarÛwno kontrola zgodnoúci
bieø¹cego czasu z†ustawionym cza-
sem budzikÛw, jak i†odliczanie
czasu przez timer i†stoper odbywa
siÍ w†podprogramie SEC_TIC , do
ktÛrego wykonywany jest skok po
up³ywie kaødej sekundy (tak, jak
to zosta³o ustalone w†konfiguracji
programowego RTC). Dodatkowo,
w†podprogramie SEC_TIC jest in-
strukcja warunkowa pozwalaj¹ca
na detekcjÍ up³ywu kolejnych
minut:
Sectic
If Temp2 <> _min Then
'Czynności do wykonania po
'upływie kolejnej minuty, np.
'porównanie czasu budzika
End If
'Pozostałe czynności do
'wykonania
Temp2 = _sec
Return
Case 22: Dcf_temp.1 = Dcf_bit'bit 1..
Case 23: Dcf_temp.2 = Dcf_bit'bit 2..
Case 24: Dcf_temp.3 = Dcf_bit'bit 3..
Dcf_min = Dcf_temp 'zakończyła się transmisja informacji
'o jednostkach aktualnej minuty i w związku z tym
'zmienna pomocnicza DCF_MIN przyjmuje obliczoną wartość
'zmiennej DCF_TEMP,
Dcf_temp = 0 'która następnie zostaje wyzerowana
Case 25: Dcf_temp.0 = Dcf_bit'bit 0 zmiennej pomocniczej DCF_TEMP
'przyjmuje wartość odebranego impulsu
Case 26: Dcf_temp.1 = Dcf_bit'bit 1..
Case 27: Dcf_temp.2 = Dcf_bit'bit 2..
Dcf_temp = Dcf_temp * 10 'zakończyła się transmisja informacji
'o dziesiątkach aktualnej minuty i w związku z tym
'obliczona wartość zostaje pomnożona przez 10,
'a następnie:
Dcf_min = Dcf_temp + Dcf_min 'obliczona zostaje ostateczna wartość minut
Dcf_temp = 0 'zmienna pomocnicza DCF_TEMP zostaje wyzerowana
'Omawianie dekodowania godzin, dnia miesiąca, miesiąca, roku i dnia tygodnia nie ma chyba
'większego sensu. Odbywa się ono na takiej samej zasadzie, co dekodowanie aktualnej minuty i jego
'analiza nie wnosiłaby niczego nowego w zrozumienie zasady działania programu. Pozwólmy zatem
'programowi mozolnie dekodować następne informacje i przenieśmy się na sam koniec transmisji,
'sygnalizowany odebraniem 58 impulsu
Case 58:
Start_dcf_flag = 0 'koniec transmisji, zerujemy jej flagę
_min = Dcf_min 'przyporządkowanie zmiennej minut odebranej wartości
_hour = Dcf_hour 'przyporządkowanie zmiennej godzin odebranej wartości
_month = Dcf_month 'przyporządkowanie zmiennej miesiąca odebranej wartości
_day = Dcf_day 'przyporządkowanie zmiennej dnia miesiąca odebranej wartości
_year = Dcf_year 'przyporządkowanie zmiennej roku odebranej wartości
_week_day = Dcf_week_day 'przyporządkowanie zmiennej dnia tygodnia
'odebranej wartości
End Select 'koniec wyboru kolejnego impulsu
Incr Dcf_counter 'zwiększ wartość licznika impulsów o 1
Counter1 = 0
'wyzeruj rejestry timera1
Podprogram ìobs³ugiî timera
i†jednego z†budzikÛw zamieszczo-
no na list. 4 .
Program steruj¹cy prac¹ zegara
zosta³ z†koniecznoúci opisany bar-
dzo fragmentarycznie, poniewaø
pe³ny jego listing zajmuje oko³o
5 stron formatu A4. Chcia³em
jedynie przedstawiÊ Czytelnikom
jego najwaøniejsze fragmenty,
a†w†szczegÛlnoúci sposÛb dekodo-
wania sygna³u DCF77.
Start Timer1
'uruchom timer1
End If
End If
Return
tru wynosi³a ok. 30000. Po do-
konaniu pomiaru Timer1 zostaje
ponownie uruchomiony w†innym
celu: zmierzenia czasu trwania
przerwy pomiÍdzy impulsami. Ta
przerwa podczas trwania transmi-
sji wynosi 800 lub 900ms, co
wi¹øe siÍ z†jednokrotnym prze-
pe³nieniem Timera1, natomiast
po jej zakoÒczeniu prawie 2†se-
kundy, co spowoduje dwukrotne
wyst¹pienie przerwania i†dwu-
krotny skok do podprogramu
DCF_START .
Dcf_start:
Incr Pause_counter
'zwiększ o 1 wartość zmiennej
'określającej czas przerwy
'pomiędzy impulsami
If Pause_counter = 2 Then
Pause_counter = 0
Dcf_counter = 0
'licznik impulsów kodu DCF
' zostaje wyzerowany
Start_dcf_flag = 1
'wskaźnik rozpoczęcia i trwania
'transmisji DCF zostaje
'ustawiony na 1
Montaø i†uruchomienie
Na rys. 3† przedstawiono roz-
mieszczenie elementÛw na dwÛch
p³ytkach obwodÛw drukowanych,
wykonanych na laminacie dwu-
stronnym z†metalizacj¹. Montaø ze-
gara rozpoczynamy od wlutowania
w†p³ytkÍ rezystorÛw i†podstawek
pod uk³ady scalone, a†koÒczymy
36
Elektronika Praktyczna 7/2001
32196156.015.png
Programowany zegar z DCF77
List. 4.
Sectic:
If Temp2 <> _min Then 'jeżeli upłynęła kolejna minuta, to:
Readeeprom Alarm_hours, 3'odczytaj z pamięci EEPROM dane o godzinie budzenia
Readeeprom Alarm_minutes, 4 'odczytaj z pamięci EEPROM dane o minucie budzenia
If Alarm_hours = _hour And Alarm_minutes = _min And Alarm_on_flag = 1 Then
'jeżeli odczytane dane są zgodne z aktualnym czasem oraz
'jeżeli budzik był aktywny, to:
Alarm_counter = 30 'licznik trwania alarmu zostaje ustawiony na 30
Alarm_counter_flag = 1 'flaga włączenie alarmu zostaje ustawiona na 1
Set Portd.6
'zostaje włączony przekaźnik
ka oraz odleg³oúÊ odbiornika od
urz¹dzeÒ elektronicznych (zaleca-
ne jest minimum 2m). Dotyczy to
w†szczegÛlnoúci komputerÛw i†ko-
mutatorowych silnikÛw elektrycz-
nych, zarÛwno AC, jak i†DC.
Natomiast, wbrew wczeúniejszym
obawom i†z³ym doúwiadczeniom
sprzed paru lat, nie stwierdzi³em
powaøniejszych zak³ÛceÒ pracy
odbiornika wywo³ywanych przez
procesor steruj¹cy zegarem. Od-
biornik pracowa³ poprawnie na-
wet po umieszczeniu go w†odleg-
³oúci kilku centymetrÛw†od pro-
cesora.
Odbiornik powinien leøeÊ na
p³askiej powierzchni (dioda LED
do gÛry), nie moøe leøeÊ pod
katem, ani w†pobliøu metalowych
przedmiotÛw. Naleøy uzyskaÊ jak
najlepszy sygna³ poprzez obraca-
nie odbiornika wokÛ³ jego osi.
Moøna to poznaÊ po regularnym
zapalaniu siÍ diody LED. Powinna
ona zapalaÊ siÍ co 1s na czas ok.
0,1 do 0,2 sekundy i†gasn¹Ê.
Uk³ad zegara zmontowany ze
sprawdzonych elementÛw nie wy-
maga uruchamiania i†dzia³a na-
tychmiast po w³oøeniu w†pod-
stawkÍ zaprogramowanego proce-
sora. Jednak to, øe dzia³a, nie
oznacza wcale, øe juø umiemy go
obs³ugiwaÊ. Zajmijmy siÍ wiÍc
nieco rozbudowanymi procedura-
mi obs³ugi.
End If
' dalsze czynności do wykonania po upływie minuty
'...............................................
End If
If Timer_on_flag = 1 Then 'jeżeli timer jest włączony, to
Decr Timer_seconds 'zmniejsz wartość sekund timera
If Timer_seconds = 255 Then 'jeżeli wartość sekund wynosi 255, to:
Decr Timer_minutes
'zmniejsz wartość minut
Timer_seconds = 59
If Timer_minutes = 255 Then 'jeżeli wartość minut wynosi 255, to:
Decr Timer_hours
Timer_minutes = 59 'wartość minut staje się równa 59
If Timer_hours = 255 Then 'jeżeli wartość godzin wynosi 255, to:
Timer_on_flag = 0 'koniec pracy timera
Readeeprom Timer_minutes,6 'ponownie odczytaj z pamięci EEPROM zapisane
'tam wartość minut timera
Readeeprom Timer_seconds, 7 'ponownie odczytaj z pamięci EEPROM zapisane
'tam wartość sekund timera
Readeeprom Timer_hours, 5 'ponownie odczytaj z pamięci EEPROM zapisane
'tam wartość godzin timera
Reset Pord.6
'wyłącz przekaźnik timera
Beep
'wygeneruj sygnał akustyczny
End If
End If
End If
End If
'w podprogramie SECTIC odbywa się także odliczanie czasu trwania alarmu budzika:
'jeżeli alarm był uaktywniony, to zmniejsz wartość jego licznika
If Alarm_counter_flag = 1 Then Decr Alarm_counter
'jeżeli licznik czasu trwania alarmu osiągnął 0, to zresetuj sygnalizację włączenia alarmu
If Alarm_counter = 0 Then Alarm_counter_flag = 0
'jeżeli alarm jest aktywny, to naprzemiennie włączaj sygnalizację akustyczną
If Alarm_counter_flag = 1 And Flash_flag = 1 Then Portd.4 = Not Portd.4
Return
na zamontowaniu kondensatorÛw
elektrolitycznych i†pozosta³ych ele-
mentÛw o†duøych gabarytach.
Zmontowane p³ytki musimy po-
³¹czyÊ ze sob¹ za pomoc¹ k¹towych
goldpinÛw. Taki sposÛb montaøu
zapewni nie tylko solidne po³¹cze-
nie mechaniczne, ale takøe usta-
wienie p³ytek idealnie pod k¹tem
prostym wzglÍdem siebie.
Odbiornik DCF77 do³¹czamy do
z³¹cza DB9 umieszczonego na tyl-
nej krawÍdzi p³ytki bazowej zega-
ra. Odbiornik nie wymaga oddziel-
nego ürÛd³a zasilania, a†o†jego dzia-
³aniu úwiadczy migotanie diody
umieszczonej w†jego obudowie
oraz punktu dziesiÍtnego na pier-
wszym wyúwietlaczu zegara.
Sygna³ DCF77 nadawany jest
na bardzo niskiej czÍstotliwoúci -
77kHz. Dlatego fala radiowa roz-
chodzi siÍ przy ziemi i jest
podatna na zak³Ûcenia bardzo za-
leøne od warunkÛw pogodowych
i†pory dnia. Zdarza siÍ, øe w†nie-
ktÛrych rejonach o silnych zak³Û-
ceniach odbiÛr tego sygna³u jest
czasami niemoøliwy. Dotyczy to
zw³aszcza duøych aglomeracji
miejskich. ZwiÍkszenie zak³ÛceÒ
nastÍpuje o wschodzie i†zachodzie
s³oÒca oraz w obecnoúci urz¹dzeÒ
elektronicznych (monitory, kom-
putery, telewizory, silniki itd.).
Dlatego bardzo waøne jest, aby
znaleüÊ dla odbiornika jak najlep-
sze miejsce. Istotne jest takøe jego
zorientowanie wzglÍdem nadajni-
Rys. 3. Rozmieszczenie elementów na płytkach drukowanych.
Elektronika Praktyczna 7/2001
37
32196156.016.png 32196156.017.png 32196156.001.png 32196156.002.png 32196156.003.png 32196156.004.png 32196156.005.png 32196156.006.png 32196156.007.png 32196156.008.png 32196156.009.png 32196156.010.png 32196156.011.png
Programowany zegar z DCF77
Tab. 1. Zestawienie funkcji pełnionych przez klawiaturę zegara.
S1
S2
S3
S4
S5
S6
Czas
Przejście do
+ S6 –
+ S3 −
kolejnej
przejście do
przejście do
funkcji
ustawiania
ustawiania
czasu
czasu
Ustawianie czasu
Koniec Zmiana
Zmiana
ustawiania minut
godzin
Data
Przejście do
kolejnej
funkcji
Ustawianie daty
Koniec Zmiana
Zmiana
ustawiania dnia
miesiąca
miesiąca
Budzik 1
Przejście do
kolejnej
funkcji
Ustawianie
Koniec Zmiana
Zmiana
budzika 1
ustawiania minut
godzin
Budzik 2
Przejście do Budzik
kolejnej włączony/
funkcji /wyłączony
Ustawianie
Koniec Zmiana
Zmiana
budzika 2
ustawiania minut
godzin
Timer
Przejście do Start
Stop Reset
kolejnej Timer
Timer timer
funkcji
Ustawianie
Koniec Zmiana Zmiana
Zmiana
timera
ustawiania minut sekund
godzin
Stoper
Przejście do Start
Stop Reset
kolejnej stoper
stoper stoper
funkcji
Po pierwszym w³¹czeniu zasi-
lania uk³ad przechodzi automa-
tycznie w†tryb wyúwietlania aktu-
alnego czasu, z†tym øe na wy-
úwietlaczach ukazuje siÍ pocz¹t-
kowo godzina 00:00, a†zegar roz-
poczyna zliczanie czasu od tej
wartoúci. Mamy teraz dwie moø-
liwoúci do wyboru: albo poczekaÊ
na odebranie transmisji DCF77
i†automatyczne skorygowanie
wskazywanego czasu i†dat, albo
wykonaÊ to rÍcznie. Poniewaø
jednak oczekiwanie na zdekodo-
wanie transmisji moøe trwaÊ do
2†minut (nawet przy dobrych wa-
runkach propagacyjnych), doko-
najmy rÍcznej korekty czasu.
Podczas wyúwietlania czasu, po-
dobnie jak przy korzystaniu z†in-
nych funkcji zegara, moøemy
przejúÊ w†tryb ustawiania naciska-
j¹c jednoczeúnie klawisze S3 i†S6.
Zmiana trybu pracy sygnalizowana
jest trzykrotnym sygna³em akus-
tycznym, ktÛrego zadaniem jest
ostrzeøenie operatora, øe dalsze
naciskanie klawiszy moøe wprowa-
dziÊ istotne zmiany w†pracy zegara.
Do ustawiania czasu, daty oraz
innych wartoúci wykorzystujemy
takøe klawisze S3 i†S6. Naciskanie
klawisza S3 powoduje cykliczn¹
zmianÍ minut, a†klawisza S6 -
godzin. Ustawianie czasu koÒczymy
naciskaj¹c klawisz S2. Zestawienie
funkcji inicjowanych za pomoc¹
poszczegÛlnych klawiszy klawiatury
zegara zamieszczono w †tab. 1 .
Na rys. 4 przedstawiono wyko-
rzystanie kropek dziesiÍtnych na
wyúwietlaczach. Sygnalizuj¹ one
rÛøne tryby pracy zegara z†wyj¹t-
kiem budzikÛw. Wejúcie w†tryb
ustawiania lub kontroli budzi-
kÛw†sygnalizowane jest bowiem
wyúwietleniem ìA1î lub ìA2î na
dwÛch pierwszych wyúwietlaczach.
Zbigniew Raabe, AVT
zbigniew.raabe@ep.com.pl
Rys. 4. Znaczenie kropek
dziesiętnych przy cyfrach
wyświetlacza.
Wzory p³ytek drukowanych w for-
macie PDF s¹ dostÍpne w Internecie
pod adresem: http://www.ep.com.pl/
?pdf/lipiec01.htm oraz na p³ycie
CD-EP07/2001B w katalogu PCB .
38
Elektronika Praktyczna 7/2001
32196156.012.png 32196156.013.png
Zgłoś jeśli naruszono regulamin