Widziałem dziesiątki różnych układów zegara czasu rzeczywistego na rynku, a także kilka procesorów z wbudowanym oddzielnie zasilanym modułem zegara czasu rzeczywistego.
Prawie wszystkie z nich nie tylko przechowują czas jako rok-miesiąc-dzień-godziny-minuty-sekundy, ale nawet poszczególne pola są przechowywane w formacie BCD, a nie w formacie binarnym.
Czy jest jakiś podstawowy tego powód?
Czy są jakieś aplikacje mikroprocesorowe, które robią coś bardziej zaawansowanego niż tylko wyświetlanie zegara, w którym format BCD jest bardziej przydatny niż binarny, lub w którym rok-miesiąc-dzień-godzina-minuty-sekundy byłby bardziej użyteczny niż prosta 47-bitowa liczba zmian stanu oscylatora?
Z tego, co mogę powiedzieć, wydaje się, że twórcy RTCC dodają wiele dodatkowych obwodów, aby ich układy były mniej użyteczne; jedynym powodem, dla którego mogę wymyślić, że moduły RTCC w procesorach zachowują się w ten sposób, jest to, że dostawcy procesorów używają wcześniej istniejących implementacji BCD, a nie produkują własne.
Odpowiedzi:
Czy wszystkie RTC używają kodowania BCD?
RTC z Philips / NXP (zarówno samodzielne, jak i zintegrowane z układami ARM7 lub Cortex-M3) nie używają kodowania BCD.
Co jest nie tak z BCD RTC?
W porównaniu do licznika płaskiego jedynymi operacjami, które są trudniejsze przy podzielonym zegarze BCD, są obliczenia różnicy czasu (dodanie sekund lub obliczenie upływającego czasu). Porównania czasu, takie jak: „bieżący czas jest większy niż czas alarmu ustawiony przez użytkownika” są równie łatwe.
Co jest fajnego w RTC BCD (i ogólnie podzielonym polu)?
Podział pól jest naprawdę fajny, gdy zależy Ci na dacie kalendarzowej. Ludzkie kalendarze mają zabawne rzeczy, takie jak miesiące o różnej długości, a ponadto lata przestępne. Postaraj się to zrobić w jednym liczniku (możesz uzyskać punkt bonusowy za prawie zerowe zużycie energii). Aha i spróbuj w ten sposób wspierać dni tygodnia (całkiem przydatne we wszelkiego rodzaju urządzeniach przeznaczonych dla ludzi: od budzików po sterowniki grzejników).
Podejście BCD ma jedną dodatkową cechę: dostajesz przerwania „co sekundę” lub „co dziesięć sekund” za darmo, bez konieczności wykonywania żadnych obliczeń dotyczących dat i godzin.
Do obliczenia rekordowego roku przestępnego w NXP RTC jest trochę mało, ponieważ dba tylko o zasadę podzielności przez 4 i nie sprawdza podziału przez 100 i 400. Jeśli utrzyma licznik lat w BCD, byłoby to trywialne i najprawdopodobniej zrobione dobrze.
streszczenie
Jeśli chcesz zegar monotoniczny, użyj go. Możesz kupić PIC lub AVR z „licznikiem RTC” (który jest tylko licznikiem asynchronicznym z autonomicznym oscylatorem 32kHz). Pamiętaj, że samo wyświetlenie daty będzie trudne. :)
Jeśli chcesz wyświetlić godzinę i datę oraz ustawić alarmy na podstawie danych wprowadzonych przez użytkownika w czasie i dacie, użyj RTC. I pamiętaj, że gdy użytkownik zmieni bieżącą godzinę i datę, Twoje przerwania oparte na RTC mogą być niedokładne.
źródło
Gdy korzystasz z zegarów, bardziej prawdopodobne jest, że będziesz zainteresowany minutami i dziesiątkami sekund (w kierunku ich wyświetlenia) niż tylko sumą sekund, minut i tak dalej. W przypadku, gdy nie jesteś zainteresowany oddzielnymi cyframi, istnieje szansa, że nie przejmujesz się oddzielnymi wartościami minut lub sekund, i że równie dobrze możesz użyć długiego licznika binarnego, jak sugerowałeś.
Łatwiej jest konwertować z BCD na binarne w oprogramowaniu niż na odwrót. A ponieważ liczniki BCD nie wymagają tak dużej dodatkowej nieruchomości w porównaniu z licznikami binarnymi, warto wybrać BCD.
źródło
Podejrzewam kilka powodów:
Historyczne - robią to już od pewnego czasu. Jeśli chcesz, aby nowa część zastąpiła jakąś inną część, musi ona mniej więcej działać tak samo. Więc trzymaj się BCD.
Aplikacja - jeśli ktoś używa RTC z małej mikro (coś w zakresie 8 bitów, jak niskiej jakości PIC), to radzenie sobie z dużą liczbą (np. 47-bitowy licznik) jest dużym bólem szyi. O wiele łatwiej jest radzić sobie z cyframi BCD, ponieważ nie musisz pracować nad rozkładaniem.
Nie takie trudne - Robienie liczników BCD nie jest takie trudne, i myślę, że w rzeczywistości nie jest to dużo więcej bram niż robienie ich binarnie.
Można sobie wyobrazić system, w którym otrzymasz oddzielne liczniki godzin, minut itp. W postaci binarnej zamiast BCD (unikając w ten sposób problemu „zerwania 47-bitowej liczby”), ale nie jest to o wiele łatwiejsze i masz zamiar zrobić trochę i tak konwersje podczas wyświetlania rzeczy.
źródło
Zgadzam się z Michaelem Kohne, że jest dużo historycznego rozmachu.
Wczesne MCU również miały znacznie mniej miejsca na kod i dane (na przykład 128 bajtów RAM). Ponieważ informacje o czasie są często wykorzystywane do celów komunikacji międzyludzkiej, bardziej sensowne jest utrzymywanie danych jak najbliżej formatu używanego do wyświetlania / wprowadzania danych przez ludzi.
Niektóre nowsze MCU z większą ilością kodu i przestrzeni danych czasami implementują sprzętowe liczniki czasu rzeczywistego - urządzenia te często przechowują binarne liczby tików 32kHz.
źródło
Jeśli ktoś jest zainteresowany, po prostu patrzę na serię 32F ST i wydaje się, że podczas gdy nowsza seria 32L wykorzystuje BCD RTC, 32F używa prostego licznika 32-bitowego z konfigurowalnym preskalarem i zapewnia osobne wejście baterii dla niego (brawo! ). Wolałbym mieć dłuższy prosty licznik bez konfigurowalnego prekalarnego (więc mogłem uzyskać dokładność 1/256 s, ale zachować czas na lata bez martwienia się o zawijanie), ale gdybym ustawił skalę wstępną na 1/64 s, czasomierz mógłby działać dwa lata bez przelewania się. Nie idealny, ale nie tak źle. Trochę nieestetyczne, że jeśli ktoś włącza maszynę po zbyt długim wyłączeniu (2,1+ lat), data / godzina nieuchronnie cofną się o 2,1 roku, ale nie jest to poważny problem (licznik ma flagę przelewu, ale w wiele przypadków, które nie byłyby strasznie pomocne. Jeśli urządzenie było włączone przez dwa lata przed wyłączeniem, a zostało włączone trzy miesiące później, można oczekiwać, że zegar się przepełni; pytanie brzmiałoby, czy przepełniło się dwukrotnie, i nie znam na to żadnej flagi.
źródło
Wydaje się, że Maxim robi dokładnie to, co chcesz z DS1372U . Potrzebuje mniej niż 1μA, kosztuje 1,7 USD i jest dostępny (!) Na DigiKey i Mouser. Jedynym problemem jest to, że nie wydaje się oferować alarmów z dokładnością przekraczającą 1 sekundę, a najniższa częstotliwość taktowania wyjściowego wynosi $ \ ok. 4kHz.
źródło