OPROGRAMOWANIE APARATURY POMIAROWEJ - IME
Transkrypt
OPROGRAMOWANIE APARATURY POMIAROWEJ - IME
OPROGRAMOWANIE APARATURY POMIAROWEJ OPROGRAMOWANIE APARATURY µP Transmisja szeregowa na przykładzie portu szeregowego, tunera radiowego i preprocesora RDS Laboratorium 1. Cel ćwiczenia Celem ćwiczenia jest zapoznanie studentów z szeregowym przesyłaniem informacji na przykładzie portu szeregowego mikrokontrolera, magistrali I2C jak również nie standaryzowanego interfejsu szeregowego oraz pokazanie darmowych narzędzi służących do uruchamiania systemów mikroprocesorowych na przykładzie programu monitora PAULMON2. Transmisja na magistrali I2C musi być generowana programowo poprzez odpowiednie sterowanie liniami SDA i SCL. 2. Tuner radiowy OM 5610 Firma Philips opracowała układ scalony oznaczony symbolem TEA5757, który w niewielkiej strukturze integruje wszystkie elementy torów radiowych FM i AM oraz dekoder stereofoniczny. Nie jest to jednak najważniejsza cecha tego układu. Z punktu widzenia jego zastosowania, znacznie większe znaczenie ma sposób jego strojenia. Do tego celu wykorzystywany jest czteroprzewodowy, synchroniczny interfejs szeregowy. Dalszym uproszczeniem stosowania niniejszego układu było zaprojektowanie przez inżynierów firmy Philips miniaturowego modułu z układem TEA5757, tworząc kompletny odbiornik FM z wbudowanym dekoderem stereofonicznym i inteligentnym systemem strojenia [9]. Właśnie taki moduł zastosowano w makiecie wykorzystywanej do realizacji niniejszego ćwiczenia. 2.1. Programowanie tunera Programowanie tunera odbywa się poprzez czteroprzewodowy, szeregowy interfejs synchroniczny. Na rys. 3 (dodatek A) znajdują się przebiegi czasowe sygnałów sterujących podczas procesu zapisu danych do rejestru konfiguracyjnego układu TEA5757, natomiast przebiegi z rys. 2 (dodatek A) obrazują proces odczytu danych z tunera. Zarówno wysyłanie jak odbiór informacji z układu odbywa się począwszy od najstarszego bita ramki przedstawionej na rys. 1. Oprócz trzech linii WREN, CLCK i DATA biorących bezpośredni udział w procesie przesyłania i odbierania danych do/z tunera, istnieje jeszcze czwarta linia oznaczona STEREO. Jest ona wykorzystywana do identyfikacji aktualnego stanu tunera, co zaprezentowano w tabeli. 2 (dodatek A). Zastosowany w układzie TEA5757 zaawansowany system automatycznego strojenia umożliwia przeprowadzenie tego procesu na dwa sposoby: • ściśle do zaprogramowanej przez użytkownika częstotliwości z dokładnością do 12,5kHz, • automatyczne wyszukiwanie pierwszego silnego sygnału stacji w górę lub w dół od aktualnie ustawionej częstotliwości. Wewnętrzny przesuwny rejestr konfiguracyjny układu TEA5757, który można zapisywać lub odczytywać, ma długość 25 bitów. Zapis wszystkich bitów do rejestru wymaga 25 taktów zegarowych, natomiast do odczytu jego zawartości wystarczają 24 takty. MSB 24 Start strojenia 23 22 21 20 19 18 17 16 Kierunek Góra Doł Mono Stereo 0 0 Local DX 0 S0 S1 15 14 13 12 11 10 9 8 0 0 F13 F12 F11 F10 F9 F8 7 6 5 4 3 2 1 LSB 0 F7 F6 F5 F4 F3 F2 F1 F0 Rys.1. Struktura rejestru przesuwnego układu TEA5757 1 14 najmłodszych bitów (F0÷F13) służy do ustalania częstotliwości stacji radiowej i jest brane przez układ pod uwagę tylko wtedy, gdy użytkownik chce zaprogramować odbiór stacji o ściśle określonej częstotliwości (bit 24 = 0). Wagi poszczególnych bitów przedstawiono w tabeli 4 (dodatek A). Po ustaleniu kodu pożądanej częstotliwości należy dodać do niego wartość odpowiadającą częstotliwości 10,7MHz (częstotliwość pośrednia dla sygnału zmodulowanego częstotliwościowo). Dla przykładu kod odpowiadający częstotliwości 94,1MHz (Polskie Radio Program 3) wynosi 1D68H. Kod częstotliwości 10,7MHz wynosi 0358H. Zatem zapis wartości 20C0H na bitach F0÷F13 będącej sumą przedstawionych kodów pozwoli na dostrojenie tunera do częstotliwości 94,1MHz. Bit 15 nie jest używany. Dwa kolejne bity (16 i 17) służą do ustalania czułości systemu wyszukiwania zgodnie z tabelą 4 (dodatek A). Również bit 18 nie jest w niniejszej aplikacji wykorzystywany. Za pomocą bitu 19 ustalany jest tryb pracy bloku automatycznej regulacji wzmocnienia (ARW) – patrz tabela 3 (dodatek A). Dwa kolejne bity (20 i 21) wykorzystywane są do przełączania zakresów FM MW, LW lub SW. W niniejszej aplikacji mogą przyjąć tylko wartość 0 wybierając zakres FM w paśmie 88..108MHz. Bit 22 odpowiada za wymuszenie pracy dekodera w trybie monofonicznym (logiczne 0) lub zezwolenie na pracę w trybie stereo (logiczne 1), o ile odbierana stacja nadaje sygnał w takim trybie [9]. Wysłanie ramki sterującej z ustawiony bitem 24 w stan jedynki logicznej uruchamia automatyczne przeszukiwanie zakresu częstotliwości i dostrojenie się układu tunera do odbioru sygnału pierwszej napotkanej stacji radiowej. Kierunek strojenia (0 – w górę, 1 – w dół) od aktualnie ustawionej częstotliwości określa bit 23. UWAGA: Należy pamiętać, że po zapisie informacji do tunera a przed dokonaniem operacji odczytu należy do linii portu, do której jest podłączone wejście DATA tunera wpisać 1 w celu ustawienia jej jako wejście. 3. Podstawowe informacje o RDS 3.1. Zarys historyczny System RDS (ang. Radio Data System) powstał jako ułatwienie posługiwania się odbiornikiem UKF FM i jest stosowany do przesyłania dodatkowych informacji cyfrowych w trakcie nadawania audycji radiowych w paśmie UKF/FM (87,5..108MHz) [3]. Dane docierające do radioodbiorników wykorzystywane są m.in do strojenia urządzenia. Dzięki temu zazwyczaj nie sposób jest zauważyć, kiedy odbiornik przełączył się na odbiór z nadajnika o silniejszym sygnale odbieranej stacji [5]. Pierwsze prace nad stworzeniem systemu przekazującego dodatkowe informacje i zarazem nie powodującego zakłóceń przeprowadzone zostały pod koniec lat siedemdziesiątych XX wieku. Swoje projekty przygotowały takie kraje jak: Wielka Brytania, Szwecja, Finlandia, Holandia i Francja. Po przeprowadzeniu testów okazało się, że najlepszą propozycję przygotowali Szwedzi. W 1982 roku wprowadzona została nazwa RDS oraz zdecydowano się na przyjęcie systemu jako zalecanego w Europie. Cztery lata później Międzynarodowy Komitet Radiokomunikacyjny (CCIR) zalecił stosowanie go do przekazywania dodatkowych informacji wraz z sygnałem stacji UKF [1]. 3.2. Struktura informacyjna systemu RDS Strukturę strumienia bitów informacji nadawanej w systemie RDS pokazano na rys. 2. Najważniejszym elementem przesyłanej informacji jest grupa o długości 104 bitów. Każda grupa składa się z czterech bloków. Z kolei blok to 16 bitów informacji i 10 bitów nadmiarowych, w których zakodowane jest słowo kontrolne oraz informacja określająca rodzaj bloku. Słowo kontrolne jest niezbędne do wykrywania i ewentualnej korekcji powstałych w trakcie przesyłania błędów transmisji [3]. Grupa = 4 bloki = 104 bity Blok A Blok B Blok C Blok D Blok = 26 bitów Słowo informacyjne Słowo kontrolne Słowo informacyjne = 16 bitów Słowo kontrolne = 10 bitów m15 m14 m13 m12 m11 m10 m9 m8 m7 m6 m5 m4 m3 m2 m1 m0 2 c9 c8 c7 c6 c5 c4 c3 c2 c1 c0 Rys.2. Struktura informacji przesyłanej w RDS Na rys.3 pokazano organizację informacji przesyłanej w grupie. Kolejne bloki w grupie oznaczone są literkami: A, B, C i D. Blok A w każdej grupie zawiera słowo PI (ang. Program Identification), którego struktura pokazana jest na rys. 4. Słowo PI jest używane do jednoznacznej identyfikacji nadawanego programu. Blok A Blok B B0 Słowo kontrolne + offset A Kod PI A3 A2 A1 A0 Typ 0 Słowo kontrolne + offset A A1 A0 Typ 1 Słowo kontrolne + offset D Wersja A Blok B Kod PI Blok D Słowo kontrolne + offset C TPC PT4 PT3 PT2 PT1 PT0 B0 A2 Słowo kontrolne + offset B PTY Blok A A3 Blok C TP Blok C' Blok D TP Słowo kontrolne + offset B PTY Kod PI TPC PT4 PT3 PT2 PT1 PT0 Słowo kontrolne + offset C' Słowo kontrolne + offset D Wersja B Rys.3. Budowa grupy danych Pięć najstarszych bitów bloku B umożliwia identyfikację typu (numeru) i wersji grupy: cztery najstarsze określają typ grupy (0..15), a najmłodszy wersję (0 – wersja A, 1 – wersja B). W przypadku wersji B w bloku C jest powtarzany kod PI. Ma to na celu umożliwienie szybszego dostępu do informacji niezbędnych do przestrojenia odbiornika. Kolejny bit oznaczony TP umożliwia stwierdzenie, czy stacja radiowa nadaje informacje dla kierowców o ruchu drogowym. Bity PT4..PT0 zawierają dane związane z typem transmitowanej audycji (PTY), zgodnie z opisem w tabeli 1. Niektóre stacje radiowe nadają stały kod PTY niezależnie od aktualnie nadawanej treści, inne zmieniają go dynamicznie w zależności od rodzaju nadawanej audycji. Pozostałe pięć bitów bloku B są wykorzystywane w różny sposób w zależności od typu grupy. Tabela 1. Kody PTY nadawanych programów Nr 0 Kod 00000 Typ programu Brak Wyświetlacz NONE Nr 16 Kod 10000 Typ programu Pogoda Wyświetlacz WEATHER 1 00001 Wiadomości NEWS 17 10001 Finanse FINANCE 10010 Dla dzieci CHILDREN 10011 Sprawy społeczne SOCIAL A 2 00010 Bieżące wydarzenia AFFAIRS 18 3 00011 Informacje INFO 19 4 00100 Sport SPORT 20 10100 Religia RELIGION 10101 Forum telefoniczne PHONE IN 5 00101 Edukacja EDUCATE 21 6 00110 Teatr DRAMA 22 10110 Podróże 7 00111 Kultura CULTURE 23 10111 8 01000 Nauka SCIENCE 24 11000 Zainteresowania i hobby Muzyka jazzowa HOBBY/ LEISURE JAZZ 9 01001 Rozmaitości VARIED 25 11001 Muzyka country COUNTRY 10 01010 Muzyka pop POP M 26 11010 Muzyka krajowa MNATION M 11011 Stare przeboje OLDIES 11 01011 Muzyka rockowa ROCK M 27 12 01100 Muzyka lekka M,O,R,M / EASY M 28 11100 Muzyka folkowa FOLK 13 01101 11101 Dokumentalny DOCUMENT 01110 01111 LIGHT M CLASSIC 29 14 15 Lekka muzyka klasyczna Muzyka klasyczna 30 11110 Test alarmu TEST Inna muzyka OTHER M 31 11111 Alarm ALARM 3 PI jest czterocyfrowym (przy zapisie heksadecymalny) kodem przypisanym do stacji radiowej. Każda z cyfr w kodzie pełni swoją rolę: pierwsza określa kraj, z którego nadawany jest program (3 – Polska, 5 – Słowacja, 2 – Czechy, D – Niemcy, F – Francja), druga mówi o zasięgu (patrz tabela 2). Pozostałe dwie - na przykład w Niemczech - kodują informację o publiczności/prywatności nadawcy i numerze programu. Na podstawie kodu PI odbiornik może zidentyfikować odbieraną stację [5]. Kod kraju Obszar nadawania b15 b14 b13 b12 b11 b10 b9 Rodzaj nadawcy b8 b7 b6 b5 b4 Nr programu b3 b2 b1 b0 Rys.4. Budowa słowa PI Słowo PI, typ i wersja grupy, typ programu PTY oraz bit TP przesyłane są w każdej grupie. Interpretacja informacji zawartej w pozostałych bitach bloku B oraz blokach C i D jest zależna od typu i wersji grupy. Tabela 2. Znaczenie trzeciej cyfry słowa PI Kod 0 1 2 3 4 5 6 7 8 9 A B C D E F Opis Lokalny (program transmitowany przez jeden nadajnik) Międzynarodowy (ten sam program jest transmitowany w różnych krajach) Krajowy (program transmitowany na terenie całego kraju) Ponad regionalny (program transmitowany na znacznym obszarze danego kraju) Regionalny (program dostępny na terenie pewnego regionu na jednej lub kilku częstotliwościach) 3.3. Budowa grupy 0 W grupie 0A oprócz kodu PI, typu grupy, bitów B0 i TP oraz kodu typu programu PTY, przesyłane są również następujące informacje: • bit TA jest uzupełnieniem informacji niesionej przez bit TP. Znaczenie poszczególnych kombinacji tych bitów przedstawiono w tabeli 3. • bit M/S informuje o rodzaju nadawanej audycji: 0 - muzyka (ang. music), 1 - audycja słowna (ang. speech). • bit DI informuje o typie dekodera i jego znaczenie jest ściśle powiązane ze stanem bitów C0 i C1 (patrz tabela 4). Tabela 3. Znaczenie bitu TA w zależności od stanu bitu TP TP 0 0 1 1 TA 0 1 0 1 Opis Program nie zawiera informacji dla kierowców Program zawiera informacje dla kierowców Program zawiera tylko zapowiedzi programu dla kierowców Informacja dla kierowców jest aktualnie nadawana Tabela 4. Sposób kodowania informacji o programie DI d3 = 0 d3 = 1 d2 = 0 d2 = 1 d1 = 0 d1 = 1 d0 = 0 d0 = 1 C1 0 0 0 0 1 1 1 1 C0 0 0 1 1 0 0 1 1 Opis Stałe PTY Dynamicznie przełączane PTY Brak kompresji Kompresja Brak „symulowanego nagłówka” „Symulowany nagłówek Program mono Program stereo 4 W bloku D omawianej grupy transmitowane są dwa znaki nazwy odbieranej stacji (ang. Program Service). Aby prawidłowo skompletować cały ośmioznakowy tekst, bitami C0 i C1 zakodowany jest numer pary znaków aktualnie przesyłanych w odebranej grupie. M/S B0 Słowo kontrolne + offset A Kod PI 0 0 0 0 0 Wersja A TA DI TP Typ Słowo kontrolne + offset B PTY DI C1 C0 d3 d2 d1 d0 0 0 1 1 0 1 0 1 Słowo kontrolne + offset C Częstotliwości alternatywne b15 b14 b13 b12 b11 b10 1 3 5 7 b9 b8 Słowo kontrolne + offset D Segment nazwy serwisu b7 b6 b5 b4 b3 b2 b1 b0 2 4 6 8 Numery znaków M/S B0 Słowo kontrolne + offset A Kod PI 0 0 0 0 1 Wersja B TA DI TP Typ PTY DI C1 C0 d3 d2 d1 d0 0 0 1 1 0 1 0 1 Słowo kontrolne + offset B Słowo kontrolne + offset C Kod PI b15 b14 b13 b12 b11 1 3 5 7 b10 b9 b8 Słowo kontrolne + offset D Segment nazwy serwisu b7 b6 b5 b4 b3 b2 b1 b0 2 4 6 8 Numery znaków Rys.5. Budowa grupy 0A i 0B W wersji A omawianej grupy, blok C zawiera zakodowaną listę alternatywnych częstotliwości nadawcy. Ponieważ w bloku C przesyłane są tylko 2 bajty, lista częstotliwości przesyłana jest w sposób zakodowany. Przyjęto dwie metody kodowania: A i B (nie mają one nic wspólnego z rodzajami grupy) [3]. Kodowanie A stosuje się dla przypadku, gdy lista alternatywnych częstotliwości ma co najwyżej 25 pozycji. W takim wypadku pierwsza wartość określa liczbę częstotliwości na liście i jest zakodowana za pomocą wartości z przedziału 225..249 (225 = 1 częstotliwość, 226 = 2 częstotliwości, itd.), natomiast wartościom częstotliwości alternatywnych z zakresu górnego pasma UKF (87,6..107,9MHz) z krokiem 0,1MHz, przyporządkowane są kody w zakresie 1..204 (1 = 87,6MHz, 2 = 87,7MHz, itd.). Jeśli po odebraniu grupy pierwszy bajt bloku C jest wartością z przedziału 225..249 oznacza to, że jest to liczba wartości częstotliwości na liście. W przeciwnym razie jest to zakodowana wartość częstotliwości. Drugi bajt bloku C może zawierać kod częstotliwości lub przy parzystej liczbie częstotliwości alternatywnych jest bajtem zamykającym o wartości 205. Tabela.5. Przykład kodowania nieparzystej liczby częstotliwości alternatywnych w wersji A #5 AF2 = 100 MHz AF4 = 103,2 MHz AF1 = 99,5 MHz AF3 = 102,4 MHz AF5 = 103,8 MHz 229 124 157 120 149 163 Tabela 6. Przykład kodowania parzystej liczby częstotliwości alternatywnych w wersji A #4 AF2 = 100 MHz AF4 = 103,2 MHz AF1 = 99,5 MHz AF3 = 102,4 MHz Bajt zamykający 229 124 157 120 149 205 Sposób kodowania listy częstotliwości alternatywnych w wersji B zostanie przedstawiony na przykładzie zaprezentowanym w tabeli 7. Pierwsze dwa bajty zawierają liczbę częstotliwości alternatywnych oraz aktualną częstotliwość odbieranego programu. W kolejnych parach bajtów powtarzana jest częstotliwość nadawanego programu i przesyłana jest jedna częstotliwość alternatywna. Normalnie wartości w dwóch bajtach są umieszczane rosnąco, tzn. wartość w starszym bajcie jest mniejsza od wartości w bajcie młodszym (patrz pierwsze dwie pary w tabeli 7). Jeśli dwie wartości transmitowane są malejąco to znaczy, że częstotliwość 5 alternatywna związana jest z innym regionem lub czasami jest na niej transmitowany inny program (patrz ostatnie dwie pary w tabeli 7). Tabela 7. Przykład kodowania częstotliwości alternatywnych w wersji B #4 AF1 = 89,3 MHz 99,5 MHz AF3 = 104,8 MHz 99,5 MHz 99,5 MHz 99,5 MHz AF2 = 100,9 MHz 99,5 MHz AF4 = 89,1 MHz 229 18 120 173 120 120 120 134 120 16 Grupa 0 jest nadawana najczęściej. W krańcowym przypadku może być ona jedyną nadawaną grupą. Jeśli wysyłane są również inne grupy, to częstotliwość jej nadawania jest zmniejszana, jednak nie bardziej niż do dwóch powtórzeń w ciągu sekundy. Związane jest to z prawidłowym wyświetlaniem informacji PS i przesyłaniem listy alternatywnych częstotliwości [1]. W przypadku nadawania grupy 0 w wersji B, w bloku C nie jest przesyłana informacja o częstotliwościach alternatywnych, lecz ponownie nadawany jest kod PI odbieranej stacji. 3.4. Budowa grupy 2 Grupa 2 zawiera oprócz wcześniej wymienionych standardowych informacji przesyłanych w każdej grupie, informację alfanumeryczną nazwaną radiotekstem. Wersja A omawianej grupy dopuszcza przesłanie 64 znaków tekstu, natomiast tekst w wersji B zawiera tylko 32 znaki. Organizację informacji w grupie pokazano na rys. 6. Poniżej omówiono grupę 2A. Cztery najmłodsze bity bloku B określają adres segmentu złożonego z czterech znaków nadawanych w bloku C i D. Cały tekst ma 16 segmentów po 4 znaki, co daje razem 64 znaki. Jeśli nadawana informacja ma długość większą niż 16 segmentów, to musi kończyć się kodem CD (0DH). Znaki radiotekstu przesyłane w bloku C i D nadawane są w kodzie ASCII [3]. W bloku B przesyłany jest dodatkowy bit Text A/B flag, Jeśli odbierana jest zmiana tego bitu z 0 na 1 lub odwrotnie, to należy wyzerować bufor przechowujący odbierany tekst i uzupełniać go nowym. Jeśli natomiast zmiana taka nie występuje, to aktualnie odebrany segment należy wpisać do istniejącego tekstu w buforze na pozycję określoną bitami C3 do C0 [3]. B0 Słowo kontrolne + offset A Kod PI 0 0 1 0 0 Wersja A Typ 0 0 1 1 Wersja B Słowo kontrolne + offset B b15 Słowo kontrolne + offset C Segment radiotekstu ... b8 b7 ... C2 C1 C0 0 0 . . . . 0 0 0 0 0 1 . 1 5 2 6 1 1 1 1 61 62 Słowo kontrolne + offset A 0 PTY C3 B0 Kod PI Text A/B TP . b0 Słowo kontrolne + offset D Segment radiotekstu b15 Numery znaków ... b8 b7 ... 3 7 4 8 63 64 . b0 . Text A/B TP Typ PTY Słowo kontrolne + offset B Kod PI Słowo kontrolne + offset C Słowo kontrolne + offset D Segment radiotekstu b15 ... C2 C1 C0 0 0 0 0 0 0 0 1 1 3 2 4 1 1 1 1 31 32 . . . . b8 b7 ... C3 . Numery znaków . Rys.6. Budowa grupy 2A i 2B 6 b0 4. Programowa obsługa sprzętowego preprocesora RDS Zastosowany w makiecie sprzętowy preprocesor RDS SAA6588 firmy Philips dokonuje m.in.: filtracji i demodulacji sygnału RDS, samoczynnie synchronizuje się z przychodzącym sygnałem oraz przeprowadza korekcję błędów ograniczając działanie mikrokontrolera do odbioru kolejnych bloków i zestawiania ich w grupy. Komunikacja pomiędzy układem preprocesora a mikrokontrolerem obywa się za pośrednictwem magistrali I2C, której opis znajduje się w punkcie 5. Preprocesor występuje zawsze w roli układu slave, natomiast mikrokontroler pełni rolę układu master. Komunikacja może odbywać się z prędkością do 400kbps. Podłączenie linii SCL i SDA do mikrokontrolera przedstawiono na dołączonym do instrukcji schemacie ideowym makiety. Magistrala I2C jest podłączona do innych bloków preprocesora poprzez wewnętrzne rejestry (3 do zapisu i 7 do odczytu), każdy o rozmiarze jednego bajta. Przed przystąpieniem do odczytu danych z preprocesora należy wysłać do niego 3 bajty konfiguracyjne przedstawione na rys. 71. Bity znajdujące się w bajcie 0W dotyczą ustawień inicjujących i sterują pracą układu. Bajt 1W określa ustawienia dotyczące poziomu czułości wykrywania pauzy i korekcji przychodzącej informacji RDS. Bajt 2W odpowiada za ustawienie częstotliwości przyłączonego oscylatora i czułości detektora jakości sygnału. Opis znaczenia poszczególnych bitów wymienionych bajtów znajduje się w tabelach 3,6 i 7 w dodatku B. warunek startu z układu MASTER S 0 adres układu SLAVE + bit zapisu 0 1 0 0 0 MAD potwierdzenie odbioru z układu SLAVE 0 bajt 0W wysyłany przez układ MASTER A potwierdzenie odbioru z układu SLAVE SQCM TSQD NWSY SYM1 SYM0 RBDS DAC1 DAC0 PL1 A bajt 1W wysyłany przez układ MASTER potwierdzenie odbioru z układu SLAVE PL0 FEB0 FEB5 FEB4 FEB3 FEB2 FEB1 bajt 2W wysyłany przez układ MASTER PTF1 A potwierdzenie odbioru z układu SLAVE PTF0 SOSC SQS4 SQS3 SQS2 SQS1 SQS0 A P warunek stopu z układu MASTER Rys.7. Komendy sterujące preprocesora – konfiguracja Operacja konfiguracji preprocesora może być wykonana tylko jeden raz, aż do czasu, gdy układ nie zgłosi utraty synchronizacji (patrz informacje odczytywane z preprocesora). W takim wypadku wystarczy wysłać do niego ponownie tylko pierwszy bajt z ustawionym bitem NWSY w stan 1 w celu natychmiastowej ponownej synchronizacji (rys. 8). warunek startu z układu MASTER S 0 adres układu SLAVE + bit zapisu 0 1 0 0 0 MAD potwierdzenie odbioru z układu SLAVE 0 bajt 0W wysyłany przez układ MASTER SQCM TSQD 1 A potwierdzenie odbioru z układu SLAVE SYM1 SYM0 RBDS DAC1 DAC0 A P warunek stopu z układu MASTER Rys.8. Komendy sterujące preprocesora – natychmiastowe ponowne uruchomienie synchronizacji 1 Oznaczenie kolorystyczne wskazuje kierunek przesyłania informacji i jest zgodne z oznaczeniem przyjętym w punkcie 5. 7 Po przeprowadzeniu procesu synchronizacji układ preprocesora informuje mikrokontroler o dostępnych danych ustawieniem linii DAVN w stan 0 logicznego. Linia ta podłączona pod wejście INT0 mikrokontrolera może być sprawdzana programowo, jak również jej obsługa może odbywać się poprzez wykorzystanie systemu przerwań mikrokontrolera. Odbiór informacji z preprocesora odbywa się zgodnie ze standardem I2C. warunek startu z układu MASTER S 0 adres układu SLAVE + bit odczytu 0 1 0 0 0 MAD potwierdzenie odbioru z układu SLAVE 1 A potwierdzenie odbioru z układu MASTER bajt 0R odbierany z układu SLAVE BL2 BL1 BL0 SYNC DOFL RSTD ELB1 ELB0 A potwierdzenie odbioru z bajt 1R odbierany z układu SLAVE układu MASTER starszy bajt ostatnio przetworzonego bloku M15 M14 M13 M12 M11 M10 M09 M08 A potwierdzenie odbioru z bajt 2R odbierany z układu SLAVE układu MASTER młodszy bajt ostatnio przetworzonego bloku M07 M06 M05 M04 M03 M02 M01 M00 A potwierdzenie odbioru z bajt 3R odbierany z układu SLAVE starszy bajt poprzednio przetworzonego bloku układu MASTER PM15 PM14 PM13 PM12 PM11 PM10 PM09 PM08 A potwierdzenie odbioru z bajt 4R odbierany z układu SLAVE młodszy bajt poprzednio przetworzonego bloku układu MASTER PM07 PM06 PM05 PM04 PM03 PM02 PM01 PM00 bajt 5R odbierany z układu SLAVE A potwierdzenie odbioru z układu MASTER BEC5 BEC4 BEC3 BEC2 BEC1 BEC0 EPB1 EPB0 bajt 6R odbierany z układu SLAVE BP2 BP1 BP0 nie używany SQI3 SQI2 A brak potwierdzenia odbioru z układu MASTER SQI1 SQI0 A P warunek stopu z układu MASTER Rys.9. Protokół odbioru danych z preprocesora RDS Zatem w celu odbioru informacji z preprocesora RDS konieczne jest wysłanie na magistralę adresu (rys. 9), a następnie po uzyskaniu potwierdzenia od układu preprocesora, odbiór poszczególnych bajtów danych i wystawianie potwierdzeń. Należy pamiętać, że po odebraniu siódmego bajta informacji należy wystawić zanegowane potwierdzenie. Znaczenie poszczególnych bitów odbieranej informacji przedstawiają tabele 12 i 15. 8 5. Specyfikacja magistrali I2C 5.1. Ogólna charakterystyka magistrali I2C Magistrala I2C (ang. Inter-Integrated Circuit Bus) jest dwukierunkowym, dwuprzewodowym standardem komunikacji szeregowej, której głównym przeznaczeniem jest prosta integracja układów scalonych. System I2C składa się z dwóch linii: danych (ang. Serial Data, SDA) i zegarowej (ang. Serial Clock, SCL) oraz układów podłączonych do wymienionych linii. Standard ten pozwala na realizację wielu połączeń konfiguracyjnych. Niniejsze opracowanie omawia tylko implementacje konfiguracji, gdzie występuje jeden układ master i wiele układów slave. Układ podłączony do magistrali może pracować jako master (układ nadrzędny) lub slave (układ podrzędny). Układ master steruje przesyłaniem informacji na magistrali przez inicjację transmisji, generowanie sygnału zegarowego w trakcie przesyłania informacji oraz zakańcza procesu przesyłania danych. Ze względu na dopuszczenie w specyfikacji standardu możliwości występowania na magistrali kilku układów slave, zanim nastąpi przesyłanie właściwej informacji układ master wysyła na magistralę adres urządzenia slave, do którego ma ona dotrzeć. Zaadresowane urządzenie slave pełni określoną funkcję odbierając lub przesyłając dane z/do urządzenia master. Stąd niezależnie od podziału master-slave, układy podłączone do magistrali I2C są dzielone na nadajniki (ang. transmitter) i odbiorniki (ang. receiver). Przesyłanie informacji odbywa się nie tylko w kierunku od układu master (nadajnik) do układu slave (odbiornik). Czasami to układ master zwraca się do układu slave z żądaniem przesłania danych stając się odbiornikiem i czyniąc niejako automatycznie układ slave nadajnikiem. Niezależnie od przydziału ról nadajnik-odbiornik, zawsze układ master inicjuje i kończy transmisję danych po linii SDA oraz generuje sygnał zegarowy na linii SCL. Tabela 8. Podział układów podłączanych do magistrali I2C Termin Master Slave Nadajnik Odbiornik Opis Układ, który inicjuje i kończy transmisję na magistrali oraz generuje sygnał zegarowy. Układ adresowany przez układ master. Układ wysyłający dane na magistralę. Układ odbierający dane z magistrali. 5.2. Charakterystyka sprzętowa magistrali I2C Rys.10 przedstawia konfigurację magistrali I2C właściwą dla stosowanej w ćwiczeniu makiety. Linie SCL i SDA są podłączone do napięcia zasilania poprzez tzw. rezystory podciągające Rp, Stąd wymagane jest, aby układy podłączone do magistrali posiadały wyprowadzenia SCL i SDA w konfiguracji otwarty dren lub otwarty kolektor. Dzięki temu, jeśli magistrala jest wolna (nie jest przeprowadzana transmisja danych), linie SCL i SDA są w stanie wysokim. Istotną cechą charakterystyczną wynikającą z przedstawionej konfiguracji sprzętowej magistrali jest możliwość przeprowadzania tzw. „operacji AND na drucie”. Właściwość ta nie będzie tutaj dokładnie omawiana. Informacje na ten temat można znaleźć w [1] SCL Rp Rp SDA SCL SDA SCL Slave Rys.10. Schemat blokowy systemu I2C 9 SDA Master Vcc 5.3. Charakterystyka protokołu Przesyłanie danych na magistrali I2C może przebiegać na jeden z dwóch sposobów: a) Układ master chce wysłać dane do układu slave: • układ master adresuje układ slave, • układ master (nadajnik) wysyła dane do układu slave (odbiornika), • układ master kończy transmisje. b) Układ master chce odebrać dane z układu slave: • układ master adresuje układ slave, • układ master (odbiornik) odbiera dane wysyłane przez układ slave (nadajnika), • układ master kończy transmisje. 1 S 1 1 8 1 8 1 1 ADRES SLAVE'a W 7 A DANE A DANE A P przesyłanie danych n bajtów + potwierdzenia 0 = zapis A = potwierdzenie (SDA = 0) A = brak potwierdzenie (SDA = 1) S = warunek START P = warunek STOP transmisja z mastera do slave'a transmisja z slave'a do mastera Rys.11. Ramka informacyjna przy transmisji danych z układu master do układu slave 1 7 1 1 8 1 8 1 8 1 1 S ADRES SLAVE'a R A DANE A DANE A DANE A P przesyłanie danych n bajtów + potwierdzenia 1 = odczyt Rys.12. Ramka informacyjna przy transmisji danych z układu slave do układu master Na rys.11 i 12 pokazano typową ramkę związaną z protokołem przesyłania danych na magistrali I2C dla dwóch omawianych przypadków. Po zainicjowaniu początku transmisji (S), wysyłany jest 7-bitowy adres układu slave, po którym następuje jeden bit określający kierunek transmisji danych (0 określa transmisję danych z układu master do układu slave, natomiast 1 żądanie nadania danych przez układ slave). W sumie daje to 8bitowy bajt informacji. W następnej kolejności przesyłane są bajty danych w odpowiednim kierunku. Koniec transmisji danych (P) jest zawsze sygnalizowany przez układ master. Struktura ramki jest praktycznie stała za wyjątkiem bajtów danych i kierunku transmisji. 5.3.1. Warunki początku i końca transmisji W celu zaznaczenie początku i końca transmisji ramki informacyjnej pomiędzy układem master i slave, na magistrali I2C generowane są przez układ master odpowiednie stany nazywane warunkami START (S) i STOP (P). Warunek START generowany jest w celu przejęcia kontroli nad magistralą, przez wymuszenie na linii SDA przejścia z 1 na 0 przy utrzymanym stanie wysokim na linii SCL (rys.4). Warunek START może być wygenerowany tylko wtedy, gdy magistrala I2C jest wolna (linie SDA i SCL są w stanie wysokim), tzn. żaden inny układ master nie wymienia danych z układem slave sterując liniami SDA i SCL (w niniejszym ćwiczeniu przypadek taki jest niemożliwy, gdyż w systemie występuje tylko jeden układ master). Po przejęciu kontroli nad magistralą, układ master przesyła lub odbiera dane do/z zaadresowanego układu slave. Po wymianie informacji układ master musi zwolnić magistralę generując warunek STOP, który polega na zmianie stanu linii SDA z 1 na 0 przy stanie wysokim na linii SCL (rys.13). S P SDA SCL min. 4µs min. 4µs Rys.13. Generacja warunków START i STOP 10 Zgodnie ze specyfikacją [1] standardu I2C, po wygenerowaniu warunku START, linia SCL musi być utrzymywana w stanie wysokim jeszcze, przez co najmniej 4µs. Podobnie linia SCL musi być ustawiona w stan wysoki, co najmniej 4µs przed generacja warunku STOP. 5.3.2. Rozpoznawanie adresu Ze względu na szeregową transmisję na magistrali I2C, w danej chwili może być przeprowadzana komunikacja układu master tylko z jednym układem slave. Dlatego po rozpoczęciu transmisji w wyniku wygenerowania przez układ master warunku START, wysyłany jest 7-bitowy adres, który jest odbierany przez wszystkie układy slave (rys.14). Do magistrali zostaje podłączony tylko ten układ, który rozpozna swój adres, stając się nadajnikiem lub odbiornikiem w zależności od wartości najmłodszego bitu przesyłanego bajta, określającego kierunek transmisji danych. MSB LSB R/W adres układu SLAVE Rys.14. Pierwszy bajt przesyłany po wygenerowaniu warunku START 5.3.3. Przesyłanie danych Każdy bajt przesyłany po linii SDA musi mieć długość 8 bitów. Liczba bajtów przesyłanych po magistrali w jednej ramce informacyjnej nie jest ograniczona. Po wysłaniu każdego bajta danych układ odbiornika musi potwierdzić jego przyjęcie generując bit potwierdzenia A (ang. acknowledge bit). Każdy bajt danych jest przesyłany w kolejności od najstarszego do najmłodszego bitu (rys.17 i 18). Jeśli układ slave nie może odebrać lub wysłać kolejnego bita danych, ponieważ musi zrealizować jakąś inną funkcję, to utrzymuje linię SCL w stanie niskim wprowadzając układ master w stan oczekiwania (ang. wait state). Przesyłanie danych jest kontynuowane, gdy układ slave jest gotowy do przesłania lub odebrania kolejnego bajta zwalniając linie zegarową SCL. Dlatego w przypadku, gdy sygnał zegarowy SCL jest generowany na magistrali programowo, po zmianie stanu linii SCL z niskiego na wysoki konieczne jest również sprawdzenie, czy przypadkiem układ slave nie wprowadził stanu oczekiwania wprowadzając linię w stan niski. 5.3.4. Potwierdzenie przyjęcia danych Przesyłanie danych na magistrali I2C z potwierdzeniem jest obowiązkowe. Bit A potwierdzenia jest generowany zawsze przez układ, który odebrał aktualnie przesyłany bajt (niezależnie, czy jest to bajt adresu, czy danej). Dlatego przed pojawieniem się impulsu zegarowego dla bitu potwierdzenia układ, który nadał ostatni bajt musi zwolnić linię SDA ustawiając ją w stan wysoki. Dzięki temu układ odbiornika może sterować linią SDA wysyłając bit potwierdzenia poprzez ustawienie wspomnianej linii w stan niski przy stanie wysokim na linii SCL (rys.15). S linia SDA z nadajnika linia SDA z odbiornika 1 = brak potwierdzenia odebrania bajtu danej 0 = potwierdzenie odebrania bajtu danej SCL 1 2 8 9 Rys.15. Potwierdzenie przyjęcia bajta danych przez odbiornik Jeśli układ slave nie może potwierdzić odebrania bajta adresu (np. nie może przesyłać ani odbierać informacji, ponieważ realizuje jakieś zadanie, które musi być wykonanie w czasie rzeczywistym), to pozostawia linię SDA w stanie wysokim. Dzięki temu układ master może wygenerować warunek STOP w celu przerwania transmisji z danym układem SLAVE i powtórzyć warunek START w celu inicjacji kolejnej transmisji. Układ master żądając od układu slave przesłania danych nie definiuje liczby bajtów, które mają być przesłane. Dlatego jeśli układ master pełni rolę odbiornika to jego zadaniem jest nie tylko generowanie bitów potwierdzenia, lecz także powiadomienie układu slave o końcu odbierania danych poprzez nie wygenerowanie bitu potwierdzenia. Polega to na utrzymaniu linii SDA w stanie wysokim po odebraniu ostatniego bajta z układu slave podczas trwania impulsu dla bitu potwierdzenia (rys.15). 11 5.3.5. Wiarygodność danych Rysunek16 obrazuje zależności czasowe, jakie muszą być spełnione przy przesyłaniu pojedynczego bitu informacji. Bit informacji na linii SDA musi mieć ustaloną wartość przed pojawieniem się stanu wysokiego na linii zegarowej SCL. Natomiast stan linii SDA może być zmieniany tylko wtedy, gdy linia zegarowa SCL jest w stanie niskim. Dodatkowo czas opadania i narostu sygnałów na liniach magistrali musi spełniać wymagania czasowe opisane w specyfikacji standardu I2C [1]. SDA min. 300ns SCL min. 4µs min. 250ns min. 4,7µs Rys.16. Zależności czasowe przy przesyłaniu pojedynczych bitów na magistrali I2C Na rys.17 i 18 pokazano pełny proces przesłania i odbioru dwóch bajtów informacji na magistrali I2C. W przedstawionych przykładach urządzenie slave posiada adres 0110010B. Wysyłane bajty danych mają wartości: 11001001B i 01011100B, natomiast odbierane bajty z układu slave mają wartości: 01001011B i 10100010B S ADRES SLAVE'a 0 A S 0 1 1 0 0 1 0 0 A 1 2 3 4 5 6 7 8 9 DANE A DANE A P 1 1 0 0 1 0 0 1 A 0 1 0 1 1 1 0 0 A P 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 SDA SCL Rys.17. Przykład przesyłania dwóch bajtów danych z układu master do układu slave S ADRES SLAVE'a 1 A S 0 1 1 0 0 1 0 1 A 1 2 3 4 5 6 7 8 9 DANE A DANE A P 0 1 0 0 1 0 1 1 A 1 0 1 0 0 0 1 0 A P 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 SDA SCL Rys.18. Przykład przesyłania dwóch bajtów danych z układu slave do układu master 6. Sterowanie magistralą I2C z wykorzystaniem mikrokontrolera rodziny MCS-51 Makieta wykorzystywana w niniejszym ćwiczeniu pozwala na obsługę magistrali I2C poprzez programową generację stanów na liniach SCL i SDA. Master P1.0 SDA SCL P1.1 P3.2 SDA Slave SCL MCS-51 MPX DAVN Rp Vcc SAA6588 SCL SDA Rp Rys.19. Schemat blokowy makiety przy programowej generacji sygnałów na magistrali I2C 12 Zastosowany w makiecie mikrokontroler pełni funkcję układu master, dlatego programowa implementacja transmisji na magistrali I2C będzie omawiana tylko z takiego punktu widzenia. Mając na uwadze informacje podane w poprzednim punkcie, implementacja protokołu I2C polega na wygenerowaniu warunków START i STOP oraz przesyłaniu bajtów informacyjnych w kierunku od układu master do układu slave lub odbiorze informacji z układu slave. Programowe wygenerowanie wspomnianych warunków jest stosunkowo proste. Warunek START uzyskuje się przez ustawienie stanu niskiego na linii danych SDA przy linii SCL w stanie wysokim. Stan niski na linii zegarowej SCL może się pojawić nie wcześniej niż po czasie 4µs (rys.13). Z kolei warunek STOP generowany jest przez ustawienie linii SDA w stan wysoki przy linii zegarowej SCL w stanie wysokim (rys.13). W tym wypadku linia SCL musi przejść w stan wysoki, co najmniej 4µs przed generacją wspomnianego warunku. Przesyłanie bajtów informacji jest już zadaniem bardziej złożonym jednak również niezbyt skomplikowanym. Cała trudność polega na fakcie, że bajt informacji jest przesyłany bit po bicie linią SDA zgodnie z sygnałem zegarowym generowanym na linii SCL. Należy pamiętać, że dany bit informacji jest ważny na linii SDA tylko podczas stanu wysokiego na linii SCL, natomiast jego zmiana może odbywać się tylko podczas stanu niskiego na wspomnianej linii. Niezależnie od rodzaju pracy układu master (nadajnik czy odbiornik) jego zadaniem jest zawsze generowanie sygnału zegarowego. 6.1. Układ master jako nadajnik W celu przesłania informacji do układu slave, układ master musi w pierwszej kolejności wysłać na magistralę bajt, w którym 7 najstarszych bitów określa adres układu slave, natomiast najmłodszy bit przyjmuje wartość 0 sygnalizując, że kolejne bajty będą wysyłane w kierunku od układu master do układu slave (patrz rys.11 i 17). Układ master nadając bajt informacji (adresowy czy też danej) do układu slave wystawiania kolejne bity na linię SDA w takt generowanego sygnału zegarowego na linii SCL. Operacje tą można zrealizować poprzez zapis całego bajta informacji do rejestru akumulatora mikrokontrolera, a następnie przez operację przesunięcia logicznego w lewo (na magistralę wysyłane są bity od najstarszego do najmłodszego) rotacyjne przemieszczać bity z wykorzystaniem znacznika CY. Po każdorazowym przesunięciu, bit znajdujący się w CY należy przekopiować na linię 0 portu P1 pełniącą rolę linii SDA, po czym ustawić linie SCL (linia 1 portu P1) w stan wysoki informując przez to układ slave, że bit danej jest do odebrania. Zgodnie z przedstawionymi wcześniej informacjami, czas trwania stanu wysokiego na linii SCL nie może być mniejszy niż 4µs. Również czas trwania stanu niskiego na linii SCL podlega ograniczeniom i nie może być mniejszy niż 4,7µs. Po wysłaniu wszystkich ośmiu bitów danego bajta należy zwolnić linię SDA (poprzez ustawienie jej w stan wysoki) w celu umożliwienia układowi slave ustawienia wspomnianej linii w stan niski dla potwierdzenia przyjęcia bajta informacji. START LBitow = 8 Opóźnienie > 2,4 µs 7 Ustawienie SDA na 1 8 Opóźnienie > 2,4 µs 9 Ustawienie SCL na 1 10 Opóźnienie > 4,0 µs 11 BrakACK = 0 Opóźnienie > 2,4 µs 1 Przesunięcie w lewo w ACC przez CY Kopia CY na linię SDA 2 Opóźnienie > 2,4 µs 3 Ustawienie SCL na 1 4 Opóźnienie > 4,0 µs 5 BrakACK = 1 Ustawienie SCL na 0 6 Ustawienie SCL na 0 SDA = 0 TAK 12 NIE STOP Dekrementacja LBitow LBitow = 0 13 NIE TAK Rys.20. Algorytm wysłania bajta informacji z układu master do układu slave ze sprawdzeniem potwierdzenia z układu slave przy programowym sterowaniu liniami magistrali I2C 13 Algorytm nadania i sprawdzenia potwierdzenia przyjęcia bajta informacji z układu slave przedstawiono na rys.20. Zmienna LBitow jest licznikiem bitów pozostałych do wysłania. Jednobitowa zmienna BrakACK przyjmuje wartość 1, jeśli układ slave nie potwierdził przyjęcia bajta informacji. Dla zwiększenia czytelności algorytmu, na rys.21 przedstawiono powiązania wyszczególnionych koków z przebiegiem czasowym. 2 2 2 2 8 12 SDA 4 6 4 6 4 6 10 13 SCL 1 3 5 1 3 5 1 3 5 7 9 11 Rys.21. Przebieg czasowy przy przesyłaniu kolejnych bitów bajta informacji na magistrali I2C z odnośnikami do algorytmu z rys.20 Pamiętając o możliwości wprowadzania przez układ slave stanów oczekiwania, po dokonaniu przejścia na linii SCL z stanu niskiego w wysoki należy sprawdzić aktualny stan tej linii. Jeśli jest on niski, to układ slave wprowadził stan oczekiwania. Omawiana operacja może być przeprowadzona za pomocą następujących instrukcji: SETB P1.3 JNB P1.3,$ Dzięki drugiej instrukcji, dopóki linia SCL jest utrzymywana w stanie niskim przez układ slave, program nie realizuje dalszych operacji. 6.2. Układ master jako odbiornik Również przy odbieraniu informacji z układu slave, układ master musi w pierwszej kolejności wysłać na magistralę bajt, w którym 7 najstarszych bitów określa adres układu slave, natomiast najmłodszy bit przyjmuje wartość 1 nakazując zaadresowanemu układowi slave przesyłanie bajtów danych w kierunku od układu master (patrz rys.12 i 18). Ponieważ pierwszy bajt zawierający 7-bitowy adres i bit R/W wysyłany jest w kierunku do układu slave, dlatego to on generuje bit potwierdzenia, natomiast zadaniem układu master jest jego sprawdzenie. Przedstawiony wcześniej algorytm przesyłania bajta informacji z układu master do układu slave może więc zostać zastosowany w tym wypadku. Kolejne bajty przesyłane są już w kierunku do układu master, więc to jego zadaniem jest generowanie bitu potwierdzenia (za wyjątkiem ostatniego odebranego bajta, kiedy nie generuje go informując układ slave o konieczności przerwania transmisji bajtów danych). START LBitow = 8 Opóźnienie > 4,7 µs 1 Ustawienie SCL na 1 2 Opóźnienie > 4,0 µs 3 Kopia linii SDA do CY 4 Opóźnienie > 2,4 µs 6 Ustawienie SDA na 0 7 Opóźnienie > 2,4 µs 8 Ustawienie SCL na 1 9 Opóźnienie > 4,0 µs 10 Ustawienie SCL na 0 11 Opóźnienie > 2,4 µs 12 Ustawienie SDA na 1 13 Przesunięcie w lewo w ACC przez CY Ustawienie SCL na 0 5 Dekrementacja LBitow LBitow = 0 NIE STOP TAK Rys.22. Algorytm odbierania bajta informacji z układu slave przez układ master z generowaniem potwierdzenia przez układ master przy programowym sterowaniu liniami magistrali I2C 14 7 13 SDA 2 2 4 4 2 4 9 11 SCL 1 3 5 1 3 5 1 1 3 6 8 10 12 Rys.23. Przebieg czasowy przy odbieraniu kolejnych bitów bajta informacji na magistrali I2C z odnośnikami do algorytmu z rys.22 Na rys.22 przedstawiono algorytm odczytu pojedynczego bajta informacji wraz z wysłaniem potwierdzenia. Również tutaj dla zwiększenia czytelności algorytmu, na rys.23 przedstawiono powiązania wyszczególnionych koków z przebiegiem czasowym. Zmienna LBitow jest tym razem licznikiem bitów pozostałych do odebrania. Jeśli odbierany jest ostatni bajt informacji, w algorytmie przedstawionym na rys.14 należy w pozycji 7 ustawiać linię SDA na 1, natomiast pozycja 13 może zostać usunięta. 7. Sterowanie wyświetlaczem LCD Do prezentacji informacji tekstowej zastosowano w makiecie wyświetlacz LCD. Sterownik wyświetlacza komunikuje się z układem nadrzędnym przy wykorzystaniu ośmiu linii danych DB0÷DB7 oraz trzech linii sterujących: R/W, RS i E. Sterownik wyświetlacza LCD posiada dwa rodzaje pamięci RAM. Pamięć ekranu (DD RAM) zawiera kody znaków aktualnie wyświetlanych na polu odczytowym. Wyświetlenie znaku na odpowiedniej pozycji pola odczytowego wyświetlacza LCD polega więc na wpisaniu jego kodu do pamięci DD RAM. Kody poszczególnych znaków podano w tabeli 4 (dodatek C). Linia R/W informuje sterownik wyświetlacza o pożądanym kierunku przepływu informacji, tj. zapisie do sterownika (R/W = 0) lub odczycie ze sterownika(R/W = 1). Na podstawie stanu linii RS sterownik dokonuje interpretacji samej informacji przy zapisie (R/W = 0) jako: • rozkaz do wykonania (RS = 0), • kod znaku do wyświetlenia (RS = 1), natomiast przy odczycie (R/W = 1) wystawia na szynę danych: • bajt w którym najstarszy bit informuje o zajętości sterownika, a pozostałe o aktualnym adresie w pamięci DDRAM lub CGRAM (RS = 0), • kod znaku z pamięci DD RAM lub CG RAM (RS = 1). Sterownik wyświetlacza z punktu widzenia mikrokontrolera widziany jest jako komórki zewnętrznej pamięci danych pod adresem określonym w punkcie 9.3. Zapis i odczyt sterownika wyświetlacza odbywa się więc tak jak zapis i odczyt zewnętrznej pamięci danych mikrokontrolera. Wejścia RS i R/W wyświetlacza podłączone są pod dwie linie reprezentujące najmłodsze bity magistrali adresowej systemu. Sterowanie nimi odbywa się zatem przez odpowiednie ustawienie dwóch najmłodszych bitów adresu podczas operacji zapisu/odczytu zewnętrznej pamięci danych mikrokontrolera (patrz punkt 9.3). Podczas programowego odnoszenia się do sterownika wyświetlacza należy zatem odpowiednio modyfikować stany tych dwóch bitów adresu w zależności od rodzaju realizowanej operacji (np. zapis rozkazu, czy zapis kodu znaku do wyświetlenia) w celu uzyskania odpowiednich stanów na wejściach RS i R/W sterownika wyświetlacza. Linia E sterowana jest automatycznie w sposób sprzętowy i ustawienie jej odpowiedniego stanu nie wymaga ingerencji programowej. W tabeli 6 (dodatek C) przedstawiono rozkazy dostępne przy sterowaniu wyświetlaczem LCD. Do poprawnej pracy wyświetlacza wymagane jest co najmniej ustawienie: parametrów pracy (ang. Function Set), sterowania wyświetlaniem (ang. Display on/off Control) i trybu wprowadzania znaków (ang. Entry Mode Set). Znaczenie poszczególnych bitów wymienionych rozkazów znajduje się również w tabeli 6. Przed wysłaniem jakiejkolwiek informacji do sterownika wyświetlacza, należy sprawdzić jego gotowość do jej przyjęcia przez odczytu informacji ze sterownika (przy RS = 0 i R/W = 1) tak długo, aż najstarszy bit oznaczony BF nie przyjmie wartości 0. Na rys. 6 (dodatek C) pokazano graficznie adresy odpowiadające poszczególnym pozycjom na polu odczytowym dla wyświetlacza 2x16. Znak, którego kod zostanie wysłany do sterownika, pojawi się zawsze na pozycji określonej aktualną zawartością licznika adresu AC sterownika wyświetlacza, a następnie adres ten zostanie zwiększony lub zmniejszony w zależności od ustawienia bitu I/D rozkazu ustalającego tryb wprowadzania znaków (ang. Entry Mode Set). Bieżąca wartość licznika adresów AC sterownika wyświetlacza określa również pozycję, na której znajduje się kursor o ile został on włączony przez ustawienie odpowiedniego 15 bit. Dlatego określenia „adres pozycji znaku”, „adres kursora” i „adres DD RAM” są jednoznaczne. W celu zmiany zawartości licznika adresu AC, a jednocześnie przemieszczenia kursora na odpowiednią pozycję pola odczytowego wyświetlacza, należy użyć funkcji ustawiającej adres kursora (ang. Set DDRAM address). 8. Działanie makiety pod kontrolą programu monitora PAULMON2 jest darmowym programowym monitorem instalowanym w systemach bazujących na mikrokontrolerach rodziny MCS-51. Umieszczenie opisywanego monitora w pamięci ROM mikrokontrolera pozwala na wczytywanie programów do pamięci RAM i wykonywanie ich, co jest znacznie wygodniejsze i szybsze, niż przeprogramowywanie pamięci EPROM. Do komunikacji z programem monitora można wykorzystać dowolny program pozwalający na komunikację za pomocą złącza RS-232, np. HyperTerminal. Po uruchomieniu niniejszego programu na komputerze PC, oraz po wciśnięciu klawisza resetu makiety, monitor wysyła następujący komunikat: Welcome to PAULMON2 v2.1, by Paul Stoffregen See PAULMON2.DOC, PAULMON2.EQU and PAULMON2.HDR for more information. Program Name List Single-Step Memory Editor (VT100) Location 1000 1400 1800 Type External command External command External command a następnie pojawia się znak zachęty PAULMON2 Loc:2000 > _ Wartość 2000 określa adres, na jaki wskazuje wewnętrzny wskaźnik monitora. Jego znajomość jest użyteczna przy wywoływaniu komend operujących na pamięci systemu. Poniżej zostaną przedstawione wybrane komendy monitora. Wielkość liter przy wprowadzaniu poleceń nie ma znaczenia. 8.1. D (ang. Download) – ładowanie programu Polecenie to pozwala na załadowanie do pamięci RAM systemu mikroprocesorowego pliku z programem w formacie Intel Hex. W formacie tym zawarte są informacje o adresie, pod który mają być zapisywane kolejne bajty przesyłanego programu, zatem wewnętrzny wskaźnik pamięci monitora nie jest brany pod uwagę. Załadowanie programu polega na wciśnięciu klawisza [D], co powoduje wyświetlenie następującej informacji PAULMON2 Loc:2000 > Download Begin ascii transfer of Intel hex file, or ESC to abort Teraz należy z menu Transfer programu TyperTerminal wybrać Wyślij plik tekstowy..., a w otwartym oknie wskazać miejsce położenia pliku *.hex. Zatwierdzenie wyboru powoduje rozpoczęcie przesyłania danych. Za każdym razem, kiedy monitor odbierze pojedynczą linię z ładowanego pliku *.hex, na ekranie zostaje wyświetlona kropka. Jeśli z jakiś powodów konieczne jest przerwanie ładowania programu należy wtedy wcisnąć klawisz [Esc]. Po zakończeniu ładowania pliku z programem lub gdy ładowanie zostanie przerwane na życzenie użytkownika, na ekranie pojawia się podsumowanie. ................................................................................ ....................................................... Download completed Summary: 135 lines received 2084 bytes received 2084 bytes written No errors detected Jeśli po wykonaniu polecenia wczytania pliku w informacji podsumowującej monitora raportowane są błędy o braku możliwości zapisu 16 Summary: 246 lines received 3834 bytes received 630 bytes written Errors: 3204 bytes unable to write to oznacza, że plik HEX został odebrany poprawnie, jednak obszar pamięci wyspecyfikowany w kolejnych rekordach zawartych w pliku jest tylko do odczytu. W przypadku odebrania przez monitor danych o niepoprawnym formacie zostanie wyświetlone podsumowanie podobne do poniższego. Summary: 3 lines received 62 bytes received 62 bytes written Errors: 1 bad checksums 2 unexpected begin of line 17 unexpected hex digits 2 unexpected non hex digits 8.2. J (ang. Jump) – skocz pod określony adres w pamięci Polecenie to pozwala na przejście do wykonywania wczytanego wcześniej programu użytkownika. Po wciśnięciu klawisza [J] pojawi się napis PAULMON2 Loc:2000 > Jump to memory location Jump to memory location (2000), or ESC to quit: _ W tym momencie należy wprowadzić wartość adresu, od którego został umieszczony program. Po wpisaniu ostatniego (czwartego) znaku na ekranie pojawi się napis running program: _ informując o rozpoczęciu wykonywania programu użytkownika. Przed przejściem pod wyspecyfikowany adres program monitora odkłada na stosie wartość 0000H, zatem programy, które kończą się instrukcją RET powodują ponowne wywołanie programu monitora. Jeśli program działa w nieskończonej pętli, to jedyną możliwością powrotu do programu monitora jest reset mikrokontrolera. 9. Wiadomości dodatkowe 9.1. Konfiguracja przestrzeni adresowej makiety monitor EPROM program RAM: dane RAM: obszar wspólny dla programu i danych: 0000h÷1FFFh, 2000h÷F7FFh, 0000h÷F7FFh, 2000h÷F7FFh. 9.2. Adresu układów na magistrali I2C Adres układu SAA6588 0001000B 9.3. Adresy innych układów Adres bazowy sterownika LCD F800H F 1 1 8 1 1 1 0 0 0 0 0 17 0 X 0 0 0 0 RW RS hex bin RW RS 0: zapis informacji, 1: odczyt informacji. 0: informacja jest rozkazem 1: informacja jest kodem znaku do wyświetlenia. 10. Literatura [1] Bem D.J., Janiszewski J., Zieliński R.: “Automatyzacja odbioru w radiofonii UKF-FM”. Radioelektronik Audio-HiFi-Video, nr 5, maj 1988. [2] „The I2C Bus Specification” Philips Semiconductor. Version 2.1, January 2000. [3] Jabłoński T.: „Dekoder RDS”. Elektronika Praktyczna, 12/2000, 1/2001. [4] Rydzewski A.: „Mikrokomputery jednoukładowe”. WNT, Warszawa 1992. [5] Sagan K.: „Opis systemu RDS”. http://radiopolska.bydnet.pl/rds/ [6] Starecki T.: „Mikrokontrolery jednoukładowe rodziny 51”. NOZOMI, Warszawa 1996. [7] Kernighan W., Ritchie D.M.: „ANSI C”. WNT, Warszawa 1992. [8] Beach M.: „C51 Primer”. Hitex (UK) Ltd. [9] Zbysiński P.: „Stereofoniczny tuner FM”. Elektronika Praktyczna, 8/2000. 18 A B C D COM1 J2 COM0 J1 1 1 5 9 4 8 3 7 2 6 1 5 9 4 8 3 7 2 6 1 GND GND C3 1uF 1 3 13 8 14 7 6 C1 1uF GND MAX232 C1+ C1- R1 IN R2 IN T1 OUT T2 OUT V- U1 V+ 2 8,664MHz X2 C2+ C2- R1 OUT R2 OUT T1 IN T2 IN C7 47pF 2 100nF C9 1k R4 C8 82pF 4 5 12 9 11 10 2 +5V C4 1uF 10R R5 C2 1uF DAVN SDA SCL 3 +5V 3 1 2 3 4 5 6 7 8 9 10 C5 24pF 10R R6 LVIN CIN SCOUT VREF MPX VSSA VDDA AFIN MAD PCWN RxD0 RxD1 TxD0 TxD1 C6 24pF GND SAA6588 MRO MPTH TCON OSC0 OSC1 VSSD VDDD DAVN SDA SCL U6 GND 12MHz X1 20 19 18 17 16 15 14 13 12 11 5V C12 100nF 4 C10 560pF RxD0 TxD0 DAVN SDA SCL RxD1 TxD1 CLCK DATA WREN STEREO 4 C11 2,2uF C13 330pF S3 10k S2 10k R3 S1 ALE PSEN P3.6/WR P3.7/RD EA (A8)P2.0 (A9)P2.1 (A10)P2.2 (A11)P2.3 (A12)P2.4 (A13)P2.5 (A14)P2.6 (A15)P2.7 (AD0)P0.0 (AD1)P0.1 (AD2)P0.2 (AD3)P0.3 (AD4)P0.4 (AD5)P0.5 (AD6)P0.6 (AD7)P0.7 DS80C320MCG P3.0/RXD0 P3.1/TXD0 P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P1.0/T2 P1.1/T2EX P1.2/RXD1 P1.3/TXD1 P1.4/INT2 P1.5/INT3 P1.6/INT4 P1.7/INT5 RST X1 X2 U2 10k R2 R1 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 19 18 A8 A9 A10 A11 A12 A13 A14 A15 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 5 7 3 4 5 6 12 +5V WREN CLCK STEREO DATA GND 30 GND 29 16 17 31 21 22 23 24 25 26 27 28 39 38 37 36 35 34 33 32 5 1 2 3 4 5 6 7 8 9 11 OM5610 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 +12V GAL16V8D IN 0/CLK IN 1 IN 2 IN 3 IN 4 IN 5 IN 6 IN 7 IN 8 IN 9/OE U5 74HCT573 LE OE D0 D1 D2 D3 D4 D5 D6 D7 U3 ANT ANT GND WREN CLCK STEREO AUDIO L DATA AUDIO R MPX 2 3 4 5 6 7 8 9 11 1 GND +5V U7 A15 A14 A13 A12 A11 A10 A9 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 11 9 6 +12V 13 14 8 IO 0 IO 1 IO 2 IO 3 IO 4 IO 5 IO 6 IO 7 19 18 17 16 15 14 13 12 6 12 13 14 15 16 17 18 19 A0 A1 A2 A3 A4 A5 A6 A7 GND J3 WY AUDIO ANTENA Date: File: A3 Size Title WYŚWIETLACZ LCD U4 LCD DISPLAY 7 RS R/W E 4 5 6 Revision 8 1.0 13-Sep-2004 Sheet of D:\Moje dokumenty\OAP\Instrukcje do makiet\Instr Drawn By: Radio\Schemat\TunerRDS.ddb 7 8 Number Tuner radiowy z RDS AD0 AD1 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 7 8 9 10 11 12 13 14 D0 D1 D2 D3 D4 D5 D6 D7 A B C D