sobota, 4 stycznia 2014

Obsługa zegara RTC DS1307 w Bascom

„ 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
 
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 . 

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:

Publikowanie komentarza