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