Laboratorium Ćwiczenie 3 Magistrala I 2 C Program ćwiczenia: konfiguracja transmisji danych między mikrokontrolerem a cyfrowym czujnikiem przy użyciu magistrali I 2 C. Zagadnienia do przygotowania: podstawy programowania mikrokontrolerów w języku C, obsługa magistrali I 2 C (TWI) w mikrokontrolerach AVR, przerwania zewnętrzne w mikrokontrolerach AVR obsługa, Literatura: [1] Wykład [2] Dokumentacja mikrokontrolera ATmega8535, www.atmel.com. [3] Dokumentacja czujników HIH8120, www.honeywell.com/sensing. [4] Dokumentacja obsługa trybu Command Mode czujników Honeywell, www.honeywell.com/sensing. [5] Mikrokontrolery AVR ATmega w praktyce, R. Baranowski, BTC 2005. [6] AVR i ARM7. Programowanie mikrokontrolerów dla każdego, P. Borkowski, Helion 2010. [7] Mikrokontrolery AVR Język C. Podstawy programowania, M. Kardaś, Atnel 2011. Wydział Elektroniki Mikrosystemów i Fotoniki dr inż. Piotr Markowski 2015
Zawartość instrukcji 1. Wstęp...1 2. Magistrala I 2 C...1 3. Czujnik wilgotności/temperatury HIH8120...4 4. Przykładowe zadania...6 UWAGA! Do poprawnej obsługi mikrokontrolera niezbędne jest korzystanie z jego dokumentacji. Instrukcja zawiera pewne uproszczenia w stosunku do rzeczywistych możliwości mikrokontrolera, magistrali I 2 C oraz języka C. 1. Wstęp W trakcie ćwiczenia należy nawiązać połączenie między mikrokontrolerem a cyfrowymi czujnikami wilgotności i temperatury (HIH8120 firmy Honeywell [2]). Komunikacja musi się odbywać z wykorzystaniem magistrali I 2 C, ponieważ tylko w taki sposób czujnik przesyła dane. Przystępując do ćwiczenia należy znać podstawy działania magistrali I 2 C, specyfikę tego interfejsu w mikrokontrolerach AVR oraz wymagania stosowanego czujnika co do ramki danych i sposobu przesyłu komend/wyników pomiarów. Zadania będą polegały na wysyłaniu żądania pomiaru do wybranego czujnika i na prezentacji otrzymanych odpowiedzi cyfrowych. 2. Magistrala I 2 C 2.1. Informacje podstawowe I 2 C (Inter-Integrated Circuit, oznaczana również I2C, IIC) to magistrala szeregowa. Firma Atmel wprowadziła swój własny, w pełni kompatybilny odpowiednik nazwany TWI (Two Wire Interface). Komunikacja odbywa się za pośrednictwem dwóch wyprowadzeń oraz. to linia dwukierunkowa służąca do przesyłania danych. Linią transmitowany jest sygnał zegarowy (generowany przez układ MASTER). W skład sieci może wchodzić wiele układów, jednak na raz komunikacja zachodzi między dwoma, oznaczanymi jako MASTER i SLAVE. Z punktu widzenia mikrokontrolerów AVR sterowanie transmisją wymaga: konfiguracji magistrali; nadania sygnału START; wyboru układu SLAVE; wystawienia danych do transmisji; nadania sygnału STOP. Całości dopełnia obserwacja i kasowanie flagi przerwania TWINT, odbierania bitów potwierdzenia (ACK, NACK) oraz ew. odczytywanie i weryfikacja kodów stanu transmisji. 1 dr inż. Piotr Markowski 2015
W mikrokontrolerze magistrala musi zostać wstępnie skonfigurowana (należy odpowiednio ustawić rejestry sterujące). Ich opis można znaleźć w dalszej części instrukcji. Konfiguracja czujników i innych układów cyfrowych wykorzystujących magistralę nie jest zazwyczaj konieczna magistrala jest fabrycznie ustawiona, należy odczytać z dokumentacji w jaki sposób z niej korzystać (informacje nt. czujników HIH8120 przedstawiono w dalszej części instrukcji). Transmisja przebiega zgodnie z przykładowym schematem przedstawionym na rys. 1. Rys. 1. Schemat transmisji wraz z opisem kolejnych czynności nadanie 1 bajtu danych. Komunikację rozpoczyna nadanie sygnału START (1) przez układ MASTER (najczęściej mikrokontroler). W tym celu należy ustawić odpowiedni bit (TWSTA) w rejestrze kontrolnym (zob. podrozdział 2.2): TWCR = (1<<TWINT) (1<<TWEN) (1<<TWSTA); Kiedy sygnał zostanie nadany mikrokontroler ustawi flagę TWINT w rejestrze kontrolnym (2). Obserwacja stanu tej flagi jest kwestią kluczową w trakcie całej transmisji, dlatego w kodzie programu wielokrotnie będzie pojawiała się pętla oczekiwania: while (!(TWCR & (1<<TWINT))); Kiedy zostanie wykryty stan wysoki na fladze, należy wykonać punkt (3). Po pierwsze, opcjonalnie, można sprawdzić kod stanu transmisji (rejestr TWSR). Znajdziemy tam informacje o bieżącym stadium komunikacji, kolejnych czynnościach oraz ewentualnych błędach. Po drugie, należy wpisać do rejestru danych, TWDR, adres układu SLAVE, z którym chcemy nawiązać połączenie oraz bit kierunku transmisji (0 nadawanie, 1 odbiór). Aby dane zostały wysłane należy wpisać wartość 1 na bit TWINT (wyzeruje to flagę): TWDR=0x5a; TWCR = (1<<TWINT) (1<<TWEN); Ponownie należy czekać na ustawienie flagi TWINT (4), co będzie oznaczało zakończenie wysyłania adresu i otrzymanie potwierdzenia (ACK lub NACK) od układu SLAVE. W tym miejscu 2 dr inż. Piotr Markowski 2015
można sprawdzić kod stanu transmisji lub od razu wpisać dane do rejestru TWDR (5). Po wpisaniu 1 na bit TWINT rozpocznie się przekaz. Kiedy SLAVE odbierze dane i nada ACK (lub NACK) flaga TWINT ponownie zostanie ustawiona, zatem ponownie stosujemy pętlę oczekującą while (6). Jeśli chcemy kontynuować transmisję (nadawać kolejne bajty danych do tego samego urządzenia) kroki (5) i (6) należy powtarzać. Jeżeli chcemy zakończyć komunikację należy nadać STOP (7). W tym celu ustawiamy bit TWSTO w rejestrze kontrolnym: TWCR = (1<<TWINT) (1<<TWEN) (1<<TWSTO); Rys. 1 oraz przedstawiony opis dotyczy sytuacji, gdy mikrokontroler nadaje dane do układu SLAVE. W przeciwnym wypadku (odbiór danych) należy zmodyfikować krok (5). Kiedy SLAVE rozpoznał swój adres i wysłał potwierdzenie (3) i (4) mikrokontroler powinien zacząć odbierać dane. Należy tu zaznaczyć, że SLAVE będzie nadawał w takt sygnału zegarowego generowanego przez układ MASTER. Zatem póki MASTER takiego sygnału nie wysyła, transmisja jest zapauzowana. Zostanie wznowiona dopiero, gdy wpiszemy 1 na flagę TWINT. Aby mikrokontroler wysłał po odbiorze sygnał ACK należy ustawić również bit TWEA. Podsumowując, punkt (5) będzie polegał jedynie na wpisaniu 1 na bity TWINT oraz TWEA. Można to zrealizować tak: TWCR = (1<<TWINT) (1<<TWEN) (1<<TWEA); Krok (6) pozostaje bez zmian. Należy oczekiwać na ustawienie flagi TWINT, co będzie oznaczało, ze MASTER odebrał dane. W kroku (7) należy odczytać przesłaną informację, np. do zmiennej odp: uint8_t odp = TWDR; Kroki (5) (7) powtarzamy tyle razy, ile bajtów danych chcemy odebrać (zatem musimy wiedzieć, ile bajtów SLAVE będzie nadawał; informacja o tym znajduje się, oczywiście, w jego dokumentacji). Jeśli chcemy zakończyć transmisję należy nadać sygnał STOP (8). 2.2. Rejestry magistrali Rejestr kontrolny TWCR: jest to główny rejestr konfiguracyjny magistrali. Tab. 1. Bity rejestru TWCR 7 6 5 4 3 2 1 0 nr bitu TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE TWCR 0 0 0 0 0 0 0 0 stan pocz. TWINT flaga przerwania; bit krytycznie ważny podczas komunikacji; informuje o zakończeniu kolejnych etapów transmisji. TWEA aktywacja sygnału potwierdzenia (ACK); ustawienie pozwala mikrokontrolerowi potwierdzać odebranie bajtu danych. TWSTA ustawienie powoduje natychmiastowe nadanie sygnału START. TWSTO ustawienie powoduje natychmiastowe nadanie sygnału STOP. TWWC flaga informująca o błędzie kolizji zapisu; zbędna podczas laboratorium. TWEN aktywacja magistrali. TWIE aktywacja przerwania; niekonieczna podczas laboratorium. 3 dr inż. Piotr Markowski 2015
Rejestr stanu TWSR: zawiera kody stanu transmisji oraz bity preskalera. Tab. 2. Bity rejestru TWSR 7 6 5 4 3 2 1 0 nr bitu TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0 TWSR 1 1 1 1 1 0 0 0 stan pocz. TWSx zawierają kody stanu transmisji (zob. tab. 75 79 dokumentacji). TWPSx presckaler można ustawić na 1, 4, 16 lub 64, zgodnie z tab. 74 dokumentacji. Rejestr prędkości transmisji TWBR: wartość wpisana do tego rejestru ustala częstotliwość transmisji, zgodnie ze wzorem: gdzie: f = OSC, TWI TWPS 16 + 2 ( TWBR) 4 f osc = 1 MHz, TWBR wartość wpisana do rejestru TWBR (minimalnie 10), TWPS wybrany preskaler. f Rejestr danych TWDR: służy do wysyłania/odbioru danych. Rejestr adresu TWAR: zbędny podczas laboratorium. 3. Czujnik wilgotności/temperatury HIH8120 Czujnik HIH8120 (rys.2) mierzy wilgotność oraz temperaturę. Wyniki podaje w postaci dwóch 14- bitowych liczb w kodzie binarnym. Wykorzystuje protokół I 2 C. V CC GND adres modułu Rys. 2. Czujnik HIH8120 oraz moduł laboratoryjny z czujnikiem. Czujnik posiada 4 wyprowadzenia, które należy podłączyć do odpowiadających im nóżek mikrokontrolera: V CC zasilanie, 5 V (na module oznaczone kolorem zielonym!); GND uziemienie; linia zegarowa magistrali I 2 C; linia danych magistrali I 2 C. 4 dr inż. Piotr Markowski 2015
Komunikacja z czujnikiem jest dwuetapowa. Najpierw należy wysłać do rozkaz wykonania pomiaru, następnie odczytać wynik. Wykonuje się to przy użyciu dwóch ramek danych. Pierwszą przedstawiono na rys. 3. Rys. 3. Ramka rozkazu. Po sygnale START wysyłany jest jedynie bajt adresowy ramki I 2 C, zawierający adres czujnika, którego chcemy użyć. Bit kierunku transmisji zerujemy. Należy zaczekać na sygnał potwierdzenia od czujnika (ACK oznacza, że rozpoznał swój adres) i nadać sygnał STOP. Adres czujnika podany jest na każdym module laboratoryjnym (rys. 2). W tym momencie czujnik rozpocznie procedurę pomiaru wilgotności i temperatury. Zgodnie z dokumentacją [2] trwa ona 36,65 ms. Należy zatem odczekać co najmniej taki okres, a następnie wysłać drugą ramkę danych ramkę odczytu (rys. 4). Rys. 4. Ramka odczytu danych. Po nadaniu sygnału START, adresu wybranego czujnika oraz bitu kierunku (tym razem 1 odczyt) czujnik odpowie przy pomocy 4 bajtów danych. Pierwszy zawiera dwubitowy kod stanu (S1, S0) oraz najstarsze bity pomiaru wilgotności (B13..B8). Bity stanu informują o statusie uzyskanych danych. Jeśli wynoszą 00 możemy przystąpić do analizy wyników, jeśli 01 to czujnik nie zdążył wykonać pomiaru (prawdopodobnie nie odczekano wymaganych 36,65 ms. Bity B13..B0 to wynik pomiaru wilgotności. Bity T13..T0 to wynik pomiaru temperatury. Dwa najmłodsze bity ostatniego bajtu są nieistotne (na rys. 3 oznaczone jako X ). Aby poznać zmierzone wartości wilgotności i temperatury otrzymane wyniki należy jeszcze przeliczyć. Dokumentacja podaje odpowiednie wzory. I tak, wilgotność poznamy podstawiając: 14 _ bitowa _ odpowiedz WILGOTNOSC [% RH ] = 100%. 14 2 2 Dla odpowiedzi czujnika 0x0000 wilgotność wynosi 0%. Dla odpowiedzi maksymalnej (0x3fff) 100%. Zmierzoną temperaturę poznamy podstawiając: o 14 _ bitowa _ odpowiedz TEMPERATURA [ C] = 165 40. 14 2 2 Dla odpowiedzi czujnika 0x0000 wynosi ona -40 C, dla wartości maksymalnej (0x3fff) 125 C. Sterowanie komunikacją powinno się odbywać dokładnie tak, jak opisano w rozdziale 2.1 instrukcji. 5 dr inż. Piotr Markowski 2015
Należy pamiętać o podłączeniu linii i do napięcia zasilanie V CC poprzez rezystory (rys. 5) pull-up hardwarowy. Na makiecie laboratoryjnej rezystory pull-up znajdują się obok potencjometrów. MAKIETA AVR mikrokontroler Vcc MAKIETA AVR rezystory pull-up MODUL czujnika MODUL czujnika Rys. 5. Schemat połączenia elementów magistrali (w tym pull-up hardwarowy). 4. Przykładowe zadania a) Przekształć podane w instrukcji wzory tak, aby było możliwe obliczenie wilgotności/temperatury po odczytaniu jedynie 8 najstarszych bitów pomiarowych; b) odczytaj temperaturę zmierzoną przez czujnik; c) odczytaj wilgotność zmierzoną przez czujnik; d) pomiary z zadań (b) i (c) aktywuj przerwaniem zewnętrznym INT1. 6 dr inż. Piotr Markowski 2015