Funkcjonalność DS3231 i obsługa w Bascom

Funkcjonalność DS3231 i obsługa w Bascom
5 (100%) 2 votes

Otworzyłem notkę katalogową i patrzę a tam bla bla bla blabllllaaaaa, że układ jest rozwiązaniem budżetowym, bla bla bllla super dokładnym blaa blllablablaa … hyyym,  zawsze jedno drugie wykluczało – ciekawe. Albo była jakość albo „rewelacyjna cena”.

Układ RTC jest bardzo interesującym rozwiązaniem z uwagi na zintegrowany rezonator kwarcowy, kompensację temperatury. Oraz dodatkowe funkcjonalności w postaci wzorcowego generatora sygnału 32kHz i cyfrowego termometru, możliwość bezpośredniego podłączenia baterii, programowo nastawiane wyjście z generatora częstotliwości. Bardzo intrygująca i kontrowersyjna jest wielkość obudowy zestawiona z ilością aktywnych wyprowadzeń ;-D
aplikacja z DS3231

moduł z widokiem DS3231SN

moduł z widokiem DS3231SN

opis wyprowadzeń DS3231
Wszystko zostało „upchnięte” w obudowie SO 16 (16-pin, 300-mil SO package). Jak już tak narzekam na te „niepotrzebne piny” to w tym momencie watro przytoczyć bardzo istotną uwagę: piny 5-12 N.C. No Connection. Must be connected to ground. I chyba pierwszy raz w życiu mam do czynienia z „delikatnym” IC. Wszystko dlatego, że użyto kamertonowego kryształu kwarcowego. Z tego tytułu scalak jest nieodporny na ultradźwięki, np z myjek ultradźwiękowych, a sprzęt typu pick-and-place też może go uszkodzić.
Układ jest produkowany w dwóch wersjach z uwagi na temperaturę otoczenia w jakiej może pracować. Wersja Commercial dla zakresu temperatur otoczenia 0°C to +70°C, układ oznaczony DS3231S, oraz wersja Industrial dla temperatur -40°C to +85°C, układ cechowany DS3231SN. Co znajdzie odzwierciedlenie na zakresach pomiaru temperatury przez IC. Dokładność RTC ma mieścić się w zakresie ± 2 minuty na rok ;-D
Do funkcjonowania układ potrzebuje napięcia zasilania z przedziału 2,3 do 5,5V DC. Pobór prądu przy zasilaniu VCC 5.5V ma być nie większy niż 300µA w trybie aktywnym. Jego magistrala I²C prawidłowo będzie obsługiwać komunikację w zakresie częstotliwości transmisji 100 do 400kHz. Układ zaprojektowano dla logiki 3,3V z tolerancją dla poziomów logicznych 5V. W trybie odczytu można go obsługiwać pod adresem bazowym 209, gdy będzie potrzeba zapisywać lub konfigurować rejestry należy posługiwać się adresem 208. Przy odczycie wielobajtowym, po przekroczeniu przez indeks adresu wartości maksymalnej czyli 12h, wskaźnik ustawiany jest na początek – 0h.

Address Map

zawiera wszystkie rejestry do odczytu zegara i kalendarza oraz rejestry konfiguracyjne i do ustawiania alarmów po załączeniu zasilania - pierwszy raz - stan rejestrów jest nieustalony.

Zawiera wszystkie rejestry
do odczytu zegara i kalendarza oraz rejestry konfiguracyjne i do ustawiania alarmów.
Po załączeniu zasilania – pierwszy raz – stan rejestrów jest nieustalony.

Dane dotyczące czasu i kalendarza zapisane są w rejestrach w systemie BCD (binary-coded decimal), tak jak w przypadku innych scalonych RTC. IC zapewnia prawidłową obsługę ilości dni w poszczególnych miesiącach oraz lat przestępnych. Godziny mogą być zliczane w trybie 12 lub 24 godzinnym. Przyrosty dzień tygodnia rejestrowane są o północy. Użytkownik samodzielnie przypisuje poszczególne dni do odpowiednich wartości, lecz warto to zrobić sekwencyjnie żeby nie wyszły bzdury, np 1- niedziela, 2 – poniedziałek, itd.
Do dyspozycji mamy również dwa alarmy, nieco zróżnicowane funkcjonalnie. Detale można wypatrzeć w zestawieniu poniżej.DS3231 tabela konfiguracji funkcji alarmówTeraz może zajmę się temperaturą ;-D

Temperature Registers adresy 11h–12h.

