LABORATORIUM OPROGRAMOWANIA MIKROPROCESOROWEJ APARATURY POMIAROWEJ ime System mikroprocesorowy z przetwornikami AC i C/A oraz klawiaturą i wyświetlaczem LCD Instytut Metrologii Elektrycznej 1. Zastosowanie makiety Niniejsza makieta daje możliwość zapoznania się z programową obsługą następujących układów działających w ramach systemu mikroprocesorowego: 8-kanałowego przetwornika analogowo-cyfrowego ADC 0808, mnożącego przetwornika cyfrowo analogowego AD7520, wyświetlacza ciekłokrystalicznego, klawiatury. Makieta daje również możliwość poznania zasady działania narzędzi programowych służących do uruchamiania systemów mikroprocesorowych na przykładzie darmowego programu monitora PAULMON2. 2. Opis stanowiska laboratoryjnego Podstawowym elementem stanowiska laboratoryjnego (rys.1) jest Mikroprocesorowy System Pomiarowy (MSP) opracowany w IME. MSP jest uniwersalnym systemem pomiarowym pozwalającym na pomiar napięcia stałego w zakresie 0 5 V w czterech kanałach oraz pomiar temperatury z wykorzystaniem termorezystora PT100. Przyrząd jest wyposażony dodatkowo w jeden kanał wyjściowy o zakresie napięcia 0-10 V i interfejs użytkownika, który składa się z wyświetlacza ciekłokrystalicznego 2 16 znaków oraz klawiatury. Uwe1 Pomiar temperatury wejściowy 1 ADC 0808 A0 A1 S2 LCD RD WR A0 A1 Uwe2 wejściowy 2 IN0 IN1 A2 74LS374 AD7520 Uwe3 wejściowy 3 IN2 IN3 IN4 INT0 RD 741 Uwy Uwe4 wejściowy 4 WR S0 S1 V Klawiatura µp 8051 K1 K2 P1 P0 Rejestr INSTRUKCJE ROM DANE RAM K8 ALE ADRES ADRES P2 IBM PC RS232 MAX232 TxD RxD P3 PSEN WR RD GAL16V8 DEKODER ADRESOWY S0 S1 S2 OE WE OE Mikroprocesorowy System Pomiarowy Rys.1. Stanowisko laboratoryjne układ pomiarowy 1
Każdy z peryferyjnych układów wykorzystanych w MPS-ie, tj. przetwornik A/C, rejestr zatrzaskowy przetwornika C/A czy też wyświetlacz LCD, są widziane jako komórki zewnętrznej pamięci danych. Zatem odwołania do tych układów odbywają się z wykorzystaniem instrukcji przeznaczonych od zapisu i odczytu zewnętrznej pamięci danych. Na rys.2 zostało zobrazowane rozmieszczenie gniazd wejściowych, wyjściowych, klawiatury i wyświetlacza LCD. Wyswietlacz Uwe 4 Uwe 3 Uwe 2 Uwe 1 LCD PT 100 Reset RS-232 Uwy K1 K2 K3 K4 K5 K6 K7 K8 Rys.2. Widok płyty przedniej i tylnej MPS 2.1. Przetwornik analogowo-cyfrowy Do pomiaru napięć stałych zastosowano 8-bitowy przetwornik A/C (ADC0808) z wewnętrznym 8-wejściowym multiplekserem analogowym. Do wejścia IN0 dołączany jest układ do pomiaru temperatury, który działa w oparciu o niezrównoważony mostek z termorezystorem PT100. Wejścia IN1 IN4 są wykorzystane do pomiaru napięcia stałego i wyprowadzone z tyłu makiety (rys. 2). Wybór odpowiedniego kanału dokonywany jest za pomocą linii adresowych A0, A1, A2, które są aktywowane poprzez trzy najmłodsze linie szyny adresowej systemu mikroprocesorowego (patrz punkt 4.2). Dlatego w przestrzenie adresowej przetwornik A/C zajmuje kilka adresów (jeden adres odpowiada jednemu kanałowi przetwornika). Chcąc odwołać się do określonego kanału należy użyć właściwego adresu zewnętrznej pamięci danych (patrz punkt 4.2). MPS został zaprojektowany w taki sposób, że start konwersji przetwornika A/C w określonym kanale realizowany jest przez zapis dowolnej wartości pod adres danego kanału przetwornika. Wyprowadzenie EOC przetwornika A/C, sygnalizujące start i koniec konwersji i jest podłączone do linii INT0 mikrokontrolera. Gdy przetwornik zostanie wystartowany do konwersji, na linii INT0 pojawia się stan zera logicznego (patrz przebiegi czasowe w Dodatku A ). Po zakończeniu konwersji linia ta przechodzi w stan jedynki logicznej. Dopiero wtedy możliwy jest odczyt wartości odpowiadającej przetwarzanemu napięci. Zatem z punktu widzenia programu, w celu określenia końca konwersji napięcia przez przetwornik A/C należy sprawdzać programowo stan wyprowadzenia INT0 mikrokontrolera. Odczyt wartości cyfrowej reprezentującej wartość przetworzonego napięcia analogowego dokonywany jest spod tego samego adresu, co zapis uruchamiający przetwornik od konwersji w danym kanale. 2.2. Wyświetlacz LCD Interfejs sterownika wyświetlacza LCD składa się z ośmiu linii danych D0..D7 oraz trzech linii sterujących: R/W, RS oraz 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). W MPS wyświetlacz LCD, podobnie jak przetwornik A/C, widziany jest jako komórki zewnętrznej pamięci danych. Zatem jego obsługa od strony programowej realizowana jest z wykorzystaniem instrukcji właściwych 2
dla zapisu/odczytu zewnętrznej pamięci danych mikrokontrolera. Linie R/W i RS podłączone są bezpośrednio do linii A1 i A0 szyny adresowej systemu mikroprocesorowego. 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 4.2). 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 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). Pamięć generatora znaków (CG RAM) przechowuje matryce 8 znaków (w pamięci przechowującej tablice kodów znaków odpowiadają im adresy 00H..0FH; patrz tabela 4, dodatek C), które można dowolnie zaprogramować. Każda matryca składa się z 8 bajtów. Format zapisu przedstawiono w tabeli 1. Tabela 1. Format zapisu znaków użytkownika Adres CG RAM Dane dwójkowo dwójkowo n n n 0 0 0 0 0 0 0 0 0 0 0 n n n 0 0 1 0 0 0 0 1 1 1 0 n n n 0 1 0 0 0 0 1 0 0 0 1 n n n 0 1 1 0 0 0 1 0 0 0 1 n n n 1 0 0 0 0 0 1 0 0 0 1 n n n 1 0 1 0 0 0 0 1 0 1 0 n n n 1 1 0 0 0 0 1 1 0 1 1 n n n 1 1 1 0 0 0 0 0 0 0 0 nnn - określa numer jednego z ośmiu znaków użytkownika W celu zaprogramowania powyższego znaku pod adresem 01H w tablicy kodów znaków, należy wysłać rozkaz ustawiający adres pamięci CG RAM na wybraną wartość, a następnie sukcesywnie przesyłać kolejne dane określające wzorce linii znaku. W celu wyświetlenia tak zaprojektowanego znaku należy zapisać do pamięci DD RAM sterownika wyświetlacza jego kod (w rozpatrywanym przykładzie wynosi on 01H). Wysłanie rozkazu ustawiającego adres pamięci CG RAM powoduje, że każda następna operacja zapisu lub odczytu przy RS = 1 będzie odnosiła się do wspomnianej pamięci. Jednocześnie adres po każdej takiej operacji będzie automatycznie inkrementowany. Identycznie następstwa dotyczą wysłania rozkazu ustawiającego adres pamięci DD RAM, dlatego po ewentualnym procesie programowania znaku (czyli odnoszenia się do pamięci CG RAM),a przed procesem wysyłania kodów znaków do wyświetlenia, należy wysłać rozkaz ustawiający odpowiedni adres w pamięci DD RAM. 2.3. Przetwornik cyfrowo-analogowy Wyjściowe napięcie analogowe wytwarzane jest przez 10-bitowy przetwornik C/A (AD7520) pracujący jako przetwornik 8-bitowy, gdyż dwa najmłodsze bity znajdują się na potencjale logicznej jedynki. Z tego względu nawet przy przesłaniu do przetwornika wartości 0, na jego wyjściu generowane jest napięcie wynoszące ok. 0,01V. Znak 3
Również przetwornika C/A widziany jest jako komórka zewnętrznej pamięci danych, dlatego generowanie napięcia na jego wyjściu wymaga zapisu odpowiedniej wartości cyfrowej pod adres określony w punkcie 4.2. Przesłana wartość jest zatrzaskiwana w rejestrze i pozostaje niezmieniona aż do kolejnego zapisu. 2.4. Klawiatura Przyciski klawiatury są bezpośrednio podłączone do linii portu P1. W stanie rozwarci (przycisk nie jest wciśnięty) określona linia znajduje się w stanie logicznej jedynki, natomiast przy wciśniętym przycisku pojawią się na niej stan logicznego zera. 3. 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 Location Type List 1000 External command Single-Step 1400 External command Memory Editor (VT100) 1800 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. 3.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 HyperTerminal 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....... 4
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 Summary: 246 lines received 3834 bytes received 640 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 3.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. 4. Dodatkowe informacje Wszystkie niezbędne informacje odnośnie układów wykorzystanych w MSP znajdują się w dodatkach dołączonych do instrukcji: dodatek A: przetwornik A/C ADC0808, dodatek B: przetwornik C/A AD7520, 5
dodatek C: sterownik HD448780U wyświetlacza ciekłokrystalicznego. 4.1. Konfiguracja przestrzeni adresowej w makiecie monitor EPROM program RAM: dane RAM: obszar wspólny dla programu i danych: 4.2. Adresy układów peryferyjnych 0000h 0FFFh, 2000h F7FFh, 0000h F7FFh, 2000h F7FFh. przetwornik A/C F800h, F 8 0 X hex 1 1 1 1 1 0 0 0 0 0 0 0 0 A2 A1 A0 bin A0, A1, A2 numer kanału (odpowiednio linie adresowe: ADD A, ADD B, ADD C). rejestr 74LS374 (zatrzask dla C/A) FA00h, wyświetlacz LCD FC00h, F C 0 X hex 1 1 1 1 1 1 0 0 0 0 0 0 0 0 R/W RS bin RS linia sterująca RS sterownika wyświetlacza R/W linia sterująca R/W sterownika wyświetlacza 5. Literatura [1] Baranowski R.: Wyświetlacze graficzne i alfanumeryczne w systemach mikroprocesorowych. BTC, Legionowo 2008. [2] Bogusz J.: Programowanie mikrokontrolerów 8051 w języku C w praktyce. BTC, Warszawa 2005. [3] Kernighan W., Ritchie D.M.: ANSI C. WNT, Warszawa 1992. [4] Kulka Z., Libura A., Nadachowski M.: Przetworniki analogowo-cyfrowe i cyfrowo-analogowe. WKiŁ, Warszawa 1987. [5] Lach M.: Biblioteka mikroprocesorowych procedur standardowych. Elektronika Praktyczna 1/2/4/7/ 1997, 5/ 1998. [6] Rydzewski A.: Mikrokomputery jednoukładowe rodziny MCS-51. WNT, Warszawa 1992. [7] Starecki T.: Mikrokontrolery jednoukładowe rodziny 51. NOZOMI, Warszawa 1996. [8] Starecki T.: Mikrokontrolery 8051 w praktyce. BTC, Warszawa 2003. [9] Majewski J.: Programowanie mikrokontrolerów 8051 w języku C, pierwsze kroki. BTC, Warszawa 2005. [10] Majewski J., Kardach K.: Mikrokontrolery jednoukładowe 8051. Programowanie w języku C w przykładach. Oficyna Wydawnicza Politechniki Wrocławskiej, Wrocław 1995. [11] Ziembicki J.: Moduły wyświetlaczy znakowych LCD ze sterownikami VLSI. Radioelektronik 5/ 1994. 6