powrót do spisu treści

powrót do publikacje

4.5 Zegar czasu rzeczywistego..

Precyzyjne odmierzanie czasu zostało zrealizowane przy pomocy układu DS1340 produkcji Dallas Semiconductor, komunikującego się z procesorem przy pomocy magistrali I2C. Układ zegara czasu rzeczywistego taktowany jest rezonatorem kwarcowym o częstotliwości 32.768kHz - jest to typowy 'kwarc zegarkowy'. W przypadku obecności napięcia +5V układ jest zasilany z głównego napięcia zasilającego poprzez diodę. Gdy zasilania zabraknie, praca zegara jest podtrzymywana z baterii 3V, co zapewnia ciągłość odliczania czasu.

Magistrala I2C składa się z dwóch linii: SDA (linia danych - Serial Data) i SCL (linia zegara - Serial Clock). Linia danych jest dwukierunkowa, możliwy jest zarówno odczyt jak zapis danych. Linia zegara jest jednokierunkowa, co oznacza, że jeśli komunikują się ze sobą dwa układy, tylko jeden z nich może generować przebieg SCL. Obie linie są wspólne dla wszystkich układów podłączonych do magistrali. Informacje na magistrali I2C maję postać szeregową (wysyłane są bit po bicie). Prędkość przesyłania danych magistralą I2C jest stosunkowo niewielka. Dla większości układów górny limit prędkości wynosi 100kHz, dla niektórych - 400kHz. Nie określono dolnej granicy prędkości, co oznacza, że przebiegi na liniach SDA i SCL mogą mieć bardzo niskie częstotliwości, a poszczególne fazy przebiegów mogą być dowolnie wydłużane. Ograniczenie prędkości od góry sprawia, że magistrala I2C nie nadaje się do przekazywania dużych porcji informacji (np. treści obrazu oraz dźwięku), jej zastosowanie ogranicza się do funkcji sterujących [16].

Spośród układów podłączonych do magistrali I2C wyróżnia się dwa zasadnicze typy: układy zarządzające (master) i podrzędne (slave). Układ master to ten, który inicjuje cykle łączności, generuje przebieg zegarowy na linii SCL. Układem zarządzającym jest prawie zawsze mikroprocesor. Układ podrzędny (slave) to ten, który przyjmuje lub wysyła dane na polecenie układu nadrzędnego, w takt generowanego przez ten układ przebiegu zegarowego SCL [1].

Zainicjowanie cyklu łączności przez układ nadrzędny (master) polega na wygenerowaniu specjalnego sygnału startu (start condition).

Zakończenie cyklu łączności wiąże się z wygenerowaniem sygnatury stopu, czyli końca transmisji (stop condition) albo z wygenerowaniem kolejnego sygnału startu (repeated start condition) kończącego jeden i rozpoczynającego jednocześnie kolejny cykl. Realizacja programowa obu sygnałów: startu i stopu przedstawiona jest w poniższym fragmencie kodu:

void i2c_start (void) // start nadawania
{
MDE = TRUE;
MDO = HIGH;
MCO = HIGH;
MDO = LOW;
MDO = LOW;
waitus(5);
MCO = LOW;
}
void i2c_stop (void) // sygnał stopu
{
MDE = TRUE;
MDO = LOW;
MCO = HIGH;
MCO = HIGH;
MDO = HIGH;
}

Wszystkie przebiegi generowane w ramach jednego cyklu łączności są związane z przekazywaniem danych pomiędzy dwoma konkretnymi układami scalonymi. Inne układy podłączone do magistrali, jeśli chcą nawiązać łączność, muszą czekać na zwolnienie magistrali, czyli na pojawienie się sygnału stopu [16].

Nawiązanie przez układ nadrzędny (master) łączności z jednym, wybranym układem podrzędnym (slave) jest możliwe dzięki temu, że każdy układ slave posiada swój unikalny adres. Układ typu master bezpośrednio po zainicjowaniu transmisji podaje adres układu, z którym chce się skomunikować. Układ master ustala także kierunek transmisji danych. Po wysłaniu przez układ master adresu, kolejne dane mogą być przesyłane albo w tym samym kierunku, co adres, czyli od układu master do wybranego układu slave, albo w kierunku odwrotnym, czyli od układu slave do układu master. Pierwszy przypadek jest zapisem danych (write), natomiast w drugi jest odczytem (read) [16].

W zaprojektowanym sterowniku mikrokontroler pełni funkcję mastera, natomiast układ zegara czasu rzeczywistego DS1340 jest podłączony do magistrali jako slave. Do transmisji jest używany wbudowany w mikroprocesorze interfejs I2C. Sposób połączenia widoczny jest na rysunku 20.

Rys. 20. Schemat połączeń DS1340 z ADUC845

Układ DS1340 zawiera w sobie zegar i kalendarz oraz posiada możliwość ustawienia alarmu. Wszystkie dane odczytuje się z pamięci tego układu w postaci naturalnego kodu binarnego. Mapę pamięci układu przedstawia tabela 11.

Rysunek 21 przedstawia sposób zapisu danych do układu DS1340 za pośrednictwem magistrali I2C. Na początku musi pojawić się sekwencja startu, następnie jest wysyłany bit po bicie siedmiobitowy adres układu. Kolejny bit po adresie decyduje czy z układu slave będą czytane (rysunek 22) czy zapisywane (rysunek 21) dane: 0 – zapis, 1 – odczyt. Po każdych ośmiu bitach powinien wystąpić krótki impuls (acknowledge) o niskim stanie, jedynie w przypadku gdy jest wysyłany lub odbierany ostatni bajt danych nie ma tego impulsu [7].

Tabela 11. Mapa adresów pamięci układu DS1340 [7]

Rys. 21. Ramka zapisu danych do układu DS1340 [7]

Po wysłaniu adresu układu, następnym bajtem może być adres wskazujący dane w pamięci zegara DS1340, które chcemy odczytać lub zapisać. Jeśli zostanie wskazany np. adres n to master będzie mógł odczytać tylko dane spod adresów n, n+1, …, itd. [7]. W przypadku układu, który zaprojektowałem jest odczytywana cyklicznie, jeden raz na sekundę cała pamięć układu DS1340 do tablicy dane_i2c[], która składa się z dziewięciu elementów. Następnie dane z tablicy są przetwarzane i wykorzystywane w programie.

Rys.22. Ramka odczytu danych z układu DS1340 [7]

powrót do spisu treści

powrót do publikacje