SYSTEMY MIKROPROCESOROWE Laboratorium Elektrotechnika, studia niestacjonarne pierwszego stopnia Temat: Generacja sygnałów okresowych z wykorzystaniem przetwornika cyfrowo-analogowego imei Instytut Metrologii, Elektroniki i Informatyki Opracowanie instrukcji: dr inż. Mirosław Kozioł Ćwiczenie 1 1. Cel ćwiczenia Celem ćwiczenia jest zapoznanie studentów z obsługą przetwornika cyfrowo-analogowego dołączonego do magistrali systemowej systemu mikroprocesorowego oraz sposobem generacji sygnałów okresowych z jego wykorzystaniem. Ćwiczenie ma również na celu rozwinięcie umiejętności programowania strukturalnego. Podczas realizacji ćwiczenia student tworzy oprogramowanie dla mikrokontrolera rodziny MCS- 51, które odpowiednio sterując przetwornikiem cyfrowo-analogowy umożliwia generację analogowego sygnału okresowego. 2. Program ćwiczenia Wykorzystując makietę dydaktyczną IME-LabTM pracującą pod kontrolą programu monitora PAULMON2 napisz program w języku C implementując kolejno przedstawione poniżej zadania. Podczas pisania programów zastosuj zasady programowania strukturalnego. 2.1. Zadanie 1 a) Dla zadanej przez prowadzącego częstotliwości sygnału i liczby próbek przypadającej na jego okres wyznacz czas, co jaki ma być zmieniana wartość na wyjściu przetwornika analogowocyfrowego, aby uzyskać sygnał o zadanej częstotliwości. Wynik obliczeń wraz z uzasadnieniem jego uzyskania przedstaw prowadzącemu zajęcia. b) W tworzonym programie zadeklaruj w zewnętrznej pamięci danych (XDATA) tablicę o rozmiarze równym liczbie próbek przypadającej na okres generowanego sygnału. Tablicę zainicjalizuj dowolnymi wartościami z zakresu 0 do 255. c) Napisz program, który wykorzystując licznik T0 lub T2 mikrokontrolera znajdującego się na makiecie IME-LabTM będzie odmierzał czas obliczony w punkcie 1. Moment zakończenia odmierzania czasu powinien być sygnalizowany przez przerwanie od wybranego licznika. W ramach funkcji obsługi przerwania zaimplementuj zmianę stanu linii 0 portu P1 mikrokontrolera w stan przeciwny. W wyniku takiego działania na linii P1.0 powinien być generowany prostokątny przebieg okresowy, którego zarówno stan wysoki, jak i niski powinny trwać tyle, ile czas obliczony w punkcie 1. d) Sprawdź poprawność działania napisanego programu uruchamiając go na makiecie IME- LabTM. Do obserwacji przebiegu generowanego na linii P1.0 wykorzystaj oscyloskop (wyprowadzenie linii P1.0 mikrokontrolera znajduje się na dodatkowej płytce IME-LabTM- DB01 dołączonej do złącza P4 makiety IME-LabTM). W przypadku niepoprawnego działania programu zlokalizuj i usuń błędy. Poprawnie działający program zaprezentuj prowadzącemu zajęcia. 1
2.2. Zadanie 2 a) W ramach funkcji obsługi przerwania zaimplementuj cykliczne wysłanie do przetwornika cyfrowo-analogowego jednej wartości pobieranej z tablicy zadeklarowanej w zadaniu 1b. Każde wywołanie przerwania powinno przesyłać do przetwornika kolejną wartość z tablicy. Po wysłaniu ostatniej wartości z tablicy w kolejnym wywołaniu funkcji obsługi przerwania powinna być wysyłana pierwsza wartość z tablicy. b) Sprawdź poprawność działania napisanego programu uruchamiając go na makiecie IME- LabTM. W celu obserwacji generowanego przebiegu podłącz wyjście przetwornika cyfrowoanalogowego (złącze J7 znajdujące się na makiecie) do jednego z wejść oscyloskopu znajdującego się na stanowisku laboratoryjnym. W przypadku niepoprawnego działania programu zlokalizuj i usuń błędy. Poprawnie działający program zaprezentuj prowadzącemu zajęcia. 2.3. Zadanie 3 a) Rozwiń tworzony program o funkcję wyznaczającą wartości kodów, jakie muszą być przesłane do przetwornika cyfrowo-analogowego w celu wygenerowania sygnału o kształcie i amplitudzie zadanej przez prowadzącego. b) Sprawdź poprawność działania napisanego programu uruchamiając go na makiecie IME- LabTM. W przypadku niepoprawnego działania programu zlokalizuj i usuń błędy, które takie działanie powodują. Poprawnie działający program zaprezentuj prowadzącemu zajęcia. c) Posługując się oscyloskopem wyznacz rzeczywisty okres generowanego sygnału oraz czas, co jaki następują zmiany napięcia na wyjściu przetwornika cyfrowo-analogowego. Jeśli są one inne od zakładanych w punkcie 1, zmień ustawienia licznika tak, aby uzyskać zakładane wartości. Po uzyskaniu poprawnego sygnału zapisz oscylogram jego jednego okresu z wykorzystaniem programu EasyScope 3.0 (patrz punkt 7) i zamieść go w sprawozdaniu. 3. Przygotowanie do ćwiczenia Przed przystąpieniem do ćwiczenia należy przygotować odpowiedzi na poniższe pytania. 1. Podaj zależność określającą związek między częstotliwością a okresem sygnału okresowego. 2. Jak z poziomu języka C używając kompilatora SDCC dla mikrokontrolerów rodziny MCS-51 dokonać zapisu/odczytu informacji do/z komórki zewnętrznej pamięci danych mikrokontrolera o konkretnym adresie? 3. W jaki sposób na makiecie dydaktycznej IME-LabTM realizowany jest dostęp do przetwornika cyfrowo-analogowego? 4. W jaki sposób dokonać zapisu wartości cyfrowej do przetwornika cyfrowo-analogowego znajdującego się na makiecie dydaktycznej wykorzystywanej w ćwiczeniu? 5. Scharakteryzuj 4 tryby pracy licznika T0 oraz 2 tryby pracy licznika T2 uwzględniając: pojemność liczników, źródło i częstotliwość sygnału doprowadzonego do wejść liczników, charakterystyczne cechy pracy liczników. 6. Podaj znaczenie bitów rejestrów TMOD i TCON związanych z jednostką czasowo-licznikową T0 oraz rejestru T2CON związanego z jednostką czasowo-licznikową T2, które znajdują się w mikrokontrolerach rodziny MCS-51? 7. W jakim kierunku (górę czy dół) następuje odliczanie przez jednostki czasowo-licznikowe T0 i T2? 2
8. Co jaki czas inkrementowana jest zawartość rejestrów licznika w mikrokontrolerze rodziny MCS-51 przy założeniu, że częstotliwość podłączonego rezonatora kwarcowego wynosi 12 MHz? 9. Jakie najdłuższe czasy można odmierzyć przy wykorzystaniu licznika T0 pracującego w trybie 1 oraz 2? 10. Jaki najdłuższy czasy można odmierzyć przy wykorzystaniu licznika T2 pracującego w trybie przepisania wartości początkowej? 11. Który rejestr w mikrokontrolerach rodziny MCS-51 odpowiada za odblokowanie przyjmowania przerwań i jakie jest znaczenie jego poszczególnych bitów? 12. Który rejestr w mikrokontrolerach rodziny MCS-51 odpowiada za określanie poziomów dla poszczególnych źródeł przerwań i jakie jest znaczenie jego poszczególnych bitów? 13. W jaki sposób w języku C przy użyciu kompilatora SDCC dla mikrokontrolerów rodziny MCS- 51 oznacza się funkcję, która ma obsługiwać przerwanie od określonego źródła? 4. Sprawozdanie z ćwiczenia Sprawozdanie z ćwiczenia powinno być dostarczone prowadzącemu zajęcia w określonej przez niego formie (pisemnej lub elektronicznej) i zawierać: algorytm działania i opatrzony komentarzami kod źródłowy ostatniej wersji zrealizowanego programu, opis słowny wyjaśniający działania podjęte podczas realizacji kolejnych zadań, zebrane podczas realizacji zadań zrzuty ekranu oscyloskopu. Informacje dotyczące tworzenia schematów blokowych algorytmów pracy programów znajdują się w punkcie 5 niniejszej instrukcji. 5. Tworzenie szablonu kodu programu w programie Code::Blocks Do kompilacji programów pisanych podczas zajęć laboratoryjnych w języku C dla mikrokontrolerów rodziny MCS-51 wykorzystywany jest darmowy kompilator SDCC. Jest to program, który nie posiada graficznego interfejsu użytkownika, dlatego jego używanie musi być realizowane z okna linii poleceń. Z tego powodu, aby ułatwić pisanie i kompilację programów został on podpięty pod darmowe, zintegrowane środowisko projektowe Code::Blocks. Widok tego środowiska po jego uruchomieniu pokazuje rysunek 1. W celu stworzenia szablonu kodu programu przy wykorzystaniu programu Code::Blocks należy kliknąć napis Create a new project zaznaczony czerwoną ramką na rysunku 1. W wyniku tego działania pojawia się okno przedstawione po lewej stronie rysunku 2. W oknie tym należy wybrać rodzaj projektu, który będzie tworzony. W przypadku zajęć w Laboratorium Technik Mikroprocesorowych należy wybrać ikonę podpisaną Lab TM Project, a zaznaczoną czerwoną ramką na rysunku 2. Po kliknięciu na ikonę wyboru projektu klawisz Go, znajdujący się w prawym górnym rogu okna, staje się aktywny. Chcąc przejść dalej należy kliknąć na ten klawisz. Kolejne okno, przedstawione na rysunku 3, przedstawia podstawowe informacje o generowanym projekcie. Należy je przejść klikając klawisz Next zaznaczony czerwoną ramką na rysunku 3. 3
Rys.1. Wygląd programu Code::Blocks bezpośrednio po jego uruchomieniu Rys.2. Wygląd okna wyboru projektu przed (po lewej) i po (po prawej) wybraniu pożądanego projektu Rys.3. Wygląd okna wyboru informacji o projekcie 4
W kolejnym oknie, przedstawionym na rysunku 4, należy w polu Project title wpisać nazwę tworzonego projektu. W polu Folder to create project należy wpisać ścieżkę dostępu do folderu, w którym zostaną zapisane pliki projektu. W przypadku zajęć w Laboratorium Technik Mikroprocesorowych powinna być to ścieżka do folderu Documents znajdującego się na dysku D. W razie potrzeby można dodać kolejne podfoldery. Na podstawie informacji wprowadzonych w tych dwóch polach uzupełniane są kolejne dwa pola. Mianowicie, tworzona jest automatycznie nazwa pliku projektu (pole Project filename) oraz ścieżka dostępu do tego pliku (pole Resulting filename), która wskazuje, że dodatkowo automatycznie tworzony jest folder o takiej samej nazwie, jak nazwa wpisana w polu Project name, który będzie grupował wszystkie pliki projektu. Przejście do następnego okna realizowane jest wciśnięciem klawisza Next. Rys.4. Wygląd okna wprowadzenia ścieżek dla zapisu projektu Kolejne okno, pokazane na rysunku 5, wskazuje jedynie, jaki kompilator będzie wykorzystany podczas tworzenia pliku wynikowego. W tym momencie należy dokonać przejścia do kolejnego okna klikając klawisz Next. Rys.5. Wygląd okna informującego o wykorzystywanym w projekcie kompilatorze 5
W ramach ostatniego okna, przedstawionego na rysunku 6, należy co najmniej wybrać typ mikrokontrolera, dla którego pisany będzie program. W przypadku Laboratorium Technik Mikroprocesorowych należy z rozwijanej listy wybrać układ Atmel AT89S52. Jeśli już na tym etapie wiadomo, że będzie wykorzystywane przerwanie od któregoś z wymienionych źródeł, to zaznaczenie odpowiedniego pola na omawianym oknie będzie skutkowało wygenerowaniem w kodzie szkieletu funkcji obsługi przerwania od danego źródła. Kliknięcie klawisza Finish kończy proces definiowania założeń dla projektu. Rys.6. Wygląd okna wyboru mikrokontrolera i źródła przerwania W tym momencie posiada zdefiniowane parametry projektu dla stworzenia szkieletu kodu programu dla mikrokontrolera rodziny MCS-51. Aby zobaczyć wygenerowany szkielet kodu programu należy kliknąć krzyżyk znajdujący się po lewej stronie napisu Source drzewa projektu (patrz rysunek 7). Efekt tego działania pokazuje rysunek 8. Klikając na nazwę pliku otwieramy stworzony szablon kodu programu (patrz rysunek 9). Tutaj kliknij Rys.7. Wygląd okna programu Code::Blocks po procesie generacji szablonu programu 6
Tutaj kliknij Rys.8. Wygląd okna programu Code::Blocks po rozwinięciu drzewa projektu Rys.9. Wygląd okna programu Code::Blocks po kliknięciu na nazwę pliku z kodem programu 6. Tworzenie schematów blokowych algorytmów pracy programu Graficzna prezentacja algorytmu działania programu za pomocą schematu blokowego powinna być tworzona w oparciu o zdefiniowane figury geometryczne (bloki), które reprezentują pewne czynności wykonywane w programie. Tworząc schemat blokowy algorytmu łączymy odpowiednie bloki liniami zakończonymi strzałkami. Jeśli linia jest linią łamaną, to załamanie powinno być realizowane pod kątem prostym. Początek i koniec algorytmu wyznaczają bloki graniczne rysowane w postaci owali, jak na rysunku 10. 7
START STOP Rys.10. Wygląd bloków reprezentujących początek i koniec algorytmu Początek algorytmu oznaczany jest przez blok z napisem START, koniec przez blok z napisem STOP. Blok symbolizujący początek algorytmu ma tylko jedną strzałkę wychodząca i żadnej wchodzącej, natomiast blok symbolizujący koniec algorytmu ma co najmniej jedną strzałkę wchodząca. Wszelkiego rodzaju podstawienia i obliczenia oznaczane są przez blok procesu reprezentowany przez prostokąt, jak na rysunku 11. Blok ten ma dokładnie jedną strzałkę wchodząca i jedną wychodzącą. Wewnątrz bloku wprowadzany jest opis omawiający wykonywane działania. Wyznaczenie cyfry dziesiątek Rys.11. Wygląd bloku procesu z przykładowym opisem realizowanego działania Wprowadzanie i wyprowadzanie danych oznaczane jest tym samym blokiem reprezentowanym przez równoległobok, jak na rysunku 12. Wprowadzenie cyfry jedności Rys.12. Wygląd bloku wprowadzania i wyprowadzania danych z przykładowym opisem realizowanego działania W jego obrębie należy umieścić odpowiedni opis wskazujący, czy blok dotyczy pobrania czy wyprowadzania danych oraz jakie dane są pobierane lub wyprowadzane. Wszelkiego rodzaju decyzje oznaczane są przez blok warunkowy, nazywany też decyzyjnym, reprezentowany przez romb. Jego symbol przedstawiono na rysunku 13. Cyfra dziesiątek większa od 4? TAK NIE Rys.13. Wygląd bloku warunkowego z przykładowym opisem realizowanego działania Wewnątrz bloku umieszczany jest warunek w formie pytania sformułowanego w taki sposób, aby odpowiedź można było udzielić w postaci potwierdzenia (TAK) lub zaprzeczenia (NIE). Blok ten ma jedną strzałkę wchodząca i dwie wychodzące. Jedna ze strzałek wychodzących związana jest ze spełnieniem warunku przedstawionego w bloku, druga z jego niespełnieniem. W pierwszym 8
przypadku linię dla strzałki wychodzącej podpisujemy słowem TAK, w drugim przypadku słowem NIE. Każda linia ze strzałką powinna być wyprowadzana z innego wierzchołka rombu. Zdefiniowany wcześniej proces i opisany innym algorytmem, a wykorzystywany w bieżącym algorytmie oznaczany jest blokiem jak na rysunku 14. Opóźnienie 100 ms Rys.14. Wygląd bloku zdefiniowanego procesu z przykładowym opisem realizowanego działania Blok ten można utożsamić z podprogramem w przypadku języka asemblera lub funkcją w przypadku języka C. Podobnie jak w przypadku bloku procesu reprezentowanego przez prostokąt, blok ten ma również jedną strzałkę wejściową i jedną wyjściową. W niektórych przypadkach algorytm, który chcemy zaprezentować w postaci schematu blokowego, jest na tyle złożony, że połączenia wielokrotnie się krzyżują. Aby zwiększyć jego czytelność można w takich przypadkach stosować łączniki stronicowe, obowiązujące w ramach jednej strony, na której narysowany jest schemat. Ich symbol przedstawiono na rysunku 15. 1 1 Rys.15. Wygląd łączników stronicowych z przykładowym oznaczeniem Realizacja połączenia polega na umieszczeniu w określonym miejscu symbolu łącznika ze strzałką wchodzącą (łącznik źródłowy) i określonym oznaczeniem w środku (np. liczbą) oraz w drugim miejscu algorytmu takiego samego symbolu z takim samym oznaczeniem, ale strzałką wychodzącą (łącznik docelowy). UWAGA: Należy pamiętać, aby w schemacie blokowym algorytmu nie nadużywać łącznika stronicowego, gdyż w takim przypadku staje się on nieczytelny. Rysując schemat blokowy algorytmu należy rozplanować takie ułożenie poszczególnych bloków, aby połączenia miedzy nimi jak najrzadziej się krzyżowały. Jeśli schemat blokowy algorytmu nie mieści się na jednej stronie, to do połączenia jego fragmentów można użyć łącznika międzystronicowego, którego symbol przedstawiono na rysunku 16. 1 1 Rys.16. Wygląd łączników międzystronicowych z przykładowym oznaczeniem Działa on w ten sam sposób, co łącznik stronicowy, lecz obowiązuje pomiędzy stronami. Najczęściej łączniki wyjściowe umieszczane są u dołu strony, a łączniki wejściowe u góry strony. Należy pamiętać, że algorytm działania programu w postaci schematu blokowego powinien być zaprezentowany w sposób na tyle uniwersalny, aby na jego podstawie można było napisać kod programu w dowolnym języku programowania. Dlatego informacje umieszczane w poszczególnych 9
blokach algorytmu nie mogą być fragmentami kodu, lecz powinny być w miarę możliwości formułowane słownie. 7. Zapisywanie oscylogramów z oscyloskopu Oscyloskop, znajdujący się na każdym stanowisk w Laboratorium Technik Mikroprocesorowych, podłączony jest przez interfejs USB do komputera. Dzięki temu, wykorzystując program EasyScope 3.0, możliwe jest zapisywanie prezentowanych na nich oscylogramów do pliku graficznego. W tym celu należy wykonać opisane poniżej czynności. Po uruchomieniu programu EasyScope na ekranie monitora powinno pojawić się okno aplikacji jak na rysunku 17. Następnie klikamy klawisz DSO Bitmap zaznaczony czerwoną ramką na rysunku 17. Powoduje to zmianę widoku okna aplikacji do postaci, jak na rysunku 18. W celu dokonania połączenia z oscyloskopem należy wcisnąć klawisz Connect zaznaczony czerwoną ramką na rysunku 18. Po poprawnym połączeniu z oscyloskopem klawisz Connect staje się nieaktywny, natomiast aktywnym staje się klawisz Disconnect, znajdujący się na prawo od niego (patrz rysunek 19). W tym momencie istnieje już możliwość zrobienia zrzutu ekranu z oscyloskopu. Dokonuje się tego wciskając przycisk Refresh zaznaczony czerwoną ramką na rysunku 19. Uzyskany zrzut ekranu z oscyloskopu (patrz rysunek 20) można zapisać do pliku BMP wciskając klawisz Save zaznaczony czerwoną ramką na rysunku 20. Rys.17. Wygląd okna aplikacji EasyScope 3.0 po jej uruchomieniu 10
Rys.18. Wygląd okna aplikacji EasyScope 3.0 po wciśnięciu klawisza DSO Bitmap Rys.19. Wygląd okna aplikacji EasyScope 3.0 po poprawnym połączeniu z oscyloskopem 11
8. Literatura Rys.20. Wygląd okna aplikacji EasyScope 3.0 po odczycie ekranu z oscyloskopu [1] Instrukcja do makiety. [2] Materiały z wykładu do przedmiotu. [3] Bogusz J.: Programowanie mikrokontrolerów 8051 w języku C w praktyce. Wydawnictwo BTC, Warszawa 2005. [4] Kernighan W., Ritchie D.M.: ANSI C. WNT, Warszawa 1992. [5] Kulka Z., Libura A., Nadachowski M.: Przetworniki analogowo-cyfrowe i cyfrowo-analogowe. WKiŁ, Warszawa 1987. [6] van de Plassche R.: Scalone przetworniki analogowo-cyfrowe i cyfrowo-analogowe. WKŁ, Warszawa 1997. [7] Rydzewski A.: Mikrokomputery jednoukładowe rodziny MCS-51. WNT, Warszawa 1992. [8] Starecki T.: Mikrokontrolery jednoukładowe rodziny 51. Wydawnictwo NOZOMI, Warszawa 1996. [9] Starecki T.: Mikrokontrolery 8051 w praktyce. Wydawnictwo BTC, Warszawa 2003. [10] Majewski J.: Programowanie mikrokontrolerów 8051 w języku C, pierwsze kroki. Wydawnictwo BTC, Warszawa 2005. 12