Temperatura jest reprezentowana z rozdzielczością 0,25 ° C, jako kod 10-bitowy. Wartość temperatury jest kodowana w formacie U2. Górne 8 bitów, reprezentuje część całkowitą, i zlokalizowane jest pod adresem 11h. Dolne 2 bity, części ułamkowej, upchane są jako najstarsze bity w lokalizacji 12h. Na przykład 00011001 01b = + 25,25 ° C. Po wyłączeniu zasilania, rejestry są zapisywane do temperatury domyślnej 0 °C, a sterownik zaczyna konwersję temperatury. Temperatura odczytywana jest po początkowym załączeniu zasilania VCC lub zainicjowaniu magistrali I2C na zasilaniu VBAT i później cyklicznie raz na 64 sekundy. Rejestry temperatury są aktualizowane po każdej konwersji wszczętej przez użytkownika i po każdych 64-sekundach. Rejestry temperatury można tylko do odczytywać. Czyli aby wyświetlić odczytaną temperaturę wykonujemy obliczenia analogicznie jak przy obsłudze sensora np DS18B20. Dobrać należy jedynie wskazanie wartości dziesiętnej według opisu.

Control Register (0Eh)

Bit 7: Enable Oscillator (EOSC).
Po ustawieniu na logiczne 0 oscylator jest uruchomiony. Po ustawieniu na logiczną 1 oscillator jest zatrzymany, wtedy gdy DS3231 przełącza się na zasilanie VBAT (dane w rejestrach są „zamrażane”). Kiedy DS3231 jest zasilany przez VCC, oscylator jest zawsze włączony, niezależnie od wartości bitu EOSC. Gdy zasilanie jest stosowane po raz pierwszy bit ten jest skasowany (logiczne 0).

Bit 6: Battery-Backed Square-Wave Enable (BBSQW).
Po ustawieniu na logiczną 1 przy INTCN = 0 i VCC <VPF, bit ten pozwala na generowanie przebiegu prostokątnego. Kiedy BBSQW jest logicznym 0, pin INT/SQW osiąga stan wysokiej impedancji, przy VCC < VPF.
Gdy zasilanie jest stosowane po raz pierwszy, bit ten jest kasowany (logiczne 0).

Bit 5: Convert Temperature (CONV).
Ustawienie tego bitu na 1 zmusza czujnik temperatury do konwersji temperatury na kod cyfrowy i wykonanie algorytmu TCXO – aktualizacja tabeli pojemności dla oscylatora. Ustawienie bitu może mieć miejsce tylko, gdy konwersja nie jest już w toku. Użytkownik powinien sprawdzić stan bitu BSY przed wymuszeniem wykonania nowej procedury TCXO. Przemiana temperatury inicjowana przez użytkownika nie wpływa na wewnętrzny cyklu aktualizacji (co 64-sekundy).
Dodatkowo konwersja temperatury inicjowana przez użytkownika nie ma wpływu na bit BSY przez około 2 ms.
Bit CONV pozostaje w stanie 1, do czasu dopóki nie jest zakończona konwersja, po którym to czasie zarówno CONV i BSY ustawione zostaną na logiczne 0. CONV bit powinien być wykorzystywany przy monitorowaniu statusu, dla konwersji inicjowanej przez użytkownika.

Bits 4 and 3: Rate Select (RS2 and RS1).
Bity stosowane do sterowania częstotliwością na wyjściu przebiegu prostokątnego, gdy funkcjonalność ta jest uaktywniona. Poniższa tabela pokazuje możliwe do uzyskania częstotliwości przebiegu. Gdy zasilanie jest zastosowane po raz pierwszy oba bity są ustawione na 1 (8.192kHz).DS3231 Square wave frequencyBit 2: Interrupt Control (INTCN).
Ten bit steruje sygnałem INT/SQW. Kiedy bit INTCN jest ustawiony na logiczne 0, przebieg prostokątny jest wyprowadzony na pin INT/SQW. Kiedy bit INTCN jest ustawiony na logiczne 1, a następnie wartość rejestru alarmu zrówna się z wartością rejestrów pomiaru czasu zostanie aktywowane wyjście INT/SQW (jeśli alarm jest również włączony).
Odpowiednia flaga Alarm jest zawsze ustawiona niezależnie od stanu bitu INTCN. Przy pierwszym uruchomieniu bit INTCN jest ustawiony na 1.

