- wskazywanie czasu (godzin i minut) w trybie 24-godzinnym,
- wskazywanie aktualnego dnia tygodnia przy użyciu pełnego słowa w języku polskim lub angielskim,
- podtrzymanie odliczania po zaniku zasilania,
- wybór koloru tła i liter przy użyciu zworki,
- zasilanie napięciem stałym 4,5…15 V, ok. 60 mA.
Na łamach EP opublikowano wiele różnych zegarów, lecz każdy różnił się od pozostałych. Ten zegar ma wbudowany wyświetlacz graficzny o przekątnej 1,8 ”, który może wyświetlać czarne litery na białym tle bądź odwrotnie. Cyfry o wysokości ok. 9 mm są widoczne z daleka i czytelne nawet w słoneczny dzień.
Budowa
Schemat ideowy układu pokazano na rysunku 1. Funkcjonowaniem całego urządzenia steruje mikrokontroler STM32F051K8T6. Spośród jego licznych peryferiów w tym projekcie mają zastosowanie: I2C do komunikacji z układem RTC oraz SPI, którym przebiega komunikacja z wyświetlaczem graficznym.
Częstotliwość zegara mikrokontrolera wynosi 48 MHz i nie musi być szczególnie stabilna, ponieważ nie służy do odmierzania czasu. Mikrokontroler w tej wersji obudowy nie ma dodatkowego wejścia zasilania bateryjnego, które mogłoby podtrzymywać odliczanie wewnętrznego RTC, dlatego użyto zewnętrznego układu.
Do programowania pamięci Flash mikrokontrolera zostało przewidziane złącze J3, na które wyprowadzono cztery podstawowe linie interfejsu SWD: NRST, SWCLK, SWDIO oraz masę. Linie sygnałowe zostały podciągnięte do zapięcia zasilającego przy użyciu rezystorów R7…R9, aby odprowadzać z nich ładunki elektrostatyczne, które mogłyby zakłócać prawidłowe działanie układu. Kondensator C11 jest zalecany przez producenta mikrokontrolera i służy chwilowemu wymuszeniu sprzętowego zerowania układu po włączeniu zasilania.
Do wyświetlacza graficznego zostały dołączone dwie linie sprzętowego interfejsu SPI1. Są to MOSI (wyjście danych z układu nadrzędnego) i SCK (sygnał zegarowy danych), oznaczone na schemacie jako SDI i SCLK. Użycie sprzętowego interfejsu, zarządzanego przez DMA, pozwoliło na znacznie przyspieszenie przesyłu danych, których ilość, składająca się na jeden pełny obraz, jest pokaźna. Pozostałe linie (A0 - wybór dane/komenda, RESET - sprzętowe zerowanie, CS - wybór układu) są zarządzane czysto programowo, ponieważ nie są krytyczne czasowo.
Do ustawiania aktualnego czasu (minut, godzin i dni tygodnia) służą przyciski S1…S3, których jednokrotne przyciśnięcie powoduje zmianę danej wartości o 1. Aby zapobiec przypadkowej zmianie, dodano przycisk S4, który trzeba trzymać wciśnięty, żeby regulacja była możliwa. Bez tego nie jest możliwe wymuszanie niskiego stanu logicznego na odpowiednich liniach prowadzących do mikrokontrolera, natomiast stan wysoki po zwolnieniu przycisków utrzymują rezystory R2…R4.
Użytkownik może wybrać kolor tła i znaków. Kiedy zworka JP1 jest zwarta, wejście mikrokontrolera jest w stanie niskim i układ wyświetla czarne znaki na białym tle. Po jej rozwarciu rezystor podciągający R1 ustala jej stan na wysoki i kolory odwracają się: znaki stają się czarne, a tło białe.
Układ zegara czasu rzeczywistego (US3) został podłączony według podstawowej aplikacji, zalecanej w nocie katalogowej. Linie magistrali I2C zostały podciągnięte rezystorami o wartości 3,3 kΩ, aby zapewnić odpowiednio krótki czas narastania napięcia - maksymalnie 1 μs. To przekłada się na maksymalną pojemność obciążającą linię równą 138 pF - w tym układzie nie przekracza ona połowy tej wartości. Rezonator kwarcowy Q1 powinien być przystosowany do współpracy z pojemnością obciążenia około 12,5 pF. W takich warunkach producent deklaruje prawidłową pracę zegara.
Cały układ musi być zasilany stabilizowanym napięciem stałym o wartości 3,3 V. Dlatego na płytce znalazł się liniowy stabilizator LDO (US1), który może pracować przy napięciu wejściowym wynoszącym od ok. 4,4 V, ponieważ jego maksymalny dropout wynosi 1,1 V (przy prądzie 100 mA). Z kolei, od góry napięcie wejściowe jest ograniczone wytrzymałością stabilizatora: producent deklaruje tutaj 15 V. Kondensatory usytuowane w bliskim otoczeniu stabilizatora LDO zapobiegają jego wzbudzaniu.
Montaż i uruchomienie
Układ zegara został zmontowany na dwustronnej płytce drukowanej o wymiarach 60×56 mm, której wzór ścieżek i schemat montażowy pokazuje rysunek 2. W odległości 3 mm od krawędzi znajdują się otwory montażowe.
Wszystkie elementy, poza złączem żeńskim dla wyświetlacza, są montowane od strony spodniej (BOTTOM). Kondensator C1 i rezonator kwarcowy Q1 warto przylutować na nieco dłuższych wyprowadzeniach, aby można było je położyć na powierzchni płytki. Zmontowany układ można zobaczyć na fotografii 3.
Jeżeli w miejscu eksploatacji urządzenia jest dostęp do stabilizowanego napięcia stałego o wartości 3,3 V, można nie montować układu US1, a pola lutownicze prowadzące do jego wejścia i wyjścia zewrzeć np. odcinkiem srebrzanki. Rysunek 4 ilustruje, które to wyprowadzenia.
Jeżeli płytka została prawidłowo zmontowana, w złącze J2 należy wetknąć męskie złącze wyświetlacza. Polecam przykręcić go do płytki przy użyciu czterech tulei dystansowych M3. Aby obie części idealnie do siebie pasowały, ich długość powinna wynosić ok. 11 mm, a takie są trudne do zdobycia. Można użyć tulei o długości 12 mm i pogodzić się z tym, że szpilki części męskiej będą nieco wystawiały, co nie powinno mieć wpływu na ich dobry kontakt. Można też użyć tulei 10 mm oraz podkładki o grubości ok. 1 mm - przykład takiego połączenia pokazuje fotografia 5.
Po zakończeniu montażu do złącza J1 należy doprowadzić zasilanie (polaryzacja: biegun dodatni na bolcu złącza) oraz zaprogramować pamięć Flash mikrokontrolera gotowym wsadem. Jeżeli wszystko przebiegło poprawnie, na wyświetlaczu powinny pojawić się cyfry, migający dwukropek oraz nazwa dnia tygodnia. Można włożyć baterię litową typu CR2032 w gniazdo B1, aby zegar odliczał czas po wyłączeniu zasilania.
Eksploatacja
Podczas ustawiania aktualnego czasu należy pamiętać o tym, że każda wprowadzona wartość jest natychmiast zapisywana do układu RTC oraz natychmiast z niego odczytywana. W ten sposób mikrokontroler nie musi pilnować automatycznej inkrementacji pozostałych zmiennych czasowych, ponieważ robią to rejestry i liczniki w układzie RTC. Po ustawieniu np. aktualnej wartości minut, po przekroczeniu liczby 59, licznik minut przepełni się i wróci do zera, a licznik godzin przeskoczy o 1 w górę. Stąd wynika zalecana przeze mnie kolejność ustawiania czasu:
- Minuty (przycisk S2 - środkowy)
- Godziny (przycisk S3 - prawy)
- Dni (przycisk S1 - lewy)
Przyciski są aktywne tylko wtedy, kiedy stale przyciśnięty jest również przycisk S4 (od spodu). Każdorazowe przestawienie liczby minut przez użytkownika powoduje jednoczesne wyzerowanie rejestru sekund.
Przy ustawieniu dni tygodnia do wyboru są dwie opcje: nazwy w języku polskim (z polskimi znakami: ł, ś, ą) lub angielskim. Wyboru języka dokonuje się bardzo łatwo - wystarczy ustawić którykolwiek z napisów po polsku, a układ dalej samoczynnie będzie „krążył” od poniedziałku do niedzieli. Analogicznie, ustawiając napis po angielsku, otrzymany tylko napisy angielskie.
Widok wyświetlacza, w którym tło jest białe, a znaki czarne, można zobaczyć na fotografii 6. Wyboru koloru tła można w każdej chwili dokonać, zakładając lub zdejmując zworkę JP1.
Pobór prądu ze źródła zasilania nie zależy od koloru tła czy aktualnej zawartości wyświetlacza i wynosi ok. 60 mA.
Dla dociekliwych
Zegar zapamiętuje, jaki język został wybrany dla dni tygodnia. Jednak użyty mikrokontroler nie ma nieulotnej pamięci EEPROM, której można użyć w tym celu. Zadanie to realizuje jeden bit (D6) znajdujący się w rejestrze godzin (adres 2) układu M41T00 - na rysunku 7 zaznaczony na czerwono.
Jest to bit CB, oznaczający aktualny wiek. Ponieważ jego automatyczna zmiana jest wyłączona (bit CEB = 0), wartość może edytować jedynie mikrokontroler. Nie ulegnie zgubieniu po zaniku zasilania, gdyż wszystkie rejestry są podtrzymywane bateryjnie. Nieco komplikuje to procedurę zapisu nowego czasu, ponieważ aktualizując godziny lub dni, trzeba również pamiętać o tym bicie. Fragment kodu programu, który obsługuje te rejestry, widoczny jest na listingu 1.
Listing 1. Fragment kodu programu, który inkrementuje dzień tygodnia
day_temp++; //przewijanie dni w zakresie 0-13
if(day_temp > 13){
day_temp = 0;
}
//do rejestru dni trafia tylko liczba z przedziału 1-7
day = (day_temp%7)+1;
//adres tego rejestru to 3
RegWrite(3, day);
//0-6 polskie nazwy dni
//7-13 angielskie nazwy dni
if(day_temp >= 7) { //dla wersji ENG
//CB = 1, godzina w kodzie BCD
day_temp = ((hour / 10) << 4) + (hour%10) + (1 << 6);
//informacja dla funkcji wyświetlającej, że wybrano język angielski
lang = 1;
//dla wersji PL
} else {
//CB = 0, godzina w kodzie BCD
day_temp = ((hour / 10) << 4) + (hour%10);
//informacja dla funkcji wyświetlającej, że wybrano język polski
lang = 0;
}
//zapisz godzinę z odpowiednim bitem CB do rejestru o adresie 2
RegWrite(2, day_temp);
Michał Kurzela, EP
- R1, R7…R9: 10 kΩ SMD0805
- R2…R6: 3,3 kΩ SMD0805
- C1: 220 μF/25 V THT
- C2, C4, C6, C7, C10, C11: 100 nF SMD0805
- C3, C5, C8, C9: 10 μF/16 V SMD0805
- US1: LD1117AS33TR SOT223 (opis w tekście)
- US2: STM32F051K8T6 TQFP32
- US3: M41T00 SO8
- B1: koszyk CR2032 THT leżący + bateria
- J1: gniazdo DC kątowe THT 2,1 mm/5,5 mm
- J2: goldpin 8 pin żeński THT 2,54 mm
- J3: goldpin 4 pin męski THT 2,54 mm
- JP1: goldpin 2 pin THT męski + zworka
- S1…S4: mikroswitch 6 mm kątowy
- Q1: 32768 Hz 12,5 pF THT (opis w tekście)
- Wyświetlacz 1.8TFT SPI 128×160 V1.1
- 4 tuleje dystansowe M3 gwint zew./wew. 12 mm mosiądz (opis w tekście)
- 4 nakrętki M3
- 4 śruby M3 5 mm