Komunikacja w mikrokontrolerach Laboratorium

Transkrypt

Komunikacja w mikrokontrolerach Laboratorium
Komunikacja w mikrokontrolerach
Laboratorium
Ćwiczenie 3
Magistrala I2C
Program ćwiczenia:
konfiguracja transmisji danych między mikrokontrolerem
a cyfrowym czujnikiem przy użyciu magistrali I2C.
Zagadnienia do przygotowania:
podstawy programowania mikrokontrolerów w języku C,
obsługa magistrali I2C (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.
dr inż. Piotr Markowski © 2015
Wydział Elektroniki Mikrosystemów i Fotoniki
Komunikacja w mikrokontrolerach
Zawartość instrukcji
1. Wstęp .................................................................................................................................................. 1
2. Magistrala I2C....................................................................................................................................... 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 I2C 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 I2C, ponieważ tylko w taki sposób czujnik przesyła dane.
Przystępując do ćwiczenia należy znać podstawy działania magistrali I2C, 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 I2C
2.1. Informacje podstawowe
I2C (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ń – SDA oraz SCL. SDA to linia
dwukierunkowa służąca do przesyłania danych. Linią SCL 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
Komunikacja w mikrokontrolerach
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
Komunikacja w mikrokontrolerach
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
TWINT TWEA TWSTA TWSTO TWWC
0
0
0
0
0
2
TWEN
0
1
0
0
TWIE
0
nr bitu
TWCR
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
Komunikacja w mikrokontrolerach
Rejestr stanu TWSR:
zawiera kody stanu transmisji oraz bity preskalera.
Tab. 2. Bity rejestru TWSR
7
6
5
TWS7
TWS6
TWS5
1
1
1
4
TWS4
1
3
TWS3
1
2
0
1
TWPS1
0
0
TWPS0
0
nr bitu
TWSR
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:
f TWI =
gdzie:
f OSC
,
16 + 2 ⋅ (TWBR ) ⋅ 4TWPS
fosc = 1 MHz,
TWBR – wartość wpisana do rejestru TWBR (minimalnie 10),
TWPS – wybrany preskaler.
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 14bitowych liczb w kodzie binarnym. Wykorzystuje protokół I2C.
VCC GND SCL SDA
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:
• VCC – zasilanie, 5 V (na module oznaczone kolorem zielonym!);
• GND – uziemienie;
• SCL – linia zegarowa magistrali I2C;
• SDA – linia danych magistrali I2C.
4
dr inż. Piotr Markowski © 2015
Komunikacja w mikrokontrolerach
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 I2C, 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:
WILGOTNOSC [% RH ] =
14 _ bitowa _ odpowiedz
⋅ 100% .
214 − 2
Dla odpowiedzi czujnika 0x0000 wilgotność wynosi 0%. Dla odpowiedzi maksymalnej (0x3fff) –
100%.
Zmierzoną temperaturę poznamy podstawiając:
TEMPERATUR A [ o C ] =
14 _ bitowa _ odpowiedz
⋅ 165 − 40 .
214 − 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
Komunikacja w mikrokontrolerach
Należy pamiętać o podłączeniu linii SDA i SCL do napięcia zasilanie VCC poprzez rezystory (rys. 5) –
pull-up hardwarowy. Na makiecie laboratoryjnej rezystory pull-up znajdują się obok potencjometrów.
SDA
SCL
SDA
SCL
SDA
SCL
SDA
SCL
Vcc
MAKIETA AVR
mikrokontroler
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