Systemy wbudowane
Transkrypt
Systemy wbudowane
Systemy wbudowane - Laboratorium Informatyka studia inżynierskie Ćwiczenie nr 2: Szeregowy przetwornik AC i CA Cel ćwiczenia Celem ćwiczenia jest zapoznanie się z działaniem i sposobami obsługi przetworników AC i CA sterowanych w sposób szeregowy na przykładzie układu PCF8591. Wymagane wiadomości • • • • • Budowa mikrokontrolera BasicStamp2 Zestaw edukacyjny StampInClass – budowa i obsługa Język PBASIC. Przetworniki AC i CA Magistrala I2C. Warstwa fizyczna i protokół wymiany informacji. Wykorzystywany sprzęt Komputer PC z oprogramowaniem do obsługi zestawu BasicStamp. Zestaw edukacyjny StampInClass firmy Parallax Inc. wraz z niezbędnym wyposażeniem dodatkowym (przetwornik PCF8591). Literatura [1] [2] [3] [4] [5] Mielczarek W.: Szeregowe interfejsy cyfrowe. Wyd. Helion 1993 Łakomy M., Zabrodzki J.: Scalone przetworniki analogowo-cyfrowe i cyfrowoanalogowe. PWN Warszawa 1985 Baranowski J., Kalinowski B., Nosal Z.: Układy elektroniczne cz. III Układy i systemy cyfrowe. WNT Warszawa 1994. Philips Semiconductors: PCF 8591 A/D and D/A converter Data Sheet [online]. [Dostęp 1.10 2009]. Dostępny w Internecie: http://www.nxp.com/acrobat_download/datasheets/PCF8591_6.pdf Parallax Inc: BASIC Stamp Syntax and Reference Manual 2.2 [online]. [Dostęp 1.10 2009]. Dostępny w Internecie: http://www.parallax.com/Portals/0/Downloads/docs/prod/stamps/web-BSMv2.2.pdf 1 1. Wprowadzenie Interfejs I2C [1] jest interfejsem szeregowym synchronicznym. W pierwotnym opracowaniu częstotliwość pracy interfejsu wynosiła 100 kHz. W obecnej chwili osiągalne są bez problemu układy I2C o częstotliwościach pracy 400 kHz a nawet 1MHz. I2C w pierwotnym opracowaniu adresował do 128 urządzeń fizycznych (adres długości 7 bitów). Fizyczny interfejs magistrali I2C składa się z linii danych i zegarowej. Linia danych SDA służy do przesyłania danych i adresów między urządzeniem nadrzędnym a urządzeniem podrzędnym. Jest to linia dwukierunkowa. Linia zegarowa SCL zapewnia synchronizację danych przesyłanych poprzez linię SDA. Synchronizację przesyłanych danych zapewnia urządzenie nadrzędne. Dołączenie linii do magistrali jest obwarowane pewnymi warunkami. Należy do nich budowa wyjścia typu OC (otwarty kolektor lub otwarty dren). Poniżej został przedstawiony rysunek,na którym wyróżniono 4 charakterystyczne odcinki przebiegu. SDA SCL START STABILNE DANE ZMIANA DANYCH STOP Podstawowe warunki transmisji danych na magistrali I2C Są to: - START Warunek startu poprzedzający jakąkolwiek transmisję. Jego wykrycie przez urządzenie podrzędne rozpoczyna odbiór danych; - STABILNE DANE Pokazuje nam miejsce w trakcie przebiegu, w którym urządzenie nadrzędne musi utrzymać stabilne dane, lub urządzenie podrzędne wystawia stabilne dane do odczytu; - ZMIANA DANYCH W tej części przebiegu może zostać dokonana przez urządzenie nadrzędne zmiana danych przesyłanych do urządzeń podrzędnych lub następuje zmiana danych odczytywanych z urządzenia podrzędnego; - STOP Warunek stopu kończący transmisję do/z urządzenia podrzędnego. Urządzenia dołączone do magistrali umownie nazywamy nadrzędnymi (master) i podrzędnymi (slave). Urządzenie nadrzędne przesyła adresy, rozkazy, odbiera i wysyła dane oraz synchronizuje przesyłane dane. Urządzenia podrzędne potwierdzają przyjęcie rozkazów, adresów i danych oraz wykonują polecenia. Do magistrali może być dołączonych wiele urządzeń nadrzędnych oraz wiele urządzeń podrzędnych. Dostęp do magistrali w danym momencie może mieć tylko jedno urządzenie nadrzędne. W przypadku konfliktu urządzenia przystępują do arbitralnego rozstrzygnięcia o dostępie. Słowo transmitowanych danych ma długość 8 bitów. Każde przesłane słowo jest 2 potwierdzane przez docelowe urządzenie podrzędne. Potwierdzenie polega na przytrzymaniu na linii SDA stanu niskiego przez czas równy jednemu okresowi sygnału na linii SCL. Jeżeli urządzenie podrzędne nie potwierdzi z jakichś powodów odebrania bajtu urządzenie nadrzędne powinno wysłać warunek stopu. Jeżeli następuje koniec przesyłania danych z urządzenia podrzędnego do nadrzędnego (np. transmisja ostatniego bajtu z bieżącej strony pamięci itp.) to urządzenie podrzędne nie wystawia potwierdzenia sygnalizując, iż wystawiło właśnie ostatni bajt, który ma do wysłania. Na Rys. 1 przedstawione zostały przebiegi sygnałów generowane przez urządzenia podłączone do magistrali oraz ich wypadkowa na magistrali. Rys. 1 Przebiegi generowane na magistrali I2C przez współpracujące urządzenia. 1.1 Protokół transmisji. Każda transmisja rozpoczyna się od przesłania warunku startu, po którym następuje przesłanie adresu, od którego zaczynamy dokonywać operacji zapisu/odczytu. Po sekwencji rozpoczynającej następuje przesyłanie danych zakończone warunkiem stopu. Podstawowe typy przesłań zostały przedstawione na rysunku poniżej 3 1.2 Przetwornik PCF8591 Układ PCF 8591 [4] jest scalonym przetwornikiem AC i CA sterowanym poprzez interfejs I2C. Dzięki temu układ jest zamknięty w 16 nóżkowej obudowie. Przetwornik AC pracuje w oparciu o zasadę kolejnych przybliżeń. W czasie pracy przetwornik AC wykorzystuje przetwornik CA, nie jest wiec możliwe jednoczesne korzystanie z obu przetworników. Na rysunku przedstawiono rozmieszczenie wyprowadzeń układu PCF891. Z informacji wstępnych na temat interfejsu I2C wynika, ze każdy układ podłączony do szyny powinien posiadać własny adres. Jak w większości układów podłączanych do magistrali I2C adres układu składa się z dwóch części: stałej zdefiniowanej przez producenta ustalonej na binarna wartość 1001 i części zmiennej ustalanej przez użytkownika poprzez podanie wybranych stanów logicznych na linie A1, A1, A2. W zależności od inwencji użytkownika układ może zajmować na magistrali lokalizacje adresowe 48H do 4FH Przetwornik posiada 4 konfigurowane wejścia sygnału analogowego AIN0, AIN1, AIN2, AIN3. Wyprowadzenia SDA i SCL służą do podłączenia układu do magistrali I2C. Układ może pracować z zewnętrznym sygnałem zegarowym jak i w oparciu o własny oscylator. Obsługa układu jest bardzo prosta. W trybie pracy jako przetwornik CA pierwszy wysłany do układu bajt jest traktowany jako bajt konfiguracji. Kolejne odebrane bajty są przekazywane do przetwornika i zamieniane na napięcie na wyjściu AOUT proporcjonalne do wartości wysłanego słowa. Aby korzystać z przetwornika AC należy wysłać do układu bajt konfiguracji a następnie odbierać rezultaty przetworzenia ( pierwszy odebrany bajt jest wartością przypadkową). Szczegółowe informacje na temat przetwornika i sposobu jego programowania można znaleźć w [4]. Dostępna na zajęciach (i w załączniku) biblioteka niskopoziomowych procedur obsługi magistrali I2C składa się z 4 funkcji: I2C_Start - wystawia na magistralę warunek startu, I2C_TX_Byte - wysyła na magistralę jeden bajt (wartość jest przekazywana przez zmienną i2cWork), I2C_RX_Byte - odbiera z magistrali jeden bajt (odebrany bajt jest zwracany w zmiennej i2cWork), I2C_Stop - wystawia na magistralę warunek stopu. 4 2. Wykonanie ćwiczenia Każdy zespół otrzymuje układ przetwornika, potencjometr 100kΩ, 2 rezystory 10kΩ (oznaczone paskami: brązowym, czarnym, pomarańczowym, złotym) oraz przewody. Wybrane podzespoły są umieszczone na płycie prototypowej w odpowiednich miejscach i nie należy ich z niej usuwać lub przemieszczać. 2.1 Wykonanie niezbędnych połączeń: Odłączyć zasilanie! Wykonać przewodami następujące połączenia: - podłączyć masę płytki prototypowej (VSS) do wyprowadzeń 5,6,7 (linie adresowe A0,A1,A2) oraz 8 (ujemny biegun zasilania Vss). - podłączyć napięcie zasilania (Vdd) do wyprowadzeń 16 (Vdd) i 14 (Vref) przetwornika. - podłączyć wyprowadzenie 9 (SDA) do portu P4, - przy pomocy rezystora 10kΩ (oznaczonego paskami: brązowym, czarnym, pomarańczowym, złotym) połączyć wyprowadzenie 9 (SDA) przetwornika do Vdd. - podłączyć wyprowadzenie 10 (SCL) do portu P5, - przy pomocy rezystora 10kΩ (oznaczonego paskami: brązowym, czarnym, pomarańczowym, złotym) połączyć wyprowadzenie 10 (SCL) przetwornika do Vdd. - wyprowadzenie AGND (13) przetwornika połączyć z masą (Vss). - wejście wyboru oscylatora 12 (EXT) podłączyć do Vss wybierając jako źródło sygnału zegarowego dla przetwornika wbudowany w niego wewnętrznym oscylator. Ustawić miernik uniwersalny do pracy jako woltomierz oraz wykonać dodatkowe połączenia: - za pomocą dłuższego, czerwonego przewodu z wtykiem bananowym podłączyć dodatni zacisk miernika uniwersalny do wyprowadzenia 15 (AOUT). - czarnym dłuższym przewodem z wtykiem bananowym połączyć ujemny zacisk miernika z wyprowadzeniem 13 (AGND) Zgłosić prowadzącemu gotowy układ do sprawdzenia połączeń i włączenia układu. Nie włączać samodzielnie układu, gdyż przy błędzie w połączeniach może nastąpić uszkodzenie przetwornika. 5 2.2 Badanie charakterystyki przetwornika CA Aby sporządzić charakterystykę przetwornika, należy w oparciu o udostępnione niskopoziomowe procedury obsługi magistrali I2C oraz dokumentację układu PCF 8591 przygotować odpowiedni program sterujący przetwornikiem CA. Biblioteka niskopoziomowych procedur obsługi magistrali I2C składa się z 4 funkcji: I2C_Start - wystawia na magistralę warunek startu, I2C_TX_Byte - wysyła na magistralę jeden bajt (wartość jest przekazywana przez zmienną i2cWork), I2C_RX_Byte - odbiera z magistrali jeden bajt (odebrany bajt jest zwracany w zmiennej i2cWork), I2C_Stop - wystawia na magistralę warunek stopu. Przed rozpoczęciem korzystania z przetwornika PCF8591 należy ustalić: - wartość bajtu adresującego przetwornik - wartość bajtu konfiguracyjnego przetwornika Zgodnie z Fig. 4 str. 5 dokumentacji przetwornika [4], cztery najstarsze bity bajtu adresującego są na stałe ustalone przez producenta na wartość 1001. Trzy kolejne bity zależą od wartości logicznych podanych na wejścia A2-A0 przetwornika. W przyjętej konfiguracji wejścia A2-A0 są połączone z Vss, co ustala stan tych wejść na 000. Najmłodszy bit określa kierunek transmisji: 0 – dla zapisu do przetwornika, 1 dla odczytu z przetwornika. W tej części ćwiczenia jedyną wykonywaną operacją będzie zapis danych do przetwornika, zatem wartość tego bitu pozostanie przez cały czas zerem. Wartość bajtu konfiguracyjnego przetwornika można wyznaczyć na podstawie rysunku 5 str. 6 dokumentacji do układu PCF8591 [4]. Należy ustawić następujące parametry pracy przetwornika: - korzystać z zerowego kanału przetwornika AC (AIN0), - wyzerowany bit autoinkrementacji, - wejścia przetwornika A/C skonfigurowane jako 4 pojedyncze (single ended) wejścia, - odblokowany przetwornik C/A. Aby wykonać cykl przetworzenia jednej wartości cyfrowej na postać analogową należy: - wystawić przy pomocy procedury I2C_Start warunek startu, przy pomocy procedury I2C_TX_Byte wysłać na magistralę wyznaczony wcześniej bajt adresujący. Wysłanie tego baju powoduje zaadresowanie przetwornika. Wysyłane od tej pory na magistrale dane będą przeznaczone wyłącznie dla zaadresowanego układu, aż do wysłania warunku stopu. Przykładowe wywołanie procedury I2C_TX_Byte wysyłające na magistralę I2C bajt o wartości szesnastkowej 55 HEX może w języku PBASIC przyjąć następującą postać (użyta w przykładzie wartość nie jest poprawnym adresem przetwornika na magistrali I2C, służy jedynie pokazaniu sposobu wywołania procedury I2C_TX_Byte): 6 i2cWork = $55 GOSUB I2C_TX_Byte - - - - - sprawdzić stan bitu potwierdzenia przechowywany w zmiennej i2cAck. Jeśli jest on równy 0 przetwornik został poprawnie zaadresowany i można wysyłać kolejne bajty. Jeśli ma on wartość 1 oznacza to prawdopodobne błędy w montażu lub w działaniu układu. W takiej sytuacji należy poprosić o pomoc prowadzącego. przy pomocy procedury I2C_TX_Byte wysłać przez magistralę I2C wyznaczony wcześniej bajt konfiguracji przetwornika oraz sprawdzić stan bitu i2cAck potwierdzającego poprawny odbiór danej. przy pomocy procedury I2C_TX_Byte wysłać na magistralę wartość przeznaczoną do przetworzenia na postać analogową oraz sprawdzić stan bitu i2cAck potwierdzającego poprawny odbiór danej. (w celu łatwej oceny poprawności działania zmontowanego układu, proponuje się, aby przy pierwszym uruchomieniu przetwornika, jako danej mającej zostać zamienioną na postać analogową użyć wartości 128 (80H). Poprawnie działający układ przetwornika powinien na wyjściu analogowym wystawić napięcie równe połowie wartości napięcia referencyjnego podawanego na wejście VREF przetwornika. W układzie badanym w trakcie ćwiczenia oznacza to pojawienie się na wyjściu AOUT napięcia około 2.5V), przy pomocy procedury I2C_TX_Byte wysłać na magistralę po raz drugi tę samą wartość przeznaczoną do przetworzenia na postać analogową (wynika to z opisanego w dokumentacji sposobu działania przetwornika), wystawić przy pomocy procedury I2C_Stop warunek stopu, kończąc wymianę danych z przetwornikiem. Zaobserwować na woltomierzu, jaka wartość napięcia ustaliła się na wyjściu AOUT przetwornika. Po stwierdzeniu, że układ działa poprawnie przeprowadzić serie pomiarów, które pozwolą sporządzić charakterystykę przetwornika. Powtarzając opisaną wcześniej procedurę należy powtórzyć, aby uzyskać wartości napięć dla: - pierwszych 16 wartości słowa wejściowego (00-0F), - wartości ze środka zakresu przetwarzania (7E-81) - wartości z końca zakresu przetwornika (F8-FF) Wyniki pomiarów zanotować. (Można również przygotować program, który pozwoli na automatyczną Na podstawie tych pomiarów wyznaczyć podstawowe parametry przetwornika: - zakres przetwarzania - rozdzielczość. Sporządzić wykres charakterystyki Uwy(n). Po zakończeniu pomiarów nie rozmontowywać układu. Po modyfikacjach zostanie on wykorzystany w dalszej części zajęć. 7 2.3 Badanie charakterystyki przetwornika AC Odłączyć zasilanie! Potencjometr Przetwornik PCF 8591 Rys. 2 Rozmieszczenie wybranych elementów na płycie prototypowej. Przetwornik PCF8591 oraz potencjometr wieloobrotowy o wartości 10 kΩ zostały umieszczone w płytce prototypowej w sposób przedstawiony na Rys. 2. Takie rozmieszczenie sprawia, że wyjście suwaka potencjometru jest podłączone do wejścia AIN0 przetwornika. Potencjometr ma działać w konfiguracji regulowanego dzielnika napięcia. Będzie służył do zadawania na wejście analogowe AIN0 przetwornika PCF8591 różnych wartości napięcia z przedziału <0,Vref>. Oznaczenia wyprowadzeń potencjometru przedstawiono na Rys. 3. Skrajne wyprowadzenia potencjometru podłączyć odpowiednio do masy (Vss) i zasilania (Vdd). Suwak potencjometru (wyprowadzenie środkowe) podłączyć do wyprowadzenia 1(AIN0) układu przetwornika. Dłuższy, czerwony przewód miernika uniwersalnego podłączyć do wyprowadzenia 1 (AIN0) przetwornika. Czarny przewód miernika pozostawić podłączony do wyprowadzenia 13 (AGND). 2 1 3 1 3 2 Rys. 3 Oznaczenie wyprowadzeń potencjometru Zgłosić prowadzącemu gotowy układ do sprawdzenia połączeń i włączenia układu. Korzystając z dołączonej biblioteki obsługi magistrali I2C obsłużyć przetwornik AC. Przed rozpoczęciem przetwarzania A/C przetwornik powinien otrzymać odpowiedni baj konfiguracyjny. Właściwa również dla tej części ćwiczenia wartość tego bajtu została ustalona w części ćwiczenia związanej z przetwarzaniem C/A. Może zatem zostać wykorzystana. Wysłanie bajtu konfiguracyjnego wykonuje się w sposób identyczny jak w części związanej z przetwarzaniem CA. Można wykorzystać używany wcześniej program, ograniczając jego działanie do wysłania na magistralę I2C bajtu adresującego 8 przetwornik oraz bajtu konfiguracji. Po ich wysłaniu można zakończyć komunikację wystawiając na magistralę warunek stopu. W procesie przetwarzania A/C mikrokontroler musi odbierać od przetwornika dane będące wynikiem przetworzenia analogowej wartości napięcia podanego na wejście przetwornika na wartość cyfrową. Zgodnie ze specyfikacją magistrali I2C, urządzenie, z którego odczytywane są dane jest widoczne na magistrali pod innym adresem (najmłodszy bit bajtu adresowego jest ustawiony na wartość 1). Należy zatem w podobny sposób jak przy przetwarzaniu C/A wyznaczyć ten adres, pamiętając przy tym o ustawieniu najmłodszego bitu na 1. Prawidłowa sekwencja uruchamiająca przetwornik PCF8591 do pracy w trybie A/C może wyglądać następująco: - wystawienie warunku startu (I2C_Start), - wysłanie bajtu adresującego dla ustawienia konfiguracji przetwornika (I2C_TX_Byte), - wysłanie bajtu konfiguracji przetwornika (I2C_TX_Byte), - wystawienie warunku stopu (I2C_Stop), - wystawienie warunku startu (I2C_Start), - wysłanie bajtu adresującego (innego niż wcześniej dla zapisu) dla odczytu danej z przetwornika (I2C_TX_Byte), - odczyt danej z przetwornika procedurą I2C_RX_Byte (wartość odczytanej danej zostanie umieszczona w zmiennej i2cWork) - ponowny odczyt danej z przetwornika procedurą I2C_RX_Byte – zgodnie z dokumentacją przetwornika, proces przetwarzania jest wyzwalany operacją odczytu danej z przetwornika. Zatem dopiero druga odczytana wartość jest poprawnym wynikiem przetworzenia napięcia wejściowego na wartość cyfrową. - wyświetlenie lub wykorzystanie w inny sposób uzyskanej danej z przetwornika Otrzymaną z przetwornika daną można wyświetlić na konsoli komputera, umieszczając w programie instrukcję: DEBUG "Wartosc przetworzona ", DEC i2cWork,CR - kolejny odczyt wartości z przetwornika. wystawienie warunku stopu (I2C_Stop) kończącego pracę przetwornika. Zmieniając położenie potencjometru zarejestrować około 20 punktów pomiarowych w całym zakresie zmian napięcia wejściowego. Aby usprawnić pomiary można zapętlić program tak, aby wykonywał sekwencyjny odczyt wyzwalając automatycznie kolejne cykle przetwarzania. Obliczyć teoretyczną wartość napięcia odpowiadającą zmianie wartości słowa wyjściowego o 1 bit. Na tej podstawie postarać się doświadczalnie wychwycić zmianę napięcia na wejściu odpowiadającą różnicy na pozycji najmłodszego bitu. Określić zakres i rozdzielczość przetwornika. Z uzyskanych danych sporządzić wykres charakterystyki przetwornika. 9 Załącznik – procedury obsługi programowej emulacji interfejsu I2C dla BS2 ' i2c.bs2 ' procedury obslugi emulacji programowej magistrali i2c ' dla BasicStamp 2 '{$STAMP BS2} '{$PBASIC 2.5} ' -----[ I/O Definitions ]------------------------------------------------SDA PIN 4 ' I2C serial data line SCL PIN 5 ' I2C serial clock line ' -----[ Constants ]------------------------------------------------------Ack CON 0 ' jest bit podwierdzenia Nak CON 1 ' brak bitu potwierdzenia ' -----[ Variables ]------------------------------------------------------i2cWork VAR Byte i2cAck VAR Bit ' zmienna robocza dla procedur nadawania i odbioru ' bit Ack (potwierdzenie z urzadzenia) ' ------------------------------------------------------------------------'ponizej umieszczamy wlasny program 'wysylany lub odbierany bajt z i2c przekazywany jest przez zmienna i2cWork END ' -----[ Niskopoziomowe procedury magistrali I2C]-------------------------' *** Warunek Startu *** I2C_Start: INPUT SDA INPUT SCL LOW SDA Clock_Hold: DO : LOOP UNTIL (SCL = 1) ' czekamy na zwolnienie zegara RETURN ' *** Wysłanie bajtu na magistrale *** I2C_TX_Byte: SHIFTOUT SDA, SCL, MSBFIRST, [i2cWork\8] ' wysłanie bajtu do odbiorcy SHIFTIN SDA, SCL, MSBPRE, [i2cAck\1] ' odbiór bitu potwierdzenia RETURN ' *** Odbiór bajtu z magistrali*** I2C_RX_Byte_Nak: i2cAck = Nak ' brak Ack = high GOTO I2C_RX I2C_RX_Byte: i2cAck = Ack ' jest Ack = low I2C_RX: SHIFTIN SDA, SCL, MSBPRE, [i2cWork\8] SHIFTOUT SDA, SCL, LSBFIRST, [i2cAck\1] ' odbior bajtu od nadawcy ' wystawienie potwierdzenia ' ack lub nak RETURN ' *** Warunek Stopu *** I2C_Stop: LOW SDA INPUT SCL INPUT SDA RETURN ' -----[ Koniec I2C.BS2]--------------------------------------------------- 10