„ Zegar czasu rzeczywistego (ang. Real-Time Clock
RTC) jest elementem systemów komputerowych służącym do odliczania czasu
niezależnie od stanu maszyny (pracy, zablokowania, wyłączenia), montowany jest
niemalże we wszystkich komputerach osobistych, serwerach i wielu systemach
wbudowanych, sterownikach PLC......”
Źródło: Wikipedia
Źródło: Wikipedia
Układy zegara RTC możemy również spotkać w wielu systemach mikroprocesorowych. Mimo iż współczesne mikrokontrolery posiadają układy czasowo – licznikowe wbudowane w swoją strukturę to często stosuje się osobne źródło czasu. Najczęściej są to różnego rodzaju układy scalone.
W tym artykule chciałbym przedstawić sposób obsługi zegara RTC opartego na układzie scalonym firmy Dallas DS1307, przedstawię również oprogramowanie obsługujące zegar w języku Bascom. Sam układ DS1307 komunikuje się z mikrokontrolerem za pomocą magistrali szeregowej I2C. Posiada on wyprowadzenia do których podłączany jest kwarc o częstotliwości 32.768 kHz , popularnie zwanym kwarcem zegarowym. Do jednego z wyprowadzeń podłączamy baterię o napięciu 3,2 V. Bateria ta ma za zadanie podtrzymać pracę zegara w czasie kiedy urządzenie elektroniczne jest odłączone od źródła zasilania.
W swojej budowie wewnętrznej układ posiada
następujące funkcje:
a) zegar
b) kalendarz
c) wewnętrzną pamięć RAM do dowolnego wykorzystania.
Układ mimo prostej obsługi i prostego podłączenia jest dość wymagający jeśli chodzi o warunki jakie trzeba spełnić przy projektowaniu płytki PCB aby poprawnie pracował.Podłączenie kwarcu powinno być jak najbliżej wyprowadzeń układu scalonego. Należy również podłączyć baterię o napięciu 3.2V inne źródło napięcia 3V lub 3,3 V będzie powodowało błędy w pracy zegara. Zegar jest wrażliwy na zakłócenia pochodzące od zasilania. Dlatego bezwzględnie trzeba zastosować kondensator o pojemności 100 nF .
a) zegar
b) kalendarz
c) wewnętrzną pamięć RAM do dowolnego wykorzystania.
Układ mimo prostej obsługi i prostego podłączenia jest dość wymagający jeśli chodzi o warunki jakie trzeba spełnić przy projektowaniu płytki PCB aby poprawnie pracował.Podłączenie kwarcu powinno być jak najbliżej wyprowadzeń układu scalonego. Należy również podłączyć baterię o napięciu 3.2V inne źródło napięcia 3V lub 3,3 V będzie powodowało błędy w pracy zegara. Zegar jest wrażliwy na zakłócenia pochodzące od zasilania. Dlatego bezwzględnie trzeba zastosować kondensator o pojemności 100 nF .
Powinien on
zostać wpięty pomiędzy nóżki Vcc i GND
jak najbliżej układu scalonego. Dodatkowo wyprowadzenie OUT powinno być
połączone do Vcc za pomocą rezystora 10kOHM. Kiedy spełnimy już
poniższe
wymagania co do podłączenia, możemy przystąpić do programowej obsługi
zegara. Zgodnie z notą katalogową producenta układu znajduje się tabela z
adresami
poszczególnych komórek pamięci zegara.
Zajmijmy się teraz obsługą zegara w Bascom. Zbudujmy prosty zegar oparty o mikrokontroler Atmega 32.Mając zmontowany poprawnie układ elektroniczny napiszemy oprogramowanie sterujące naszym zegarem.W pierwszej kolejności należy skonfigurować sprzętowy interfejs I2C w Atmedze32. Wykonuje się to za pomocą polecenia
Warto też wspomnieć, iż układy pracujące na magistrali I2C posiadają
swoje adresy odpowiedzialne za zapis i odczyt do konkretnego typu
układu. Część tych układów ma specjalne wyprowadzenia przeznaczone do
konfiguracji adresu, a część ma adres wpisany na stałe. Dlatego na
jednej magistrali może pracować kilka układów typu Slave z jednym
układem typu Master.
Każdy z układów ma podwójny adres, oznacza to że pod innym adresem
odbywa się zapis do układu a pod innym adresem dany układ jest
odczytywany. Możliwość konfiguracji adresu mają pamięci EEPROM AT240x ,
natomiast nasz układ DS1307 ma adres przypisany na stałe. I tak dla
zapisu informacji do układu służy adres 208 a do odczytu informacji
służy adres 209.
Dlatego w naszym programie zostały stworzone dwie wartości stałe DS1307w i DS1307r
Zostały również zadeklarowane zmienne do których zostały przypisane wartości sekund, minut, godzin, itp.
Kiedy mamy już zadeklarowane wszystkie zmienne w programie i został
skonfigurowany mikrokontroler, możemy przystąpić do napisania programu
głównego obsługującego nasz zegar. Nie wspominałem nic o budowie układu
zegara pod kątem elektronicznym, dlatego iż nasz zegar możemy wykonać w
dwóch postaciach, z możliwością ustawiania daty i godziny oraz zegara
który będzie odliczał upływ czasu od momentu uruchomienia. Obie wersje
są często spotykane w elektronice. Pierwszy rodzaj zegara z możliwością
nastawiania czasu wymaga dodatkowych elementów takich jak klawiatura i
programu obsługującego tą klawiaturę. Zostanie on omówiony w kolejnym
przykładzie naszego kursu. W tej części kursu zajmiemy się obsługą
zegara doliczającego czas od momentu uruchomienia. Przed rozpoczęciem
pracy programu głównego podstawiamy wartości do naszych zmiennych
odpowiedzialnych za czas i kalendarz.
W tym momencie nasz zegar będzie rozpoczynał pracę od wartości 00:00:00
. Przed wpisaniem ustawionych wartości do układu zegara należy dokonać
konwersji z wartości dziesiętnej na wartość w kodzie BCD. Zamianę tą
dokonujemy poleceniem Makebcd (zmienna) . Po wykonaniu kodowania
przypisujemy gotową wartość ponownie do zmiennej
Mając tak przygotowane zmienne jesteśmy gotowi do wpisania naszych
danych do układu zegara DS1307. W pierwszej kolejności należy
zainicjować transmisję na magistrali I2C. Dokonuje się to za pomocą
instrukcji I2cstart. Kolejne polecenie wybiera adres odpowiedzialny za
zapis do układu I2cwbyte Ds1307w. Ustawiamy pierwszą komórkę od której
będzie następował zapis, i rozpoczynamy zapis parametrów. W języku
Bascom nie musimy zwiększać za każdym razem numeru komórki dzieje się to
automatycznie po każdym zapisie, dlatego możemy przygotować kolejne
zmienne do wpisania. Całą procedurę zakańczamy poleceniem I2cstop
Nasz zegar został zaprogramowany i jest gotowy do rozpoczęcie pracy.
Program główny rozpoczyna się od polecenia Do i kończy się na poleceniu
Loop. Jak widać będzie on działał w pętli nieskończonej, w której znajdą
się instrukcje odczytujące nasz zegar a dane będą prezentowane na
wyświetlaczu LCD.
Tak jak w przypadku zapisu do układu należy najpierw zainicjować
magistralę I2C poprzez wydanie polecenia I2cstart ustawiamy ponownie
adres do zapisu i ustawiamy nasz zegar na komórkę zerową od której teraz
będziemy odczytywać dane zgromadzone w układzie DS1307. Zmieniamy
teraz wartość adresu na Ds1307r podobnie jak przy zapisie kolejne
komórki pamięci zegara są zwiększane automatycznie i nie ma potrzeby
zwiększania ich ręcznie. Musimy jednak poinformować układ mikrontrolera
że będzie on dalej odczytywał naszą kostkę zegara. Informację taką
zapisujemy na końcu naszej zmiennej w postaci instrukcji Ack. Kiedy
układ Mastera napotka polecenie Nack będzie wiedział że nastąpił koniec
wysyłania danych. Procedura odczytu z układu DS1307 zostanie zakończona
poleceniem I2cstop.
Kolejną czynnością jaką teraz musimy
wykonać jest zdekodowanie informacji z układu z BCD na wartość
dziesiętną. Służy do tego polecenie Makedec . Kiedy dokonamy już
konwersji danych nasz program będzie przygotowany do wyświetlania danych
na wyświetlaczu LCD. Zanim zaczniemy wyświetlać informacje należy
wyczyścić zawartość pamięci w wyświetlaczu. Dokonuje tego plecenia Cls.
Oczywiście musimy pamiętać aby nasz wyświetlacz został wcześniej
skonfigurowany poprawnie. Konfiguracja wyświetlacza musi znajdować się
na początku programu zaraz po konfiguracji mikrokontrolera. Ponownie
należy zakodować dane do postaci w kodzie BCD i przesłać je do zmiennej
Wart_bcd. Następnie oddzielając poszczególne zmienne dwukropkiem
wysyłamy je do wyświetlacza. Kończymy nasz program instrukcją Loop.
Można by powiedzieć że nasz program wykonał zamierzone zadanie. Ale od
pewnego czasu zauważyłem że po wykonaniu tych wszystkich poleceń końcowy
efekt na wyświetlaczu jest następujący 00:00:80. Z wykonanych testów
zaobserwowałem iż trzeba na początku programu jeszcze dołączyć dwie
biblioteki odpowiedzialne za prawidłową pracę zegara.
Biblioteki
$lib "mcsbyte.lbx" ,$lib "ds1307clock.lib" należy podłączyć do naszego
programu zaraz po zadeklarowaniu pliku konfiguracyjnego rejestry
mikrokontrolera.
Teraz po każdym uruchomieniu układu
elektronicznego nasz zegar rozpocznie pracę od wartości 00:00:00 i
będzie odliczał czas co sekundę zwiększając poszczególne wartości. Na
wyświetlaczu LCD uzyskamy dane o aktualnie upływającym czasie w
poprawnej formie
Wpis z 19-01-2014
Ostatnio udało mi się opracować gotowy moduł zegara RTC . Moduł można podłączyć zarówno do Raspberry Pi jak i dowolnego systemu mikroprocesorowego.
Brak komentarzy:
Prześlij komentarz