Bit 1: Alarm 2 Interrupt Enable (A2IE).
Po ustawieniu na logicznej 1, bit ten pozwala na alarm 2 flagi (A2F) bit w rejestrze statusu dochodzić INT/SQW (gdy INTCN = 1).
Kiedy bit A2IE jest ustawiony na logiczne 0 lub bit INTCN jest ustawiony na logiczne 0, nie jest inicjowany sygnał przerwania.
Przy pierwszym uruchomieniu bit A2IE jest wyłączony (logiczne 0).

Bit 0: Alarm 1 Interrupt Enable (A1IE).
Analogicznie jak A2IE.

Status Register (0Fh)

Bit 7: Oscillator Stop Flag (OSF).
Logiczne 1 wskazuje, że generator zarówno jest zatrzymany lub został zatrzymany przez pewien czas i stan tego bitu może być stosowany do oceny ważności danych pomiaru czasu. Ustawienie bitu na logiczne 1, spowoduje zatrzymanie oscylatora w dowolnej chwili. Poniżej podano przykłady warunków mogących wywoływać ustawienie bitu OSF:
1) Przy pierwszym włączeniu.
2) Napięcia występujące zarówno na VCC i VBAT są niewystarczające do wsparcia oscylacji.
3) EOSC bit jest wyłączony w trybie z podtrzymaniem bateryjnym.
4) wpływy zewnętrzne na kryształ (czyli szum, upływu lat, itp).
Bit ten pozostaje w stanie logicznej 1 dopóki nie zostanie zapisane logiczne 0.

Bit 3: Enable 32kHz Output (EN32kHz).
Bit kontrolny pinu 32kHz. Po ustawieniu logicznej 1, pin 32kHz jest aktywny i wysyła sygnał prostokątny 32.768kHz. Po ustawieniu na logicznego 0, pin 32kHz przechodzi w stan wysokiej impedancji. Stan początkowy stan tego bitu po załączeniu zasilania to logiczne 1, więc generator generuje sygnał (32.768kHz) prostokątny na pin 32kHz gdy źródło zasilania DS3231 jest
aktywne (jeśli oscylator pracuje).

Bit 2: Busy (BSY).
Ten bit sygnalizuje stan urządzenia w trakcie wykonywania funkcji TCXO. Przechodzi w logiczną 1 w trakcie operacji konwersji czujnika temperatury, a następnie jest kasowany, gdy urządzenie znajduje się w 1 minutowym „stanie bezczynności” między konwersjami.

Bit 1: Alarm 2 Flag (A2F).
Stan wysoki flagi alarmu 2 wskazuje, że aktualny czas jest identyczny dobranym w rejestrach Alarm 2. Jeśli bit A2IE jest w stanie logicznej 1 i bit INTCN jest ustawiony na logiczną 1, INT/SQW pin jest również wysterowany. A2F jest wyczyszczone po ustawieniu stanu niskiego (0). Bit ten może być zapisany tylko logicznym 0. Próba zapisu stanu wysokiego pozostawia wartość bez zmian.

Bit 0: Alarm 1 Flag (A1F).
Analogicznie jak A2IE.

Aging Offset (10h)

Rejestr „przesunięcie zestarzenia”  😆 przyjmuje wartość wprowadzoną przez użytkownika, w celu modyfikacji wartości pojemności w tablicach rejestru. Liczba jest kodowana w systemie U2, z 7 bitem reprezentującym znak. dzięki temu jest możliwość „regulowania” pojemności na stykach kryształu, przez programowe dodawanie lub ujmowanie małych kondensatorków.
Modyfikowanie pojemności ma też miejsce przy automatycznym cyklu kompensacji temperatury.
Offset rejestru dodaje się do pojemności matrycy w czasie normalnej przemiany temperatury, w przypadku zmiany temperatury otoczenia z poprzedniego cyklu konwersji lub podczas ręcznej konwersji użytkownika (ustawienie bitu CONV). Aby natychmiast zobaczyć efekty pracy „rejestru starzenia” na częstotliwości wyjściowej 32kHz, instrukcja wymiany powinna być uruchamiana po każdej zmianie „rejestru starzenia”.

Reasumując mamy do dyspozycji: precyzyjny zegarek z automatycznym  kalendarzem, termometr, dwa alarmy, programowalny generator przebiegu prostokątnego, wzorcowy generator częstotliwości 32kHz. A wszystko zarządzalne przez fast I2C Interface. Oczywiście nie opisałem wyżej wszystkiego dokładnie a jedynie przedstawiłem interesującą mnie większość ;-p  Ucieszył mnie jeden fakt gdy zabierałem się za oprogramowanie tego RTC. Zasadnicza część związana z obsługą zegarka i kalendarza jest identyczna jak w DS1307. Adresy układów i rejestrów, umieszczenie w nich danych są zgodne. To cieszy gdyż wystarczyło jedynie zastosować poprzednie procedury ;-D opisane w temacie DS1307 na “warsztacie”.

