Podstawy techniki mikroprocesorowej Temat 2 Obsługa wyświetlaczy v.1.0 Uniwersytet Pedagogiczny, Instytut Techniki Dominik Rzepka, dominik.rzepka@agh.edu.pl, 2014 1. Obsługa pinów mikroprocesora i wyświetlacze 7-segmentowe Komunikacja procesora ze światem zewnętrznym odbywa się za pomocą jego wyprowadzeń, czyli pinów. Piny są pogrupowane w porty, a każdy port może mieć maksymalnie 8 pinów. Aby móc używać pinów, należy najpierw określić, czy będą to piny wyjściowe (które wysyłają sygnały), czy też piny wejściowe (które odbierają sygnały). Każdy pin ma potencjalnie te dwie role i trzeba wybrać jedną z nich. W mikrokontrolerze ATTiny2313 mamy do dyspozycji dwa porty: Port B i Port D. Żeby sterowanie pinem miało jakiś widoczny efekt, zajmiemy się pinami podłączonymi do wyświetlaczy 7-segmentowych. Dokładny schemat połączeń znajduje się w dokumentacji płytki ZL11AVR pod adresem http://home.agh.edu.pl/~drzepka/dydaktyka/ptm/zl11avr.pdf. Wyświetlacz 7-segmentowy składa się z 8 diod, które mają wspólną anodę i oddzielnie sterowane katody. Aby zaświecić dany segment, trzeba podać odpowiednie wartości na anodę i oraz odpowiadającą temu segmentowi katodę. W przypadku płytki ZL11AVR muszą to być stany 0. Załóżmy, że chcemy sterować kropką (oznaczoną jako DP) wyświetlacza W3. Na podstawie poniższej tabelki dowiadujemy się, że musimy wyzerować pin PB7 oraz PD4. Przykład 1. 'konfigurujemy funkcje pingów - wszystkie będą sterowały, czyli mają funkcje wyjść Config PORTB = Output Config PORTD = Output 'ustawiamy wartości pinów 'na płytce ZL11AVR, PORTB odpowiada za poszczególne segmenty wyświetlacza; '7 bit steruje kropka - ustawiamy go na 0, aby ja zaświecić. PORTB = &B01111111 '&B oznacza wartość podaną w bitach (binarną). 'Bity numerujemy w kolejności od 7 do 0 'na płytce ZL11AVR, PORTD odpowiada za włączenie poszczególnych wyświetlaczy '5 bit steruje wyświetlaczem W2 - ustawiamy go na 0, aby go zaświecić PORTD = &B11101111 'w efekcie świeci się tylko kropka na wyświetlaczu W3, 'pozostałe segmenty i wyświetlacza są nieaktywne Zapisz powyższy przykład w pliku dioda. 2. Programowanie mikroprocesora
Tak przygotowany program możemy wysłać do mikrokontrolera przy pomocy programatora KamPROG. Należy go podłączyć do USB, a jego drugi kabel do odpowiedniego złącza na płytce ZL11AVR. Po uruchomieniu programu KamPROG trzeba się upewnić, czy zaznaczone są dwa pola, pokazane na poniższym zrzuci ekranu. Następnie naciskamy przycisk w prawym górnym rogu i wyszukujemy plik dioda.hex, który powstanie po wykonaniu kompilacji. Przy kolejnym programowaniu nie ma potrzeby, żeby wybierać go ponownie dopóki nie zmienimy go na inny, pozostanie on na stałe wybrany w programatorze. Rys. 1. Programator Aby sprawdzić, czy programator ma kontakt z mikroprocesorem można wybrać Identify microcontroller (F5). W odpowiedzi w oknie konsoli powinny pojawić się zielone napisy: Rys. 2. Poprawna identyfikacja mikroprocesora Programowanie odbywa się poprzez wciśnięcie przycisku Write : Rys. 3. Programowanie Po poprawnym zaprogramowaniu na płytce powinna zaświecić się dioda wyświetlacza W3.
3. Migająca dioda Stan dowolnego pinu wyjściowego można zmienić stosując odpowiedni zapis: Przykład 2. ustaw pin 5 z portu B na stan niski 0 PORTB.5 = 0 ustaw pin 5 z portu B na stan wysoki 0 PORTB.5 = 1 Ćwiczenie 1. Używając pętli do..loop zmodyfikuj program dioda tak, aby dioda zaczęła migać. Wykorzystaj kod z przykładu 2 do zaświecania i gaszenia diody. Aby uzyskać odpowiedni odstęp czasowy między zaświecaniem i gaszeniem, użyj instrukcji waitms 250. Instrukcja waitms zatrzymuje wykonywanie programu na ilość milisekund określoną liczbą podaną za tą instrukcją. Ćwiczenie 2. Napisz nowy program, sterując tym razem segmentami przy pomocy pełnych przypisani typu 'segment A PORTB = &B11111110 'segment B PORTB = &B11111101 'itd. Rozbuduj program tak, aby uzyskać efekt węża kolejno zapalających się i gaszących segmentów A, B, C, D, E, F, A, B, itd. na wyświetlaczu W1. Aby go uzyskać modyfikuj wartości pinów portu B, dodając po każdym zapaleniu i zgaszeniu instrukcję oczekiwania waitms 200. Efekt powinien być zapętlony. Sposób podpięcia pinów do segmentów znajdziesz w tabelkach poniżej. ZAPAMIĘTAJ! Bity w bajcie są numerowane od 7 do 0. W bajcie &B01111111 wyzerowany jest bit numer 7. 4. Wyświetlanie cyfr i procedury w języku BASIC Skoro umiemy już zaświecać i gasić segmenty wyświetlacza, to możemy zabrać się za wyświetlanie całych cyfr. Ćwiczenie 3. Zaprogramuj na wyświetlaczu W2 program wyświetlający kolejno cyfry od 0 do 9, w pętli do..while. Aby zaświecić wyświetlacz W2 ustaw odpowiednio piny portu D (na podstawie wcześniej podanych tabeli). Każdą cyfrę zaprogramuj jako binarne ustawienie portu B, używając tabeli 3 oraz rozmieszczenia
segmentów opisanego obok niej (na poprzedniej stronie) np. 'zero PORTB = &B11000000 'jeden PORTB = &B11111001 'dwa PORTB = uzupełnij 'trzy uzupełnij Niech każda cyfra będzie wyświetlana przez 1s. Wykorzystaj w tym celu instrukcję waitms. Gdybyśmy chcieli teraz zrobić program odliczający od 9 do 0, należałoby zamienić kolejność wszystkich instrukcji. Wygodniej byłoby zrobić program, który operuje na zmiennej mającej rolę licznika, a następnie wyświetlać wartość tej zmiennej. Zaprogramujmy więc poszczególne części takiego programu. Ćwiczenie 4. Napisz program, który przy pomocy pętli (for albo do) w konsoli wyświetla funkcją print liczby od 9 do 0. Teraz chcielibyśmy osiągnąć podobny efekt przy pomocy wyświetlacza 7-segmentowego. Potrzebujemy więc odpowiednika funkcji print, który wyświetla liczbę na wyświetlaczu 7-segmentowym. Takie gotowe polecenie niestety nie istnieje, ale możemy je sobie stworzyć sami. Nowe polecenie (procedurę) definiujemy przy pomocy słowa kluczowego sub. W naszym przypadku polecenie musi mieć też parametr cyfrę, którą będziemy wyświetlali. Nowe polecenia muszą być zadeklarowane na początku programu i zdefiniowane na jego końcu. Przykład 3. Definiowanie polecenia wyswietl wyświetlającego zmienną cyfra na wyświetlaczu 7- segmentowym. 'zaczynamy od deklaracji polecenia wyswietl Declare Sub wyswietl(byval cyfra As Byte) 'tutaj znajduje się zawartość programu 'przykladowe wywolanie polecenia wyswietl Do wyswietl 7 waitms 1000 wyswietl 8 waitms 1000 loop Sekcja I: deklaracje zmiennych i procedur Sekcja II: właściwy program 'po zakończeniu programu definiujemy polecenie wyswietl Sub wyswietl(byval cyfra As Byte) Select Case cyfra Case 0: PORTB = &B11000000 Case 1: PORTB = &B11111001 'tutaj powinna być definicja pozostałych cyfr End select Sekcja III: kod procedur 'itd. End Sub loop Ćwiczenie 5. Na podstawie przykładu 3 rozbuduj polecenie wyswietl, tak aby wyświetlało wszystkie liczby z zakresu 0-9.
Ćwiczenie 6. Napisz program odliczający od 9 do 0 na wyświetlaczu 7-segmentowym. Pamiętaj o zadeklarowaniu procedury wyswietl oraz wpisaniu jej definicji w odpowiedniej kolejności, według szablonu z przykładu 4. Ćwiczenie 7. Rozbuduj procedurę wyświetl tak, aby można było podać nie tylko wyświetlaną liczbę, ale również numer wyświetlacza (1-4), na którym ma być wyświetlona cyfra. W tym celu zmodyfikuj deklarację procedury: Sub wyswietl(byval cyfra As Byte, byval wyswietlacz As Byte) Dopisz kod, który zaświeci odpowiedni wyświetlacz W1..W4 w zależności od wartości zmiennej wyświetlacz. 5. Multipleksowanie wyświetlacza Ćwiczenie 8. Spróbuj wyświetlić na wyświetlaczu W1 cyfrę 4 a następnie na wyświetlaczu W2 cyfrę 7. Ze względu na sposób podłączenia wyświetlaczy do pinów procesora, nie ma możliwości, żeby na dwóch wyświetlaczach zaświecić dwie różne cyfry. Możemy co najwyżej zaświecić ten sam znak na kilku wyświetlaczach jednocześnie. W praktyce jednak wyświetlanie różnych cyfr na różnych wyświetlaczach jest bardzo potrzebną funkcjonalnością, więc musi być jakiś sposób, aby tego dokonać pomimo ograniczeń, z którymi się spotykamy. Przy rozwiązaniu tego problemu wykorzystuje się właściwości oczu człowieka. Jeżeli migająca dioda (lub napis) będzie migał odpowiednio szybko, bezwładność naszych oczu spowoduje, że nie zauważymy migania. Ćwiczenie 9. Zapętl kod z poprzedniego ćwiczenia, przedzielając wyświetlanie pierwszej i drugiej cyfry instrukcją oczekiwania waitms. Ustaw wartość oczekiwania na 100ms, a następnie zmniejszaj ją do takiej wartości, przy której nie zauważysz migania napisu. Wyświetlanie przy pomocy szybkiego przełączania nazywane jest multipleksacją i jest powszechnie stosowane w wyświetlaczach segmentowych (np. w autobusach). Ćwiczenie 10. Wyświetl przy pomocy multipleksowania dowolny, 4 literowy napis. Ćwiczenie 11. Napisz program liczący od 0 do 99 w tempie 1/s i wyświetlający wynik na wyświetlaczu 7- segmentowym. a) Ponieważ każdy wyświetlacz jest obsługiwany oddzielnie, zastosuj oddzielne zmienne dla liczby dziesiątek i liczby jedności. Program licznika wypróbuj najpierw w symulatorze, stosując do wyświetlania instrukcję print. b) Ponieważ musimy zastosować multipleksację, czyli SZYBKIE przełączanie wyświetlaczy, to pętla zwiększająca wartość licznika i jednocześnie wyświetlająca NIE MOŻE zawierać pojedynczego oczekiwania trwającego pełną sekundę. W każdej iteracji (powtórzeniu) pętli mamy jednak pewien znany, krótki okres oczekiwania pomiędzy przełączeniem wyświetlaczy. Wiedząc ile trwa ten okres, sumuj cząstkowe czasy oczekiwania i kiedy osiągną one 1 sekundę zmieniaj wartość licznika głównego. 6. Przykładowe zadania na kolokwium Poza zadaniami z laboratorium obowiązuje znajomość następujących zagadnień: 1. Ile wyprowadzeń ma wyświetlacz 7-segmentowy? 2. Wartość bajta to &B01111111. Jaka będzie jego wartość po wyzerowaniu bitu nr 0 i nr 2? 3. Napisz kod ustawiający 5 bit portu B na 1. 4. Napisz kod wyświetlający napis AS przy pomocy multipleksowania wyświetlaczy. 5. Na podstawie tabeli 3 i 4 oraz rozkładu segmentów napisz kod zapalający kropki w wyświetlaczach W2 i W3. 6. Napisz kod migający diodą w odstępie czasowym 200ms, uwzględniając konfigurację portów.