Zegarek z ds.QXD

Transkrypt

Zegarek z ds.QXD
++
Zegar-budzik
z dwupunktowym
termometrem DS1624
Do czego to służy?
Prezentowane urządzenie jest mikroprocesorowym zegarem z budzikiem, mającym jednak cechę wyróżniającą go spośród licznych
rozwiązań – możliwość dokonywania dwupunktowego pomiaru temperatury przy pomocy czujników firmy Dallas DS1624 i, jak
się zaraz okaże, możliwość prezentacji wyników w dowolnym zestawieniu.
Jak to działa?
Na początku opisu należy się Czytelnikom
krótkie wyjaśnienie dlaczego wybrałem akurat czujniki DS1624, a nie np. DS1920. Jak
wiadomo, te ostatnie sterowane są przez jednoprzewodową magistralę 1-Wire, natomiast
te zastosowane w projekcie komunikują się
z procesorem za pomocą magistrali I2C. Wybór padł na układy 1624 z dwóch powodów:
- chęć opisania budowy termometru opartego
na innych układach niż te, często stosowane
przez autorów AVT,
- pokazanie ciekawego sposobu przetwarzania danych pobranych z tego typu
czujników.
Rys. 1
Schemat elektryczny zegara pokazany jest na rysunku 1. Od razu uderza wyjątkowa prostota układowa. Rolę portu I2C spełniają dwa najmłodsze
bity portu P1. Są to wejścia wewnętrznego komparatora, dlatego też koniecznym było podciągnięcie ich do
plusa zasilania poprzez rezystory. Do
magistrali dołączone są kolejno dwa
czujniki DS1624. W odróżnieniu od
układów 1-Wire, które to posiadają
swój unikatowy numer seryjny, układy
dołączane do magistrali I2C wybierane
są przez podanie adresu ustalonego
(w pewnym zakresie) przez użytkownika, poprzez odpowiednie spolaryzowanie wejść A0-A2. Tego typu rozwiązanie ogranicza użycie na jednej magistrali więcej niż ośmiu takich elementów. W opisywanym układzie czujnik,
umownie nazwany wewnętrznym,
18
ma adres bazowy 144, czujnik zewnętrzny
146. Jeśliby ustawić w obu czujnikach ten sam
adres, na pewno wystąpiłby konflikt, a wyniki byłyby błędne, bądź ich odczytanie stałoby się niemożliwe. Obwód rezonansowy procesora wykonany jest w standardowy i sprawdzony sposób. Z doświadczenia także wiadomo, że do poprawnego restartu procesora po
włączeniu napięcia zasilania wystarczy jedynie kondensator 1µF włączony między plus
zasilania, a końcówkę RST. Linie P1.7 do
P1.2 służą komunikacji procesora z wyświetlaczem LCD o organizacji 1*16. Dodatkowe
połączenia z wyświetlaczem to zasilanie i regulacja kontrastu potencjometrem PR1. Przyciski typu uswitch dołączone do wejść P3.2
P3.3 i P3.4 służą dokonywaniu nastaw. Buzzer
B1 generujący sygnał budzika sterowany jest
z końcówki P3.5. Zasilacz dla całego układu
oparty jest na stabilizatorze 7805 z diodą zabezpieczającą przed błędnym podłączeniem
napięcia zasilania, które powinno mieścić się
w przedziale 9-15V.
Generalnie program zbudowany jest tak,
że w zależności od aktualnego sposobu wyświetlania zbiera dane z czujników, liczy
czas, wyświetla wyniki i analizuje stan przycisków (źródło w postaci pliku *.bas dostępne jest na internetowej stronie EdW). Sposób
programowej generacji podstawy czasu dla
zegarka przedstawiony jest na listingu 1. Wykorzystany procesor to AT89C4051 posiadający w swym wnętrzu 4kB pamięci FLASH.
Taka pojemność okazała się potrzebna ze
względu na wykorzystanie dość skomplikowanych procedur przeliczeniowych.
Timer 1 pracuje z cyklicznym przepełnianiem wywołującym podprogram obsługi
przerwania, który po każdym piętnastym
przepełnieniu T1 zwiększa aktualny czas, do
wyświetlenia, o sekundę. Magiczna, ładowana wartość 4150, zapewniająca „wzorcowe”
odmierzanie części sekundy, została już
wcześniej opisana przez Zbigniewa Raabe
w kilku numerach EdW.
list 1
Config Timer0 = Timer ,
Gate = Internal , Mode = 1
Enable Timer0
On Timer0 Timer_0
Enable Interrupts
Counter0 = 4150
Start Timer0
Timer_0:
Counter0 = 4150
Start Timer0
Incr Czesc_sekundy
If Czesc_sekundy > 14 Then
Czesc_sekundy = 0
Incr Sekundy
If Sekundy > 59 Then
Sekundy = 0
Incr Minuty
If Minuty > 59 Then
Minuty = 0
Incr Godziny
If Godziny > 23 Then
Godziny = 0
End If
End If
End If
End If
Return
E l e k t ro n i k a d l a Ws z y s t k i c h
W podobnie prosty sposób odbywa się
pobieranie danych z czujników temperatury,
a ciekawostką jest to, że ramka danych jest
niestandardowa, bo 13 bitowa. Ponadto
temperatura kodowana jest w systemie liczbowym uzupełnień do dwóch, tzw U2. Obliczeniu poddaje się więc rzeczywistą 13 bitową liczbę spośród danej 16 bitowej, oblicza się właściwą temperaturę (korzystając
ze współczynnika przetwarzania) i zaokrągla wynik po przecinku. Listing 2 prezentuje cały ten proces. Zmienna Temp_1 przechowuje początkowo wartość pełnych stopni Celsjusza, Temp_2 zaś wartość po przecinku. Na podstawie wartości zwróconej
podczas odczytu czujnika do Temp_1 wnioskuje się o znaku
(+/-). Jeśli liczba list 2
w Temp_1 wyka- Sub Przeliczenie
Temp_1 >= 0 And
zuje, że badana If
Temp_1 < 126 Then
temperatura jest Minus = 0
ujemna następuje Temp_2 = Temp_2 / 8
Call Przelicz_single
przeliczenie całej Exit Sub
temperatury. Zao- Else
Minus = 1
krąglanie wykony- Temp_1 = 255 - Temp_1
wane jest w osob- Temp_2 = 255 - Temp_2
= Temp_2 + 1
nym podprogramie Temp_2
Temp_2 = Temp_2 / 8
ze względu na Call Przelicz_single
Sub
swoją „pamięcio- Exit
End If
żerność” przy ob- End Sub
słudze
dwóch
Sub Przelicz_single
czujników jedno- Temp = Temp_2 * 0.3125
cześnie.
Rys. 2 Wyprowadzenia AT89C4051
Wszelkich nastaw dokonuje się z poziomu
trzyprzyciskowej klawiatury. Możliwe jest:
sprawdzenie nastawy budzika i jego aktywację/dezaktywację, dokonanie nastaw budzika
i zegara z rozdzielczością minuty, zmiana czujnika, którego pomiar jest prezentowany, wybór
między wyświetlaniem zegara i wybranej temperatury i dwiema temperaturami bez zegarka.
Procedura odczytu danych z czujników
DS1624 jest „standardowa” jak na układy
I2C i przedstawiona jest na listingu 3.
Na początku, jeszcze przed pobieraniem
informacji o temperaturze, należy zainicjować działanie wewnętrznego przetwornika
pomiarowego. Robi się to wydając komendę
Start Convert T (EEh). Jak widać dotyczy
to obu czujników. Dopiero po takiej inicjalizacji można korzystać z podprogramu
E l e k t ro n i k a d l a Ws z y s t k i c h
Odczyt_temperatury, który zwraca list 3
odpowiednie da- I2cstart
I2cwbyte 144
ne do zmiennych I2cwbyte &HEE
konwersji
T e m p _ 1 'rozpoczęcie
I2cstop
i Temp_2. To, Waitms 10
z którego termo- I2cstart
I2cwbyte 146
metru aktualnie I2cwbyte &HEE
odczytywana jest I2cstop
wartość mierzo- Sub Odczyt_temperatury
na, zależy od I2cstart
Termometr
wartości zmien- I2cwbyte
I2cwbyte &HAA
nej Termometr I2cstart
i odpowiednio I2cwbyte Termometr_2
I2crbyte Temp_1 , Ack
Termometr_2.
I2crbyte Temp_2 , Nack
S t e r o w a n i e I2cstop
End Sub
odbywa się za pomocą 3-przyciskowej klawiatury. Każdy z przycisków jest
wielofunkcyjny, w zależności od tego jaką
funkcję aktualnie ustawia się. I tak:
Podczas normalnej pracy:
S1 – krótkie przyciśnięcie powoduje wyświetlenie nastawy budzika i jego stanu (aktywny/nieaktywny); dłuższe wciśnięcie powoduje zmianę stanu budzika na przeciwny,
S2 – wciśnięcie powoduje wejście do podmenu nastaw budzika i zegara,
S3 – wciśnięcie powoduje wejście do podmenu wyboru sposobu prezentacji pomiarów.
Po wejściu do podmenu nastaw
budzika i zegara:
S1 – wciśnięcie powoduje wejście w tryb
ustawiania budzika (S1 i S2 powodują inkrementację o jeden odpowiednio: godzin i minut; S3 kończy operację nastawiania),
S3 – wciśnięcie powoduje wejście w tryb
ustawiania zegara (S1 i S2 powodują inkrementację o jeden odpowiednio: godzin i minut; S3 kończy operację nastawiania).
Po wejściu do podmenu wyboru
sposobu prezentacji pomiarów:
S1 – wciśnięcie powoduje wejście do podmenu wyboru czujnika, którego pomiary prezentowane będą wraz z zegarem (S1 – czujnik wewnętrzny, S3 – czujnik zewnętrzny),
S2 – wciśnięcie powoduje przejście w tryb
wyświetlania obu temperatur jednocześnie,
bez wyświetlania zegarka (z lewej strony
temperatura wewnętrzna, z prawej zaś zewnętrzna).
Przy trybie wyświetlania jednej temperatury organizacja wyświetlacza jest następująca: GG:MM:SS_+/-TT.T0C. W przypadku
trybu prezentacji obu temperatur wygląda to
następująco: +/-TT.T0C__+/-TT.T0C (przy
czym +/- stanowi jedno pole i w przypadku
temperatur dodatnich pozostaje puste). Odświeżanie pozycji zawierających informacje
o temperaturze realizowane jest co
4s (w przypadku obu pomiarów – naprzemiennie co 2s).
W przypadku gdy zadziała budzik na wyświetlaczu pojawia się szlaczek, a z buzzera
rozlega się przerywany dźwięk. Wciśnięcie
któregokolwiek przycisku wyłącza budzik
i układ przechodzi do normalnej pracy.
Układ można zmontować na płytce uniwersalnej. Od razu działa poprawnie,
a krzaczki pojawiające się na pozycjach 14,
15 i 16, przez pierwsze 4s po włączeniu zasilania, są naturalnym objawem. Zakres pomiarowy termometrów DS1624 mieści się
w przedziale: [-55 do +125] 0C. Po włączeniu
urządzenie przechodzi do odczytu temperatury z układu o adresie bazowym 144.
Projekt ten dedykuję pamięci Zbigniewa Raabe.
Grzegorz Kaczmarek
[email protected]
Wykaz elementów:
Rezystory
R1,R2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1,1kΩ
PR1 . . . . . . . . . . . . . . . . . . . . . . . .10kΩ miniaturowy
Kondensatory
C1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100µF/25V
C2 . . . . . . . . . . . . . . . . . . . . . . . . .100nF ceramiczny
C3,C4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33pF
C5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1µF MKT
Półprzewodniki
D1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1N4148
IC1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .AT89C4051
IC2,IC4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .DS1624
IC3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7805
Inne
B1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .piezo 5V
S1-S3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .µswitch
Q1 . . . . . . . . . . . . . . . . . . . . . . . . .kwarc 11,059MHz
Wyświetlacz
19

Podobne dokumenty