Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie Wydział IEiT Katedra Elektroniki TECHNIKA MIKROPROCESOROWA II LAB 2 Human-Machine Interface, czyli obsługa wyświetlacza slcd Sebastian Koryciak http://www.fpga.agh.edu.pl/tm2 14.10.2015
1 WSTĘP 1.1 CEL Niniejsze ćwiczenie ma na celu zapoznanie użytkowników ze sposobem obsługi wyświetlacza multipleksowanego. Za przykład posłuży wyświetlacz zamontowany na płytce ewaluacyjnej FRDM- KL46Z. 1.2 WYMAGANIA Sprzętowe: komputer klasy PC spełniający wymagania sprzętowe aplikacji KEIL v5, zestaw FRDM-KL46Z Programowe: system operacyjny Windows XP lub wyższy, środowisko Keil / uvision 5 Doświadczenie: podstawowa umiejętność obsługi komputera klasy PC, podstawowa znajomość systemów operacyjnych rodziny Windows, podstawowa znajomość zagadnień z Techniki Mikroprocesorowej 1, podstawowa znajomość zagadnień z Techniki Cyfrowej, wykonane ćwiczenie LAB 1
2 SEGMENT LCD CONTROLLER Mikrokontrolery z rodziny KL46 zostały wyposażone w wbudowany kontroler wyświetlaczy multipleksowanych numerycznych, alfanumerycznych ale także i niestandardowych. Obraz mogą tworzyć zarówno kropki (piksele), jak i symbole (specjalne obrazki lub część wyświetlacza 7 segmentowego). 2.1 ZADANIE Na podstawie dokumentu KL46 Reference Manual proszę dowiedzieć się jakie są podstawowe parametry kontrolera slcd, a na ich podstawie określić jaki największy wyświetlacz może być przez ten mikrokontroler obsługiwany. Na płytce FRDM-KL46Z mamy do dyspozycji wyświetlacz Lumex LCD-S401M16KR. Na podstawie jego dokumentacji możemy dowiedzieć się, że do jego sterowania wykorzystywane się następujące piny: Natomiast poszczególne elementy wyświetlacza to: Wyświetlacze tego typu podzielone są na dwie płaszczyzny (planes): przednią (frontplane) i tylną (backplane). W tym przypadku mamy do czynienia z 4 pinami służącymi za sygnały wspólne, oraz 8
sterującymi poszczególne segmenty (7 + kropka). Sterowanie będzie polegało na multipleksowaniu ze sobą poszczególnych płaszczyzn z odpowiednią częstotliwością. Przykładowo sygnał COM0 kontroluje zaznaczone powyżej segmenty. Oznacza to, że jeżeli COM0 będzie ustawione, możemy aktywować 8 segmentów w zależności od wartości stanów na 8 pinach sterujących tymi segmentami. Ponieważ mamy 4 fazy (4 piny COM), a każdy steruje 8 segmentami, mamy w sumie 32 segmenty, których wartości możemy ustawić. Należy również zwrócić uwagę na fakt, iż tego rodzaju wyświetlacz nie posiada zasilania. W związku z tym należy 4 fazy COM rozdzielić równomiernie, tak aby wszystkie segmenty były tak samo jasne. Natomiast patrząc na wyświetlacz z perspektywy poszczególnych segmentów mamy sytuację przedstawioną na następnej grafice. a a BP3 f b f b BP2 g g e c e c BP1 d FP0 FP1 d BP0
Podpięcie poszczególnych tylnych ścian (BP) do rejestrów przebiegów (zgodnie z pinami z FRDM- KL46Z) powinno wyglądać następująco: WF40 0 0 0 1 0 0 0 1 WF52 0 0 1 0 0 0 1 0 WF19 0 1 0 0 0 1 0 0 WF18 1 0 0 0 1 0 0 0 Biorą pod uwagę powyższe warunki, poszczególne segmenty będą aktywne w następujących przebiegach: WF8B[0] d e g f d e g f WF8B[1] dp c b a dp c b a Ściany BP są sterowane automatycznie, co ustawiamy w trakcie inicjalizacji. Pozostaje nam jedynie odpowiednie wysterowanie rejestrów WF8B. Przykładowo aby wyświetlić cyfrę 4 należy ustawić: WF8B[0] - - g f - - g f WF8B[1] - c b - - c b - 2.2 ZADANIE Ze strony laboratorium proszę ściągnąć projekt slcd_tutorial.zip i go rozpakować. Następnie proszę otworzyć projekt, a w nim plik slcd.c. Zaczynamy analizowanie funkcji inicjalizującej wyświetlacz. 2.3 ZADANIE Proszę otworzyć dokument FRDM-KL46Z_Schematics i na jego podstawie wypisać wszystkie piny, które będą brały udział w obsłudze wyświetlacza. Później w pliku slcd.c, w liniach kodu 24-35, po usunięciu z nich znaków komentarza, znaki XXX proszę zastąpić odpowiednimi wartościami. Proszę zwrócić szczególną uwagę na numerację portów. Następnie proszę otworzyć dokument KL46 Reference Manual. Należy w nim odnaleźć tzw. Listę Alternatyw (KL46 Signal Multiplexing and Pin Assignments) i na jej podstawie zastąpić znaki YYY takimi wartościami, aby wszystkie piny spełniały funkcję kontrolera slcd. 2.4 ZADANIE Proszę skonfrontować pozostałą część kodu inicjalizującego wyświetlacz z opisem z punktu 2.1. 2.5 ZADANIE Proszę wstępnie zbudować projekt, a następnie otworzyć plik nagłówkowy slcd.h. Znajdują się w nim definicje segmentów, z których skorzystamy przy wyświetlaniu znaków. Na ich podstawie proszę w pliku slcd.c w funkcjach slcderr() oraz slcdset() zastąpić znaki ZZZ odpowiednimi definicjami. Podpowiedzią są już przypisane znaki 0 oraz od 4 do F.
2.6 ZADANIE W następnym kroku proszę uruchomić w pliku main.c funkcję slcddemo(). Proszę wgrać program na płytkę ewaluacyjną, a następnie sprawdzić poprawność jego działania. Proszę zdiagnozować błąd w wyświetlaniu, a następnie go poprawić. 2.7 ZADANIE Proszę dopracować funkcję slcddisplay() znajdującą się w pliku slcd.c tak, aby służyła do wyświetlania dowolnej liczby w dowolnym formacie. Proszę zaprezentować prowadzącemu jej działanie z poziomu pliku main.c. 2.8 ZADANIE Proszę włączyć inicjalizację diod LED, oraz zapoznać się z funkcjami dostępnymi w pliku leds.c. Proszę zaproponować w pliku głównym projektu własną sekwencję powitalną z wykorzystaniem tych funkcji (może trwać maksymalnie 3s). 2.9 ZADANIE Proszę włączyć inicjalizację przycisków, oraz zapoznać się z funkcjami dostępnymi w pliku buttons.c. Należy zwrócić uwagę, że zgodnie ze schematem (FRDM-KL46Z_Schematics) przyciski są podpięte do masy, w związku z czym należy piny wyposażyć w wewnętrzne rezystory podciągające. Proszę na podstawie opisu rejestru PCR w dokumencie KL46 Reference Manual (Pin Control Register) ustawić w inicjalizacji odpowiednie maski. Następnie proszę przetestować działanie przycisków w pętli głównej w pliku main.c. Proszę zastosować tzw. odpytywanie (ang. polling), aby przyciśnięcie przycisku powodowało jednokrotne zapalenie się diody. Przyciskowi 1 proszę przypisać diodę zieloną, 3 czerwoną. 2.10 ZADANIA DOMOWE Proszę wykonać następujące czynności: 1. Proszę napisać funkcję do obsługi kropek na wyświetlaczu. Odpowiednie definicje i deklaracje proszę wpisać do pliku odpowiedzialnego za obsługę wyświetlacza. Proszę nie zapomnieć o uaktualnieniu pliku nagłówkowego. 2. Proszę napisać program, którego zadaniem będzie wyświetlanie aktualnej wartości licznika. Wartość ta ma być modyfikowana za pomocą przycisków (zmniejszana bądź zwiększana). Proszę pamiętać o zakresie wyświetlacza i przepełnieniu licznika. 3. Proszę napisać program, którego zadaniem będzie wyświetlanie wyniku meczu tenisowego. Wyświetlacz proszę podzielić na 2 części, po jednej dla każdego zawodnika. Za pomocą przycisków dodajemy punkty danemu zawodnikowi (0, 15, 30, 40). W przypadku rozstrzygania remisu (40:40) na wyświetlaczu przy danym zawodniku ma pojawiać się kod A0 (ang. advantage). Po rozstrzygnięciu stan liczników ma się wyzerować, a kropka po odpowiedniej stronie ma zasygnalizować wygranie poprzedniego gemu.