Architektura systemów komputerowych Sławomir Mamica Wykład 6: Obsługa urządzeń zewnętrznych http://main5.amu.edu.pl/~zfp/sm/home.html
W poprzednim odcinku Układy czasowo-licznikowe 8051: Licznik (impulsy z linii zewnętrznej) / Timer (cykle maszynowe) Liczy w górę aż do przepełnienia 4 tryby pracy Przerwania od timerów Transmisja szeregowa w 8051: Typy transmisji szeregowej (synchroniczna, asynchroniczna) Prędkość transmisji (body, bps) Tryby transmisji danych (simplex, (full)duplex, pół(half)-duplex) Sterownik transmisji szeregowej 8051 (kluczowe rejestry i linie, tryby pracy) Rozkazy 8051 (cz. 2) Zadania domowe: Problemy? Pytania?
(Suplement) Skoki warunkowe od bitu (względne): JC (JNC) adres8 skocz pod adres8 jeśli C (nie C) JB (JNB) adres, adres8 skocz pod adres8 jeśli bit (nie bit) o adresie adres JBC adres, adres8 jak JB + zeruj bit o adresie adres
Plan a) Porty komunikacja ze światem zewnętrznym b) Wyświetlacz siedmiosegmentowy c) Klawiatura przeglądana sekwencyjnie d) Klawiatura matrycowa e) Wyświetlacz LCD
Porty (równoległe) http://main5.amu.edu.pl/~zfp/sm/home.html
Końcówki 8051 VCC - napięcie zasilania VSS (GND) - masa XTAL1, XTAL2 - podłączenie rezonatora kwarcowego RST - Reset EA (VPP) - dostęp do zewnętrznej pamięci programu (External Access Enable ) PSEN - sygnał sterujący odczytu pamięci programu ALE - sygnał sterujący zatrzaskiem adresu (Address Latch Enable) Porty: P0.. P3
Porty 8051 Większość mikrokontrolerów rodziny 8051 jest wyposażona w cztery porty po 8 linii. Do obsługi portów służą rejestry specjalne P0, P1, P2, P3. Wystawienie 0 lub 1 na linię portu odbywa się przez wpisanie zadanej wartości do właściwego bitu odpowiedniego rejestru. Odczyt danych z wymienionych rejestrów jest równoważny pobraniu danych z odpowiedniego portu. Na końcówkach portów znajdują się przerzutniki, pamiętające ostatnio zapisane dane. Odczyt danych z portu może przebiegać w dwojaki sposób: (1) odczyt stanu końcówki portu uzyskujemy informację o stanie zewnętrznych linii podłączonych do portu (odczyt sygnału zewnętrznego) (2) odczyt stanu zatrzaśniętego w przerzutniku ostatnio zapisane dane (odczyt sygnału wewnętrznego). Aby prawidłowo odczytać sygnał zewnętrzny należy uprzednio wpisać do portu (przerzutników) jedynki.
Rozkazy RMW Rozkazy typu Odczyt-Modyfikacja- Zapis (RMW, Read-Modify-Write). Bity rejestru odczytywane są przez bufory dołączone do wyjścia Q przerzutnika, ich wartość jest przekazywana do arytmometru, gdzie następuje wykonanie operacji, a następnie nowa wartość jest wprowadzana do przerzutnika. Rozkazy RMW: ANL, ORL, XRL, JBC, skocz jeśli bit =1 i zeruj bit CPL Px.y negacja bitu INC Px- zwiększ o 1 DEC Px - zmniejsz o 1 DJNZ Px,skok MOV Px.y, C CLR Px.y SETB Px.y
Rola portów w 8051 Ogólnie IO mikrokontrolera (dwukierunkowe) + funkcje specjale: P0 podczas dostępu do pamięci zewnętrznej pełni zamienną rolę (multipleksowanie) magistrali adresów (młodszy bajt adresu, A0-A7) oraz magistrali danych (D0-D7). P1 w niektórych rozbudowanych wersjach 8051 linie portu P1 pełnią dodatkowe funkcje. P2 podczas dostępu do pamięci zewnętrznej pełni rolę bardziej znaczącej części szyny adresowej (A8-A15). P3 w podstawowym trybie pracy jako wejście/wyjście działanie portu P3 nie różni się w niczym od działania portów P1 i P2, ale wszystkie linie P3 pełnią dodatkowe funkcje: P3.0: RxD, P3.1: TxD, P3.2: INT0, P3.3: INT1, P3.4: T0, P3.5: T1, P3.6: WR (sygnał sterujący zapisem do pamięci danych), P3.7: RD (sygnał sterujący odczytem z pamięci danych)
Port 1 budowa końcówki Tranzystor sterowany wyjściem (zanegowanym) zatrzasku (przerzutnik typu D)
Port 1 - działanie Do przerzutnika wpisujemy jedynkę:!q = 0 więc kanał tranzystora będzie zablokowany (nie będzie zwarcia do masy) końcówka portu poprzez rezystor pociągający uzyska wysoki potencjał Do przerzutnika wpisujemy zero:!q = 1 więc kanał tranzystora drożny zwarcie końcówki portu do masy. Aby prawidłowo odczytać stan końcówek portu należy uprzednio wpisać do portu (przerzutników) jedynki. (Bo inaczej końcówka jest zwarta do masy.) (Dlatego po restarcie mamy 1 w portach.)
Port 3 Podobnie jak P1 + funkcja dodatkowa (alternatywna)
Port 2 Podobnie jak P1, ale przełączanie na adres
Port 0
Linie szczególne w DSM-51 P1.0 COM2 wyjście P1.1 sterownik przerwań P1.2 wyjście izolowane O1 P1.3 wyjście izolowane O2 P1.4 wachdog P1.5 brzęczyk P1.6 wyświetlacz 7-segmentowy P1.7 dioda TEST P3.0 COM1 wejście P3.1 COM1 wyjście P3.2 COM2 wejście / sterownik przerwań P3.3 sterownik przerwań P3.4 wejście izolowane I1 P3.5 klawiatura przeglądana sekwencyjnie
Wyświetlacz siedmiosegmentowy http://main5.amu.edu.pl/~zfp/sm/home.html
Wyświetlacz 7segmentowy Wskaźnik Segment
Wyświetlacz 7seg. w DSM-51
Sterowanie sekwencyjne Sterowanie wszystkimi segmentami wyświetlacza niezależnie wymaga 48 linii danych (6 wskaźników po 8 segmentów). Wyjście: sterowanie dynamiczne (sekwencyjne): Dwie grupy linii sterujących: wybór aktywnych wyświetlaczy oraz wybór aktywnych segmentów.
Sterowanie sekwencyjne Oczywiście, układ wybranych segmentów jest taki sam dla wszystkich wskaźników. Czyli każdy wskaźnik wyświetlacza wyświetla to samo? Trochę bez sensu. Co zrobićżeby wyświetlać na każdym wskaźniku co innego? Wyświetlać sekwencyjnie, czyli w danej chwili świeci tylko jeden wskaźnik, ale jest on zmieniany (w następnej chwili świeci następny). Jeśli proces ten powtarza się cyklicznie z odpowiednio dużą częstotliwością, to bezwładność ludzkiego oka załatwi resztę.
Konkrety, albo algorytm Na stosunkowo krótkie przedziały czasu (około 1ms) włączane są pojedynczo kolejne wskaźniki. Przełączeniu aktywnego wyświetlacza towarzyszy wybór odpowiedniego układ segmentów. Czyli każdy wskaźnik może wyświetlać co innego! Przy odpowiednio szybkim cyklicznym wyświetlaniu obserwator ma wrażenie jednoczesnego świecenia wszystkich wyświetlaczy. Rozwiązanie to ma dodatkową zaletę ogranicza pobór prądu przez blok wskaźników. (W przeciwieństwie do wyświetlacza statycznego w danej chwili czasu, włączony jest tylko jeden wyświetlacz.)
Kluczowe rejestry CSDS (adres 00111xxx) bufor wyboru wskaźnika CSDB (adres 00110xxx) bufor wyboru segmentu (bufor danych) P1.6 wł. / wył. wyświetlacz (0 włącza, 1 wyłącza) CSDS CSDB
Przykład 1 Problem 1: Cykliczna zmiana wskaźnika Jak to zorganizować? Oczywiście, obrót. Problem 2: Cykliczna zmiana układu segmentów Jak to zorganizować? Adresowanie pośrednie + inkrementacja adresu W kolejnych komórkach pamięci sekwencje segmentów (tablica jednowymiarowa) Czyli pętla (ale z restartem)
START: LJMP ORG START 100H Przykład 1 (c.d.) MOV 0FH, #01001001B MOV 0EH, #00110011B MOV 0DH, #01110110B ; itd. RESTART: OBROT: MOV ; itd. ; tu wyświetlanie CLR P1.6 RRC JNC SJMP A, #0010 0000B A OBROT RESTART Ustawienia wstępne wszystko to, co się nie będzie zmieniać W szczególności to, co ma być wyświetlane w kolejnych bajtach dla kolejnych wskaźników Pętla bezwarunkowa ustawienia dla pętli warunkowej Nie zapomnij włączyć wyświetlacza Zmiana wybranego wskaźnika Skocz jeśli C, czyli pętla nie potrzebuje dodatkowego licznika
Przykład 1 (c.d.) Problem 3: Bufory wyświetlacza są w pamięci zewnętrznej Czyli rozkaz MOVX Więc tylko dwie możliwości: MOVX @Ri, A lub MOVX @DPTR, A Tak więc wysłanie danych do wyświetlacza psuje ACC (jego zawartość trzeba gdzieś zapamiętać) Pomocne są tutaj stałe: NAZWA EQU WARTOŚĆ (nazwa stałej musi rozpoczynać linię, podobnie ja etykieta)
Przykład 1 (c.d.) ; wybór wskaźnika WSKAZNIK EQU 30H ; MOV WSKAZNIK, #32 ; MOV MOV MOVX RRC MOV R0, #CSDS A, WSKAZNIK @R0, A A WSKAZNIK, A Deklaracja stałej (to będzie adres) Wybrany wskaźnik pod adres WSKAZNIK Adres odpowiedniego bufora do R0 Zawartość bajtu o adresie WSKAZNIK do ACC Zawartość ACC pod adres w R0 Obrócony ACC z powrotem pod adres WSKAZNIK
Przykład 1 (c.d.) TRESC EQU ; treść do wyświetlania ; MOV MOV MOV ; MOV MOV MOV MOVX 31H TRESC, #0100 1001B TRESC+1, #0011 1001B TRESC+2, #0000 1110B R0, #CSDB R1, #TRESC A, @R1 @R0, A Deklaracja stałej (to będzie adres początkowy) W kolejnych bajtach to, co ma być wyświetlane na kolejnych wskaźnikach Adres odpowiedniego bufora do R0 Adres danych do wyświetlenia do R1 (to można inkrementować w pętli) Dane spod adresu TRESC do ACC Zawartość ACC pod adres w R0
Przykład 1 (c.d.) prog06a.asm WSKAZNIK EQU 30H TRESC EQU 31H LJMP START START: ORG MOV MOV MOV ; itd. 100H Deklaracje stałych TRESC + 0, # 0100 1001 B TRESC + 1, # 0011 1001 B TRESC + 2, # 0000 1110 B Ustawienia programu (to się nie zmienia w czasie pracy programu) RESTART: MOV R1, # TRESC + 5 MOV WSKAZNIK, # 0010 0000 B CLR C OBROT: ; tu wyświetlanie Wartości początkowe dla pętli ( # 0000 0100 B ) zaczynamy od TRESC+2
Przykład 1 (c.d.) prog06a.asm (c.d.) OBROT: SETB P1.6 MOV R0, #CSDB MOV A, @R1 MOVX @R0, A MOV R0, #CSDS MOV A, WSKAZNIK MOVX @R0, A CLR P1.6 RRC A MOV WSKAZNIK, A DEC R1 JNC OBROT SJMP RESTART Wyłącz wyświetlacz na czas zmian Załaduj bufor danych Załaduj bufor wyboru wskaźnika Nie zapomnij włączyć wyświetlacza Aktualizacja liczników Kolejny wskaźnik, albo restart pętli Emulator
Wyświetlanie zmiennych Problem 4: Jak (efektywnie) zmieniać to, co jest wyświetlane na danym wskaźniku? (jak na razie to na wskaźniku np. 1 cały czas mamy to samo) Rozwiązanie: Zastosować matrycę znaków (stronę kodową).
Klawiatura przeglądana sekwencyjnie http://main5.amu.edu.pl/~zfp/sm/home.html
Klawiatura przeglądana sekwencyjnie
Idea Tylko jedna linia (P3.5) nie rozróżnia klawiszy (naciśnięcie dowolnego klawisza generuje taki sam sygnał) ale Reaguje tylko na te klawisze, które są wybrane w CSDS Cykliczne przeglądanie kolejnych klawiszy (podobnie jak cykliczne wyświetlanie na kolejnych wskaźnikach wyświetlacza siedmiosegmentowego) Oczywiście, można to zrobić przy okazji wyświetlania na wyświetlaczu siedmiosegmentowym
Przykład 1 (upgreat) prog06a.asm ( software version 7.0 ) OBROT: DALEJ: DEC JB R1 P3.5, KLAWIATURA JC OBROT SJMP RESTART KLAWIATURA: ; tu odczytać CSDS ; i zorganizować reakcję na klawisze SJMP DALEJ Jedynka (odczyt sygnału zewnętrznego!) na P3.5 znaczy naciśnięty wtedy skacz Odczyt klawiatury po zmianie liczników pętli nie musimy się nimi przejmować Informacja o tym, który klawisz naciśnięty w CSDS Powrót do pętli zmieniającej CSDS (i CSDB)
Sprężystość styków klawiatury Problem 5: Drgania styków klawiatury Styki klawiatury mają pewną sprężystość i po naciśnięciu klawisz odskakuje Tak więc przy jednokrotnym naciśnięciu będzie on zliczony kilka razy Rozwiązanie: Jeśli klawisz naciśnięty, to powtórz odczyt po pewnym czasie
Klawiatura matrycowa http://main5.amu.edu.pl/~zfp/sm/home.html
Idea Klawiaturę matrycową stanowi grupa przycisków zorganizowanych w wiersze i kolumny (czyli matrycę) Połączenie większej ilości klawiszy w matrycę pozwala na zaoszczędzenie wyprowadzeń mikrokontrolera Obsługa polega na uaktywnieniu (ustawieniu odpowiedniego poziomu) tylko jednej kolumny i odczycie stanu wszystkich wierszy. Stan danego wiersza wskazuje na wciśnięcie bądź zwolnienie określonego klawisza w aktywnej kolumnie.
Klawiatura matrycowa DSM-51 16 klawiszy połączonych w dwie ośmiowierszowe kolumny. Klawiaturze przypisano dwa adresy oznaczone CSKB0 i CSKB1. Mają one przeciwne stany dwóch najmłodszych bitów: 0010 0001, 0010 0010 dzięki czemu dwie linie adresowe wybierają kolumnę klawiatury.
Przypisanie klawiszy
Przykład
Wyświetlacz LCD http://main5.amu.edu.pl/~zfp/sm/home.html
Zestaw matryc W systemie DSM-51 zastosowano alfanumeryczny wyświetlacz ciekłokrystaliczny posiadający dwie szesnastoznakowe linie. W wyświetlaczu zintegrowany jest sterownik HD4480. Pozwala on sterować wyświetlaczami zawierającymi do 40 znaków w każdej linii. (Czyli 24 znaki z każdej linii sterownika są niewidoczne.) Każdy znak alfanumeryczny wyświetlany jest na matrycy liczącej 35 punktów (8 rzędów, 5 kolumn).
Generator znaków Pamięć generatora znaków składa się pamięci ROM, w której zapisano wzorce 192 znaków alfanumerycznych oraz pamięci typu RAM pozwalającej przechowywać wzorce 8 znaków zdefiniowanych programowo. Na każdy znak przeznaczono osiem bajtów pamięci generatora (8 rzędów w matrycy znaku). Istotny jest stan pięciu najmłodszych bitów (pięć kolumn matrycy).
Obsługa w DSM-51 Odczytać stan LCDRC.7 jeśli 1 to sterownik LCD jest zajęty Jeśli wolny to wpisz nowe dane do LCDWD lub instrukcję do LCDWC
Podprogramy w DSM-51 Zestaw podprogramów zapisanych w pamięci EPROM systemu DSM-51 Użycie: LCALL NAZWA_PODPROGRAMU
Podprogramy w DSM-51 (c.d.)
Uwagi do Emulatora W emulatorze nie zorganizowano zewnętrznej pamięci danych (z wyjątkiem nielicznych rejestrów związanych z niektórymi urządzeniami zewnętrznymi). Nie posiada on również zewnętrznej pamięci programu typu EPROM. W związku z tym w przypadku wywołania gotowych procedur dostępnych w EPROMie systemu DSM-51 pojawia się jedynie komunikat informujący o tym, jaka procedura została wywołana. W przypadku procedur: WRITE_DATA, WRITE_HEX, WRITE_INSTR, LCD_INIT, LCD_OFF, LCD_CLR, WAIT_ENTER, WAIT_ENTER_NW, TEST_ENTER, BCD_HEX, HEX_BCD, MUL_2_2, MUL_3_1, DIV_2_1 oraz DIV_4_2 dodatkowo w komunikacie zawarta jest informacja o wyniku działania procedury. Wywołanie procedury DELAY_US, DELAY_MS lub DELAY_100MS nie powoduje wyświetlania komunikatu, lecz zatrzymanie pracy emulatora na określoną liczbę milisekund.
Uwagi do Emulatora (c.d.) Procedury WAIT_ENTER i WAIT_ENTER_NW w reakcji na klawisz Enter, oprócz wyświetlania komunikatu, zerują najstarszy bit rejestru CSKB1 odzwierciedlającego stan klawiatury matrycowej. Procedura TEST_ENTER ustawia lub zeruje flagę C w zależności od stanu najstarszego bitu rejestru CSKB1. Procedury BCD_HEX oraz HEX_BCD zamieniają liczbę znajdującą się pod adresem wskazanym w R0 odpowiednio z zapisu BCD na szesnastkowy i odwrotnie. Procedury MUL_2_2, MUL_3_1, DIV_2_1 oraz DIV_4_2 wykonują działania mnożenia i dzielenia na danych znajdujących się pod adresem wskazanym w R0 i odpowiednich dla danej procedury rejestrach specjalnych.
Pytania?
W następnym odcinku Magistrala (szyna) systemowa Wewnętrzny przepływ sygnałów 8051 Magistrala 8051 Magistrala DSM-51 Proszę pamiętać o zadaniach domowych!
I to by było na tyle Dziękuję za uwagę!