zegar mikroprocesorowy.pdf

(411 KB) Pobierz
649418594 UNPDF
Projekty AVT
H HH
Mój
pierwszy
zegar
mikroprocesorowy
2488
Do czego to służy prezentowany układ?
Powyższe pytanie jest chyba nieco reto−
ryczne, przecież każdy wie, do czego służy
zegarek: do wskazywania aktualnego czasu.
Jednak możliwości urządzenia, które za
chwilę opiszemy wykraczają ponad możli−
wości przeciętnego zegarka, a w każdym ra−
zie ponad możliwości zegarków prezento−
wanych jak dotąd w EdW. Nasz nowy zega−
rek, zbudowany z wykorzystaniem zaledwie
jednego układu scalonego − procesora typu
AT89C4051 posiada następujące funkcje:
− Wskazywanie bieżącego czasu w formacie:
godziny/minuty/sekundy
− Wskazywanie aktualnej daty w formacie:
dzień miesiąca: miesiąc
− Budzik działający w cyklu dobowym.
− Ustawianie aktualnego czasu
− Ustawianie aktualnej daty
− Ustawianie czasu budzenia
− Włączanie i wyłączanie budzika
− Wprowadzanie korekty czasu wyrównują−
cej niedokładności spowodowane zastosowa−
niem taniego, popularnego rezonatora kwar−
cowego
− Pomiar temperatury w zakresie od − 20 do
+100 stopni Celsjusza dokonywany za pomo−
cą cyfrowego termometru DS1820
− Możliwość sterowania wyświetlaczy sied−
miosegmentowych LED o wysokości 57mm.
Nie są to może parametry zbyt imponują−
ce, ale jak na tak małe i proste urządzenie
całkowicie wystarczające. Zegary elektro−
niczne należą do grupy urządzeń najchętniej
budowanych przez hobbystów elektroników.
Ja także bardzo lubię projektować i wykony−
wać układy takich zegarów i dlatego opisy−
wane urządzenie jest pierwszym, ale nie
ostatnim zegarem zbudowanym w technice
mikroprocesorowej, który zostanie opisany
na łamach EdW.
Wracajmy jednak do opisywanej kon−
strukcji, która jest układem przeznaczonym
głównie dla początkujących konstruktorów,
możliwym do wykonania podczas wolnego
popołudnia. Chciałby jeszcze tylko awansem
odpowiedzieć na pewne głosy krytyki,
z którymi być może spotka się opracowany
przeze mnie zegarek.
Wyświetlacze alfanumeryczne LCD mają
same zalety i tylko dwie wady: mały wymiar
wyświetlanych znaków i ich słabą czytelność
przy zmiennych warunkach oświetlenia. Ta
wada może być powodem słusznej krytyki
układu, którego wskazania będą widoczne
tylko z niewielkiej odległości i przy dobrym
oświetleniu. Na tę krytykę mogę odpowie−
dzieć dwoma stwierdzeniami:
− nasz zegarek jest urządzeniem przeznaczo−
nym do pracy na biurku lub nocnym stoliku
gdzie małe wymiary cyferek nie powinny
być szczególnie uciążliwe. Można także za−
stosować wyświetlacz z podświetlaniem.
Bez jakichkolwiek przeróbek można do
naszego zegara dołączyć.... wyświetlacze
LED o wysokości aż 57mm! Takie rozwiąza−
nie pozwoli na zastosowanie układu w roli
zegara tablicowego, widocznego nawet z od−
ległości kilkudziesięciu metrów!
się za chwilę, podczas analizy programu steru−
jącego zegarem. Bierzmy się zatem do pisania
programu dla naszego zegarka.
Co właściwie mamy wykonać? Czy coś
zupełnie nowego, co pojawiło się na świecie
z nastaniem ery elektroniki? Bynajmniej,
nasz zegar będzie się składał, podobnie jak
zegary mechaniczne, z wielu kółek zębatych,
które zazębiając się o siebie i obracając
z ustaloną prędkością, wskazują nam aktual−
ny czas. Patrząc na program sterujący pracą
naszego czasomierza, nie zobaczymy nicze−
go innego, niż to, co widział Ludwik XVI,
zaglądając w głąb swoich ukochanych zega−
rów. Zrealizujemy metodami elektroniczny−
mi to samo, co mechanicy tworzyli już od se−
tek lat metodami klasycznymi.
Co jest podstawą konstrukcji każdego ze−
gara mechanicznego? Zwykle takie malutkie
kółeczko, nazywało się chyba balans albo ja−
koś podobnie. To ono decydowało o precyzji
zegara, taktując ze stałą częstotliwością jego
mechanizm. Właściwie to kółko było jakby
okrągłym wahadełkiem, ale istotne jest tylko
to, że posiadało małe ząbki, które napędzały
większe kółeczko − sekundnik. Taki właśnie
balans, wahadło decydujące o precyzji nasze−
go zegara musimy teraz sobie zaprojektować,
wykorzystując do tego celu nowo poznany
składnik każdego systemu mikroprocesoro−
wego − timer.
Ponieważ balans naszego zegarka ma pra−
cować nieustannie, niezależnie od innych
czynności wykonywanych przez procesor,
najlepiej byłoby wykorzystać do jego budo−
wy timer pracujący w trybie 2 − AUTORE−
LOAD. Niestety, napotykamy tu na pewne
ograniczenie wynikające z zasady pracy ti−
mera w tym trybie: maksymalną wartość
liczby, którą możemy załadować do timera,
równą 255. Taki balans kręciłby się z zawrot−
ną prędkością, przerwania następowałyby
jedno po drugim, co mogłoby niejednokrot−
nie spowolnić inne funkcje wykonywane
Opis układu
Schemat elektryczny proponowanego układu
zegarka został pokazany na rysunku 1. Ko−
mentowanie tak prostego hardware'u nie mia−
łoby chyba większego sensu. Wystarczy
stwierdzić, że do wyświetlania danych został
zastosowany standardowy wyświetlacz alfa−
numeryczny LCD 16*1, element dobrze zna−
ny Czytelnikom EdW, a w szczególności
Uczestnikom i Sympatykom kursu BASCOM
College. Do sterowania pracą zegara wyko−
rzystane będą cztery przyciski S1 ... S4, a mi−
niaturowy przekaźniczek RL1 może posłużyć
do włączania i wyłączania urządzeń peryferyj−
nych służących jako sygnalizatory budzika.
Ogromne znaczenia ma zainstalowanie w sy−
stemie dwóch magistrali transmisji danych:
1WIRE i I 2 C. O ich użyteczności przekonamy
14
Elektronika dla Wszystkich
649418594.051.png 649418594.062.png
Projekty AVT
przez procesor. Zrezygnujmy zatem z propo−
nowanego trybu i zastosujmy tryb 1 pracy ti−
mera, z programowym ładowaniem i urucha−
mianiem timera.
A zatem Timer0 procesora musi być skon−
figurowany w następujący sposób:
tycznie! Nie zapominajmy bowiem, że na za−
trzymanie, przeładowanie i ponowne urucho−
mienie timera procesor potrzebuje także tro−
chę czasu. Z obliczeń i z doświadczeń prze−
prowadzonych w symulacji programowej wy−
nika, że na te operacje procesor "zużyje" aż
54 takty zegarowe. A zatem liczba ładowana
do rejestrów timera musi wynosić 4150.
Każde wystąpienie przerwania pochodzą−
cego z Timera1 powoduje skok programu do
procedury zawartej w podprogramie obsługi
przerwania TIMER0_INT, pokazanej na li−
stingu 1 . Jest to najważniejsza część progra−
mu obsługującego nasz zegar, w której reali−
zowane są wszystkie funkcje związane z od−
liczaniem sekund, minut, godzin, dni i mie−
sięcy. Z premedytacją zrezygnowałem ze zli−
czania lat: można przecież nie wiedzieć,
która jest godzina, można zapomnieć jaki
mamy dzień miesiąca czy nawet miesiąc, ale
rok? Byłby to z pewnością szczyt roztargnie−
nia, wart uwiecznienia w księdze Guinnessa!
Rezygnacja ze zliczania lat pociągnęła za so−
bą jedną, drobną niedogodność: program nie
jest w stanie rozpoznać lat przestępnych. Jed−
nak nie sądzę, aby skorygowanie wartości
dnia miesiąca raz na cztery lata było dla ko−
gokolwiek zbyt fatygujące!
Mam nadzieję, że podprogramy pokazane
na listingu 1 i 2 , realizujące najważniejsze
funkcje naszego zegara są całkowicie zrozu−
miałe dla Czytelników i że wyjaśnienia może
wymagać jedynie funkcja korekty czasu, do−
konywanej automatycznie raz na dobę.
Do stabilizacji pracy wewnętrznego oscy−
latora procesora 89C4051 wykorzystany zo−
stał popularny i tani rezonator kwarcowy
11.0659200MHz. Popularny i tani może nie−
kiedy oznaczać: "nie najwyższej jakości"
i tak właśnie jest niejednokrotnie w praktyce.
Rozrzut parametrów tych oscylatorów jest
dość znaczny, co powoduje odchyłki wska−
zywanego czasu od czasu wzorcowego do−
chodzące niekiedy nawet do kilku − kilkuna−
stu sekund na dobę. W roku 2001 trudno po−
godzić się z taką "precyzją" i należy znaleźć
jakieś rozwiązanie dające naszemu zegarowi
cechy morskiego chronometru.
Config Timer0 = Timer , Gate = Internal , Mode = 1
On Timer0 Timer0_int
Wewnętrzny oscylator procesora pracuje
z częstotliwością 11059200Hz, co wynika
z zastosowania taniego i popularnego rezona−
tora kwarcowego o tej właśnie częstotliwości
rezonansowej. Pamiętajmy jednak, że czę−
stotliwość ta jest wewnętrznie dzielona przez
12 i dopiero potem używana jako zegar ma−
szynowy procesora. A zatem realna częstotli−
wość taktowania procesora wynosi
11059200/12 = 921600Hz.
Liczba ta znacznie przekracza pojemność
zastosowanego timera, który wobec tego zo−
stanie zmuszony do kilkukrotnego zliczania
w ciągu sekundy. Następnym krokiem będzie
zatem znalezienie jak największej liczby,
która musi spełnić następujące warunki:
− być mniejszą lub równą 65536
− wynik dzielenia 921600 przez tę liczbę mu−
si być liczbą całkowitą.
Liczbą tą jest 15: 11059200/15 = 61440,
czyli że wykorzystywać będziemy prawie ca−
łą pojemność timera. W trybie 1 maksymalna
pojemność timera określona jest liczbą dwu−
bajtową i wynosi 65536. Wynika z tego, że
aby osiągnąć przepełnienie timera i wygene−
rowanie przerwania we właściwym czasie, ti−
mer musi za każdym razem rozpocząć zlicza−
nie od wartości 65536 − 61440 = 4096. Teore−
'Liistiing 1
Timer0_int:
Counter0 = 4150 'załaduj do rejestru timera1
wartość 4150
Start Timer0 'uruchom timer1
Incr Int_temp 'zwiększ o 1 zmienną pomoc−
niczą zliczającą kolejne przerwania
If Int_temp = 15 Then
'jeżeli zmienna pomocnicza
INT_TEMP przyjęła wartość 15 (zliczono 15 wystąpień
przerwania timera1), to:
Seconds_flag = 1 'zmienna pomocnicza
SECONDS_FLAG przyjmuje wartość 1 (patrz listing3)
Incr Seconds 'zwiększ o 1 wartość sekund
If Hours = 12 And Minutes = 0 And Seconds = 30
And Correction_flag = 1 Then
'jeżeli jest godzina 12:00:30,
a także zmienna CORRECTION_FLAG jest równa 1, to:
Seconds = Seconds + Seconds_correction
'dokonaj korekty wskazywanego
czasu
Correction_flag = 0
'po dokonaniu korekty ustaw
ponownie zmienną CORRECTION_FLAG na 0,
co pozwoli na dokonanie kolejnej korekty za
24 godziny
End If
'koniec warunku
Int_temp = 0 'zmienna pomocnicza zliczania
przerwań zostaje wyzerowana
If Seconds = 60 Then
'jeżeli wartość sekund zwiększyła
się do 60, to:
Seconds = 0 'wyzeruj wartość sekund, oraz
Incr Minutes 'zwiększ wartość minut
If Alarm_hour = Hours And Alarm_minute = Minutes
And Alarm_flag = 1 Then
'jeżeli aktualny czas jest zgodny
z czasem ustawionym dla budzika i jeżeli udzielone
zostało zezwolenie na włączenie sygnału budzenia
(zmienna ALARM_FLAG), to:
Set Rel : SET T1 'włącz przekaźnik alarmu
i tranzystor sterujący piezo (w konfiguracji
programu użyto REL ALIAS P1.0 i T1 ALIAS P3.4)
Rys. 1 Schemat ideowy
Elektronika dla Wszystkich
15
649418594.064.png 649418594.065.png 649418594.001.png 649418594.002.png 649418594.003.png 649418594.004.png 649418594.005.png 649418594.006.png 649418594.007.png 649418594.008.png 649418594.009.png 649418594.010.png 649418594.011.png 649418594.012.png 649418594.013.png 649418594.014.png 649418594.015.png 649418594.016.png 649418594.017.png
Projekty AVT
Else 'jeżeli powyższe warunki nie są
spełnione, to:
Reset Rel 'wyłącz przekaźnik alarmu
End If 'koniec warunku
If Minutes = 60 Then
'jeżeli wartość minut stała się
równa 60, to:
Minutes = 0 'wartość minut staje się równa
0, oraz:
Incr Hours 'zwiększa się wartość godzin
If Hours = 24 Then
'jeżeli wartość godzin stałą się
równa 24, to:
Hours = 0 'wartość godzin staje się równa
0, oraz:
ułamka sekundy na dobę niepotrzebnie zwięk−
szyłoby koszt wykonania zegara i dlatego zde−
cydowałem się na dość niekonwencjonalne
rozwiązanie, i ile wiem nie spotykane dotąd
w konstrukcjach zegarów. Wykorzystujemy tu
fakt, że błąd wskazań zegara "domowego",
pracującego w mniej więcej stałych warun−
kach termicznych jest raczej stały i nie zmie−
nia się w funkcji czasu. Te parę sekund na do−
bę możemy sobie "odpuścić", byleby błąd
wskazań nie kumulował się w miarę upływu
kolejnych dni. Temu właśnie służy funkcja ko−
rekty czasu, wykonywana raz na dobę, punk−
tualnie o godzinie 12:00:30. Do licznika se−
kund zostaje wtedy dodana lub odjęta ustalona
uprzednio doświadczalnie wartość z przedzia−
łu −20 ... +20 sekund. Większa wartość korek−
ty nie została przewidziana, ponieważ rezona−
tor kwarcowy dający odchyłki większe niż 20
sekund na dobę należy po prostu wyrzucić lub
zastosować w układzie, w którym precyzja ge−
neratora kwarcowego nie jest zbyt istotna.
Sposób wprowadzanie korekty czasy zo−
stał pokazany na listingu 5 .
Program obsługujący nasz zegar może
pracować w kilku, zmienianych za pomocą
klawiszy S1 i S4 pętlach programowych.
Wykonują one następujące funkcje:
− wyświetlanie aktualnego czasu
− wyświetlanie aktualnej daty
− wyświetlanie czasu budzenia
− ustawianie czasu i jego ewentualnej korekty
− ustawianie daty
− ustawianie czasu budzenia
− włączanie i wyłączanie budzika
− wyświetlanie aktualnej temperatury
Wszystkie te podprogramy są w istocie
bardzo podobne do siebie i dlatego też dla
przykładu omówimy tylko dwa z nich: wy−
świetlanie czasu i ustawianie czasu. Prezen−
towanie całego listingu programu w tym ar−
tykule nie miałoby większego sensu, tym
bardziej że jego wersja źródłowa została
umieszczona na stronie www.edw.com.pl .
Na listingu 3 został pokazany podprogram
realizujący funkcję wyświetlania aktualnego
czasu. Zasada jego działania została wyczerpu−
jąco opisana w komentarzach, a dodatkowego
wyjaśnienia wymaga jedynie cel wysyłania in−
formacji o aktualnym czasie na magistralę I 2 C.
Magistrala I 2 C, szczegółowo opisywana
w ramach kursu BASCOM COLLEGE, jest
jednym z najważniejszych "naczyń krwiono−
śnych" wielu systemów mikroprocesorowych.
Umożliwia ona dołączanie do systemu różnych
układów peryferyjnych, pełniących niejedno−
krotnie dość złożone funkcje, a sterowanych za
pośrednictwem tylko dwóch wyprowadzeń pro−
cesora. W przypadku naszego zegara magistrala
I 2 C umożliwia dołączenie do niego dwóch lub
trzech (jeżeli chcemy także wyświetlać sekun−
dy) modułów wyświetlaczy LED o znacznych
wymiarach. Są to moduły AVT−859, opisane
przez niżej podpisanego w numerze 8/00 Elek−
troniki Praktycznej. Zastosowanie takich wy−
świetlaczy, niestety relatywnie kosztownych,
o wysokości 57 mm, umożliwi obserwację
wskazań zegara z odległości do kilkudziesięciu
metrów i nawet w całkowitej ciemności.
'Liistiing 3
Sub Display_time
Cls 'wyczyść ekran wyświetlacza
Seconds_flag = 1
'zmienna pomocnicza
SECONDS_FLAG przyjmuje wartość 1, zezwalającą
na wyświetlenie na ekranie
aktualnego czasu
Incr Day 'zwiększ wartość dni
Correction_flag = 1
'udziel zezwolenia na korektę
czasu w rozpoczynającym się dniu
Call Days 'wezwij podprogram obliczający
dni w danym miesiącu (patrz listing 2)
Waitms 255 'zaczekaj 255 ms
Do
If Seconds_flag = 1 Then
'jeżeli jest zezwolenie na
wyświetlenie czasu, to:
End If
'koniec warunku
Seconds_flag = 0
'anuluj zezwolenie aż do upływu
kolejnej sekundy (patrz listing 1)
Home 'ustaw kursor na początkowej pozycji
Lcd "Time: " 'wyświetl napis informacyjny
If Hours < 10 Then Lcd "0";
'jeżeli wartość godzin jest
mniejsza od 10, to wyświetl zero wiodące
Lcd Hours ; ":" ; 'wyświetl wartość godzin
If Minutes < 10 Then Lcd "0";
'jeżeli wartość minut jest mniejsza
od 10, to wyświetl zero wiodące
End If
'koniec warunku
End If
'koniec warunku
End If
'koniec warunku
Return
'koniec obsługi przerwania TIMER1
'Liistiing 2
Sub Days
If Day = 29 And Month = 2 Then
'jeżeli wartość dnia zmieniła się
na 29 dzień lutego, to:
Incr Month 'zwiększ wartość miesięcy
Day = 1 'dzień miesiąca staje się równy 1
End If 'koniec warunku
If Day = 31 Then 'jeżeli wartość dnia miesiąca
osiągnęła 31, to
Select Case Month 'w zależności od aktualnego
miesiąca wezwij podprogram zakończenia miesiąca:
Case 4 : Call Month_incr
Case 6 : Call Month_incr
Case 9 : Call Month_incr
Case 11 : Call Month_incr
End Select
End If 'koniec warunku
If Day = 32 Then 'jeżeli wartość dnia miesiąca
osiągnęła 32, to:
Select Case Month 'w zależności od aktualnego
miesiąca wezwij podprogram zakończenia miesiąca:
Case 1 : Call Month_incr
Case 3 : Call Month_incr
Case 5 : Call Month_incr
Case 7 : Call Month_incr
Case 8 : Call Month_incr
Case 10 : Call Month_incr
Case 12 : Call Month_incr
End Select
End If 'koniec warunku
If Month = 13 Then Month = 1
'jeżeli wartość miesiąca
osiągnęła 13, to wartość miesiąca staje się równa 1
End Sub
Sub Month_incr 'podprogram zakończenia miesiąca
Incr Month
Lcd Minutes ; ":" ;
'wyświetl wartość minut
If Seconds < 10 Then Lcd "0";
'jeżeli wartość sekund jest
mniejsza od 10, to wyświetl zero wiodące
Lcd Seconds 'wyświetl wartośc sekund
X = Makebcd(hours)
'przedstaw wartość godzin w
kodzie BCD
I2csend 112 , X
'wyślij otrzymaną wartość na
magistralę I 2 C pod adres 112
X = Makebcd(minutes)
'przedstaw wartość minut w
kodzie BCD
I2csend 114 , X
'wyślij otrzymaną wartość na
magistralę I 2 C pod adres 114
X = Makebcd(seconds)
'przedstaw wartośc sekund w
kodzie BCD
I2csend 116 , X
'wyślij otrzymaną wartość na
magistralę I 2 C pod adres 116
End If
'koniec warunku i wyświetlania danych
Set S1
'spróbuj ustawić stan wysoki na
przycisku S1
If S1 = 0 Then Call Display_date
'jeżeli próba nieudana (przycisk
naciśnięty) to przejdź do podprogramu
wyświetlania daty
'zwiększ wartość miesiąca
Set S4
'spróbuj ustawić stan wysoki na
przycisku S4
Day = 1
'dzień równy 1
End Sub
If S4 = 0 Then Call Settime
'jeżeli próba nieudana, to wezwij
podprogram ustawiania czasu
Takich rozwiązań może być wiele. Każdy
z nas ma do dyspozycji, i to całkowicie za dar−
mo, zegar wskazujący czas z dokładnością do
1 sekundy na 5 milionów lat. Mam tu na my−
śli atomowy wzorzec czasu DCF dostępny za
pośrednictwem fal radiowych na terenie całej
Europy. Jednak zegar wykorzystujący do ko−
rekty czasu sygnał DCF jest urządzeniem dość
skomplikowanym lub raczej wymagającym
bardziej skomplikowanego programu i nieco
"lepszego" procesora niż nasz miniaturowy
zegarek. A zatem synchronizacją wskazań ze−
gara za pomocą sygnału DCF zajmiemy
się później, a dla naszego prostego układziku
poszukajmy innego, tańszego i prostszego
rozwiązania. Zastosowanie kosztownego ge−
neratora kwarcowego, odpornego na zmiany
temperatury i dającego dokładność rzędu
Loop
End Sub
Listing 4 pokazuje podprogram ustawiania
bieżącego czasu. Podprogram ustawiania daty
zbudowany jest prawie identycznie i nie ma w tej
chwili sensu szczegółowo się nim zajmować.
'Liistiing 4
Sub Settime
Cls
'wyczyść ekran wyświetlacza
Setting_flag = 1
'zmienna pomocnicza
SETTING_FLAG przyjmuje wartość 1 zezwalającą na
wyświetlenie danych
Temp1 = Hours 'zmienna pomocnicza TEMP1
przyjmuje wartość godzin
Temp2 = Minutes
'zmienna pomocnicza TEMP2
przyjmuje wartość minut
16
Elektronika dla Wszystkich
649418594.018.png 649418594.019.png
Projekty AVT
Waitms 255 'zaczekaj 255 ms
Do
Do
If Setting_flag = 1 Then
'jeżeli zmienna pomocnicza
SETTING_FLAG ma wartość 1, to:
Home 'ustaw kursor na pierwszej pozycji
Lcd "Set time: " 'wyświetl komunikat
If Temp1 < 10 Then Lcd "0";
'jeżeli wartość zmiennej TEMP1
jest mniejsza od 10, to wyświetl zero wiodące
Lcd Temp1 ; ":" ; 'wyświetl wartość zmiennej
Niestety, program ten zawierał pewne, dość
istotne błędy, uniemożliwiające poprawne
wyświetlanie temperatur ujemnych i w takiej
postaci został niegdyś opublikowany przeze
mnie w Elektronice Praktycznej. Błędy algo−
rytmu konwersji danych zostały zauważone
i poprawione przez Kolegę Artura Klimu−
szko (artx@poland.com), a ja korzystam
z okazji do złożenia Mu podziękowań.
Lcd "0," ; T 'wyświetl zero wiodące
Else 'w przeciwnym przypadku
If T < 0 And T > −10 Then
'jeżeli temperatura mniejsza od zera, to:
Locate 1 , 7
'ustaw kursor na pozycji 7
T = T * −1
'przelicz wartość temperatury
Lcd "−0," ; T
'dodaj zero wiodące ze znakiem "−"
Else
'w przeciwnym przypadku:
Locate 1 , 8
'ustaw kursor na pozycji 8
Lcd T 'wyświetl wartość temperatury
T = T / 10
'podziel wartość temperatury przez 10
Locate 1 , 7
'cofnij kursor na pozycję 7
Lcd T ; ","
'wyświetl wartość temperatury
+ znak dziesiętny
TEMP1
If Temp2 < 10 Then Lcd "0";
'jeżeli wartość zmiennej TEMP2
jest mniejsza od 10, to wyświetl zero wiodące
Lcd Temp2 ; 'wyświetl wartość zmiennej
'Liistiing 5
TEMP2
'UWAGA: zmienna SECONDS_CORRECTION musi
być zadeklarowana jako SINGLE, aby umożliwić przyj−
mowanie wartości mniejszych od zera
Sub Set_correction
Cls
Setting_flag = 0 'wprowadź zakaz wyświetlania
danych aż do wprowadzenia zmiany którejś
z wartości
End If 'koniec warunku i koniec wyświetlania
Waitms 255 'zaczekaj 255 ms
Set S2 'spróbuj ustawić stan wysoki na
przycisku S2
If S2 = 0 Then 'jeżeli próba nieudana (przycisk
naciśnięty), to:
Incr Temp1 'zwiększ wartośc zmiennej
'wyczyść ekran wyświetlacza
End If 'koniec warunku
End If
Do
Home 'ustaw kursor na pierwszej pozycji
Lcd "Correction: " ; Seconds_correction ; " "
'wyświetl komunikat i aktualną
wartość korekty czasu
Waitms 255 'zaczekaj 255 ms
Set S2 'spróbuj ustawić stan wysoki na
przycisku S2
If S2 = 0 And Seconds_correction < 20 Then Incr
Seconds_correction
'jeżeli przycisk naciśnięty i wartość
współczynnika korekty jest mniejsza od 20, to zwiększ
wartość zmiennej SECONDS_CORRECTION
Set S3 'spróbuj ustawić stan wysoki na
przycisku S3
If S3 = 0 And Seconds_correction > −20 Then Decr
Seconds_correction
'jeżeli przycisk naciśnięty i wartość
współczynnika korekty jest większa od −20, to zmniejsz
wartość zmiennej SECONDS_CORRECTION
Loop
End Sub
Sub Read1820
1wreset
1wwrite &HCC 'żądanie zgłoszenia się układu
dołączonego do magistrali 1WIRE
1wwrite &HBE'żądanie podanie wyniku pomiaru
temperatury
'koniec warunku
TEMP1
Setting_flag = 1 'udziel zezwolenia na aktualizację
wyświetlania danych
Bd(1) = 1wread(9)
'odczytanie wyniku
Tmp = Bd(1) And 1
'ta i dalsze linie: konwersja odczytanego
wyniku do postaci liczby dziesiętnej
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50
T = T − 25
T1 = Bd(8) − Bd(7)
T1 = T1 * 100
T1 = T1 / Bd(8)
T = T + T1
T = T / 10
End Sub
If Temp1 = 24 Then Temp1 = 0
'jeżeli zmienna TEMP1
przekroczyła wartość 23, to zmienna TEMP1
przyjmuje wartość 0
End If 'koniec warunku
Set S3 'spróbuj ustawić stan wysoki na
przycisku S3
If S3 = 0 Then 'jeżeli próba nieudana (przycisk
naciśnięty), to:
Incr Temp2 'zwiększ wartośc zmiennej
TEMP2
Setting_flag = 1 'udziel zezwolenia na aktualizację
wyświetlania danych
Set S4
'spróbuj ustawić stan wysoki na
przycisku S4
If S4 = 0 Then Call Display_time
'jeżeli przycisk naciśnięty, to powróć
do podprogramu wyświetlania czasu
If Temp2 = 60 Then Temp2 = 0
'jeżeli zmienna TEMP2
przekroczyła wartość 59, to zmienna TEMP1 przyjmu−
je wartość 0
Loop
End Sub
End If 'koniec warunku
Set S4 'spróbuj ustawić stan wysoki na
przycisku S4
If S4 = 0 Then 'jeżeli próba nieudana (przycisk
naciśnięty), to:
Hours = Temp1 'zmienna godzin przyjmuje
wartość zmiennej TEMP1
'Liistiing 6
Na tym możemy zakończyć pobieżne
omawianie programu sterującego pracą na−
szego zegarka. Chciałbym, aby Czytelnicy
potraktowali zaprezentowane listingi jedynie
jako wskazówki do samodzielnego napisania
programu sterującego pracą zegara. Oczywi−
ście, zaprogramowane procesory będą do−
starczane w kitach, a także dołączane do pły−
tek obwodów drukowanych, ale samodzielne
napisanie programu będzie zawsze najwięk−
szą satysfakcją dla Konstruktora.
Sub Display_temperature
1wreset 'inicjalizacja magistrali 1WIRE
If Err = 1 Then 'jeżeli do magistrali nie jest
dołączony termometr DS1820, to:
Cls 'wyczyść ekran wyświetlacza
Lcd " NO SENSOR"
'wyświetl komunikat o braku
termometru
Minutes = Temp2
'zmienna minut przyjmuje wartość
zmiennej TEMP2
Seconds = 0 'licznik sekund zostaje
wyzerowany
Call Set_correction
'wezwij podprogram ustawiania
korekty czasu
Wait 1 'zaczekaj 1 sekundę
Call Display_time 'ponownie wezwij podprogram
wyświetlania aktualnego czasu
End If
'koniec warunku
Loop
End Sub
End If
'koniec warunku
Montaż i uruchomienie
Na rysunku 2 została pokazana mozaika
ścieżek płytki obwodu drukowanego wyko−
nanego na laminacie jednostronnym oraz
rozmieszczenie na niej elementów. Tak wła−
ściwie to mamy do dyspozycji aż dwie płyt−
ki: druga z nich może posłużyć jako w miarę
estetyczna płyta czołowa, umożliwiająca
szybkie wykonanie obudowy do zegarka.
Montaż układu wykonujemy typowo,
z następującym wyjątkiem: wyświetlacz al−
fanumeryczny i przyciski S1...S4 muszą
zostać zamontowane od strony ścieżek, po
uprzednim wlutowaniu wszystkich pozo−
stałych elementów. Do zamocowania
wyświetlacza wygodnie będzie użyć poje−
dynczego szeregu goldpinów. Przed osta−
tecznym zamontowaniem wyświetlacza
musimy bardzo dokładnie sprawdzić ja−
kość wykonania pozostałych połączeń,
Warto jeszcze przyjrzeć się podprogramo−
wi ustawiania korekty czasu przedstawione−
mu na listingu 5 .
Nie mieliśmy jeszcze okazji wspomnieć
o kolejnej funkcji naszego zegara, nie związa−
nej tym razem z pomiarem upływu czasu. Jest
nią wbudowany w program obsługi zegara
moduł pomiaru temperatury w otoczeniu.
Do pomiaru temperatury wykorzystany
został popularny układ termometru cyfro−
wego DS1820 produkcji firmy DALLAS.
Procedury odczytu temperatury z tego ukła−
du i wyświetlania wyników pomiaru na wy−
świetlaczu LCD zostały pokazane na listin−
gu 6 . Procedura kalkulacji otrzymanych
z układu danych w celu uzyskania rozdziel−
czości 0,1 stopnia jest wzorowana na progra−
mie opublikowanym przez firmę MCS Elec−
tronics na jej stronie www.mcselec.com.
Do
1wwrite &HCC 'żądanie zgłoszenia się układu
dołączonego do magistrali 1WIRE
1wwrite &H44 'rozpoczęcie konwersji analogowej
wartości zmierzonej temperatury na postać cyfrową
Waitms 255 'zaczekaj 255 ms
Waitms 255 'zaczekaj 255 ms
Waitms 255 'zaczekaj 255 ms
Set S1
'spróbuj ustawić stan wysoki na
przycisku S1
If S1 = 0 Then Call Display_time
'jeżeli próba nieudana (przycisk
naciśnięty), to wezwij podprogram wyświetlania czasu
Call Read1820
'wezwij podprogram odczytu
danych z termometru DS1820
Cls 'wyczyść ekran wyświetlacza
Locate 1 , 3 'ustaw kursor na wskazanej pozycji
Lcd "T = " 'wyświetl literę "T"
Locate 1 , 12 'ustaw kursor w 12 kolumnie
Lcd Chr(0) ; "C" 'wyświetl symbol stopnia
If T < 10 And T >= 0 Then
'jeżeli temperatura mniejsza od 10
a większa od zera, to:
Locate 1 , 7'na pozycji 7
Elektronika dla Wszystkich
17
649418594.020.png 649418594.021.png
Projekty AVT
ponieważ po zamontowaniu tego elementu
utracimy dostęp do położonych pod nim
ścieżek i punktów lutowniczych .
Po zmontowaniu płytki bazowej zegara
pozostanie nam już tylko połączenie jej
z płytą czołową, o ile oczywiście zechcemy
wykorzystywać ten dodatkowy element. Po−
łączenia możemy dokonać za pomocą czte−
rech śrubek M3, których łebki przylutujemy
do dużych punktów lutowniczych zlokalizo−
wanych na spodniej stronie płyty czołowej.
Podłużne punkty lutownicze umieszczone
także na spodniej stronie płyty czołowej mo−
gą posłużyć do przylutowania do nich pa−
sków laminatu lub cienkiej blachy stanowią−
cych boczne ścianki obudowy zegara.
Po wykonaniu tych wszystkich czynności
możemy już włączyć zasilanie zegara, czyli
dołączyć do złącza CON1 napięcie +5VDC,
stabilizowane. Jako źródło zasilania najle−
piej wykorzystać zasilacz tzw. "wtyczkowy"
o dowolnej obciążalności prądowej.
Pobór prądu przez nasz zegar jest bardzo
mały i z wyświetlaczem alfanumerycznym
bez podświetlania nie przekracza 20mA. Na
płytce umieszczone zostało dodatkowe złą−
cze, oznaczone jako BT1. Do tego złącza mo−
żemy dołączyć baterię składającą się z czte−
rech ogniw R6 lub AAA, pełniącą rolę zasila−
nia awaryjnego, podtrzymującego wskazania
zegara podczas przerw w zasilaniu z sieci.
Funkcje klawiszy S1...S4
Klawisz S1: Kolejne naciśnięcia tego klawi−
sza powodują przechodzenie układu do wy−
świetlania: czasu, daty, czasu ustawiania bu−
dzika, wyświetlania temperatury.
Klawisz S4: Naciśnięcie tego klawisza pod−
czas wyświetlania czasu, daty lub czasu bu−
dzenia powoduje przejście układu w tryb
ustawiania wymienionych wartości. Powtór−
ne naciśnięcie S4 powoduje powrót do wy−
świetlania danych.
Klawisz S3: W trybie ustawiania cyklicznie
zwiększa wartość godzin lub dni miesiąca.
Podczas ustawiania korekty czasu zmniejsza
jej wartość. W trybie wyświetlania danych
włącza/wyłącza budzik.
Klawisz S2: W trybie ustawiania cyklicznie
zwiększa wartość minut lub miesiąca. Pod−
czas ustawiania korekty czasu zwiększa jej
wartość.
Na rysunku 3 zo−
stał pokazany sposób
połączenia termome−
tru DS1820 z ukła−
dem zegara. Prze−
wód łączący termo−
metr z zegarkiem
może być praktycz−
nie dowolnej długo−
ści (do 100 m).
Na rysunku 4
przedstawiono sche−
mat połączenia zega−
ra z modułem wy−
świetlaczy siedmio−
segmentowych LED
AVT−859. Drugi mo−
duł AVT−859 podłą−
cza się do linii iden−
tycznie.
Rys. 2 Schemat montażowy
Rys. 3
Rys. 4
Wykaz elementów
Kondensatory
C1,, C2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33pF
C3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 µ F/16V
C4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100
F/16V
C5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100nF
Rezystory
PR1 . . . . . . . . . .pottencjjomettr monttażowy miiniiatturowy 1k
R1,, R3,, R4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10k
R2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4,,7k
µ
Półprzewodniki
D2,, D1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1N4001
IIC1 . . . . . . . . . . . . . .zaprogramowany procesor AT89C4051
T1,, T2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .BC548
Dodattkowo ukłład termomettru DS1820
Pozostałe
DP1 . . . . . . . . . . . . . . . . .wyświiettllacz allffanumeryczny 16*1
CON1,,CON4 . . . . . . . . . . . . . . . . . . . . . . . . .ARK2 (3,,5mm)
CON2,,CON3 . . . . . . . . . . . . . . . . . . . . . . . .ARK3 (3,,5mm)
CON5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4x golldpiin
PK1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .OMRON 5V
Q1 . . . . . . . . . . . . . . . . . . .rezonattor kwarcowy 11..059MHz
S1,, S2,, S3,, S4 . . . . . . . . . . . . .przyciisk miicroswiittch 16mm
Rząd 14 golldpiinów do zamocowaniia wyświiettllacza
Zbigniew Raabe
e−mail: zbigniew.
raabe @edw.com.pl
Komplet podzespołów z płytką
jest dostępny w sieci handlowej AVT
jako kit szkolny AVT−2488
18
Elektronika dla Wszystkich
649418594.022.png 649418594.023.png 649418594.024.png 649418594.025.png 649418594.026.png 649418594.027.png 649418594.028.png 649418594.029.png 649418594.030.png 649418594.031.png 649418594.032.png 649418594.033.png 649418594.034.png 649418594.035.png 649418594.036.png 649418594.037.png 649418594.038.png 649418594.039.png 649418594.040.png 649418594.041.png 649418594.042.png 649418594.043.png 649418594.044.png 649418594.045.png 649418594.046.png 649418594.047.png 649418594.048.png 649418594.049.png 649418594.050.png 649418594.052.png 649418594.053.png 649418594.054.png 649418594.055.png 649418594.056.png 649418594.057.png 649418594.058.png 649418594.059.png 649418594.060.png 649418594.061.png 649418594.063.png
Zgłoś jeśli naruszono regulamin