Zupełnie inną sprawą jest zapewnienie obsługi „dodatkowych” funkcjonalności. Na przykład w postaci pomiaru temperatury. I tym się teraz zajmę. Praktycznie co minutowe automatyczne odczyty są wystarczające w normalnej pracy. Przy testach i znęcaniu się nad układem przydała by się częstsza aktualizacja odczytów. Jest to możliwe jak wiemy z powyższego opisu, niemniej trzeba sobie ją oprogramować. O ile odczyty temperatur dodatnich sprawdzić można stosunkowo prosto, o tyle z wartościami ujemnymi już teoretycznie nie jest tak prosto. No niby można układ zapuszkować w zamrażalce lodówki ale przenoszenie połowy zabawek i 1/4 warsztatu na terytorium babajagi jest niebezpieczne dla życia i zdrowia ludzkiego ;-D Więc tym bardziej zablokowanie dostępu do tej specyficznej szafki domowej na czas testów nie wchodzi w rachubę. Efekt poniższy
zamrożony modułbez problemu można uzyskać w warunkach domowych bez zbliżania się do lodówki ;-p Niestety nie jest on długotrwały ze względu na panujące wokół ciepełko 😉 domowego zacisza. Dla dociekliwych, nie posiadam drogiego produktu firmy KONTAKT CHEMIE o nazwie FREEZE75, który to potrafi zamrozić na kość (ani podobnego). Osiągalną temperaturą ma być w jego przypadku -49°C. Cena za 200ml około 5 dych.  Swoją drogą korzystniej wychodzi produkt AG TERMOPASTY Zamrażacz – pojemność 600ml, temperatura schładzania -67°C, cena około 3 dychy. Może się pokuszę kiedyś na ten specyfik. Nie stosowałem też zamrażaczy na kurzajki które też mogą być ciekawą alternatywą … lecz kosztowną zestawiająć pojemność do ceny.  Hee no ja posłużyłem się sprężonym powietrzem w sprayu – powiedzmy używając go „niezgodnie z instrukcją” ;-P Osiągnięty rezultat możemy obejrzeć na uwiecznionej konsoli:

DS3231 terminal

terminal RS, DS3231 Bascom AVR

Nie jest to szczyt możliwości zamrażania w taki sposób, biorąc pod uwagę ciepłe otoczenie i co minutową aktualizację odczytów, ten efekt jest całkiem przyzwoity, choć uzyskałem też niższą temperaturę.

Chyba teraz jest stosowny moment aby nawiązać do kawałka tematu „DS3231 Bascom”, gdyż wcześniej odesłałem do innego artykułu ze względu na zgodność z podobnym  układem RTC.

Przykładowy kawałek kodu z obsługą/odczytem temperatury według kaktusa.
Trzeba dodać zmienne/stałe z adresami IC. Być może wyjaśnienia wymaga przeliczenie wartości po przecinku z uwagi na to jak układ interpretuje te wartości. Wiadomo, że układ podaje temperaturę z precyzją 1/4 stopnia zapisując w bitach rejestru wartości cyfr 0, 1, 2, 3. Myślę że po takim komentarzu z mojej strony wszystko jest już jasne 😉

Od kilku tygodni (dziś jest 2014-10-19, na fotografii widać datę kiedy go zamrażałem) moduł sobie pracuje, większą ilość czasu ze swojej bateryjki. Od czasu do czasu podłączam go do komputera (łącznie ze sterującym µC), aby przez port RS pochwalił się, którą ma godzinę. Gdybym miał go porównać z DS1307, to faktycznie jest sprawniejszy w precyzyjnym odmierzaniu czasu. Dodatkowo patrzę na niego przychylniej może dlatego, że nie rozwiązałem/analizowałem moich problemów z precyzją zliczania tego drugiego.

Opis modułu z tym RTC DS3231 i kolejny moduł RTC z EEPROM


nota katalogowa DS3231.pdf (299 pobrań)
w atrakcyjnej cenie moduł udało mi się zakupić tutaj.

Share Button
Tagi , , , .Dodaj do zakładek Link.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

2 + twelve =