2006-02-22
Temat ćwiczenia:
BADANIE UKŁADU TRANSMISJI RÓWNOLEGŁEJ - 8255
Autorzy:
Krzysztof Lorenc
Piotr Płoszaj
Opis układu 8255:
Układ 8255 jest programowalnym, równoległym portem wejścia/wyjścia.
Zawiera on trzy uniwersalne 8-bitowe porty (PA, PB, PC), z których każdy morze być skonfigurowany jako wejście, wyjście, a w pewnych trybach spełniać rolę mieszaną, nawet z możliwością generowania przerwań do procesora. Dodatkowo, oprócz wspomnianych rejestrów portów PA, PB, PC układ 8255 zawiera tzw. Czwarty rejestr - konfiguracyjny, dzięki niemu możliwa jest konfiguracja całego układu.
Nietypowym portem w tym układzie jest port PC. Może on pracować zarówno jako port 8-bitowy jak również jako 2 niezależne porty 4-bitowe. Wyboru rodzaju pracy tego portu dokonuje się za pomocą rejestru konfiguracyjnego. Jeżeli port ten jest podzielony to cztery starsze bity PC7-PC4 będą oznaczone jako PCa, natomiast cztery młodsze bity będą oznaczone jako PCb. W naszym przypadku rejestr ten jest nieużywany.
Opis wyprowadzeń układu:
D0 -D7- Linie dołączone do szyny danych systemu mikroprocesorowego. Dzięki nim, możliwa jest transmisja danych z procesora nadzorującego do i z układu 8255.
/CS- sygnał wejściowy wyboru - selekcji układu przez procesor. Podanie logicznego zera na to wejście
umożliwia transmisję danych poprzez linie D0-D7.
/WR- Sygnał zapisu danych do układu 8255 przez procesor zewnętrzny. Podanie stanu niskiego na to wejście powoduje zapisanie danych z szyny D0-D7 do wewnętrznych rejestrów układu 8255.
/RD- Sygnał odczytu danych z układu 8255. Podanie stanu niskiego na to wejście spowoduje odczytanie informacji z wewnętrznych rejestrów układy 8255.
A1,A0- Linie sterujące wyborem jednego z czterech rejestrów wewnętrznych układu 8255. W zależności od poziomów na tych liniach podczas cyklu odczytu/ zapisu przez procesor wybrany zostaje jeden z trzech rejestrów wyjściowych PA, PB, PC bądź rejestr konfiguracyjny.
RESET- wejście zerowania układu 8255. Podanie stanu wysokiego na to wejście spowoduje wyzerowanie rejestrów wewnętrznych (rejestru sterującego) układu 8255 i ustawienie portów PA, PB, PC jako wejściowych. Taki sam stan układu 8255 ustawiany jest automatycznie po każdorazowym włączeniu zasilania.
PA0-PA7- Linie 8-bitowego uniwersalnego portu PA (pierwszego portu).
PB0-PB7- Linie 8-bitowego uniwersalnego portu PB (drugiego portu)
PC0-PC7- Linie 8-bitowego uniwersalnego portu PC (trzeciego portu)
Zastosowanie układu 8255 w klawiaturze matrycowej i przy sterowaniu diod.
Badany układ oparty na 8255 jest przystosowany do współpracy z systemem DSM-51.
Schemat wyprowadzeń układu jest na str. 6
Schemat ideowy badanego układu jest na str. 7
Wykorzystanie portu PA:
Port PA skonfigurowany jako wyjście.
Pierwsze cztery bity portu PA służą do sterowania czterema diodami. Wystawienie „1” na którymś z tych bitów powoduje zapalenie odpowiadającej temu bitowi diody.
PA0 → dioda pomarańczowa
PA1 → dioda zielona
PA2 → dioda biała
PA3 → dioda niebieska
Cztery ostatnie bity portu PA służą do sterowania obsługą klawiatury i decydują o możliwości występowania przerwania. Dokładny opis działania klawiatury znajduje się w pkt. 5
Aby możliwa była prawidłowa obsługa przerwania bity te muszą być równe „1”. W badanym układzie przerwanie generowane jest przez klawiaturę, a nie przez układ 8255, gdyż upraszcza to obsługę całego układu, ponieważ przerwanie generowane jest nie zależnie od konfiguracji układu.
Wykorzystanie portu PB:
Port PB skonfigurowany jako wejście.
W badanym układzie wykorzystane zostały cztery ostatnie bity portu PB. Służą one do odczytu stanu przycisków w wybranym rzędzie, co dokładnie zostało opisane w pkt. 5
Konfiguracja układu:
Układ konfiguruje się przez wpisanie odpowiedniej danej konfiguracyjnej pod adres układu ( a dokładniej rejestru sterującego 8255 - rejestru CTRL).
Znaczenie pozostałych bitów rejestru CTRL jest następujące:
bit 7 - w trybie programowania układu 8255 zawsze “1”.
bity D6 i D5 - określają wybór trybu pracy układu i rejestrów PA oraz PCa, i tak:
00 = tryb 0
01 = tryb 1
10 lub 11 = tryb 2. Znaczenie poszczególnych trybów jest podane poniżej.
bit D4 - określa kierunek pracy linii portu PA i tak
1 = PA jako wejście
0 = PA jako wyjście cyfrowe
W trybie 2 pracy układu 8255, bit ten nie ma znaczenia.
bit D3 - określa kierunek pracy linii portu PCa (PC7...PC4) i tak
1 = PCa jako wejście
0 = PCa jako wyjście cyfrowe
bit D2 - określa wybór trybu pracy rejestru PB, i tak:
0 = tryb 0
1 = tryb 1
bit D1 - określa kierunek pracy linii portu PB, i tak:
1 = PB jako wejście
0 = PB jako wyjście cyfrowe
bit D0 - określa kierunek pracy linii portu PCb (linie PC3...PC0) i tak
1 = PCb jako wejście
0 = PCb jako wyjście
TRYB 0
Wspomniane tryby pracy (0, 1 lub 2) umożliwiają wybór sposobu działania całego układu. Dla W trybie „0” każdy z rejestrów PA, PB oraz dwóch połówek PC (PCa i PCb) może pracować jako wejście lub wyjście cyfrowe. Dane przesyłane są z szyny danych D0...D7 systemu mikroprocesorowego do rejestrów portu (ustawionych jako wyjścia) lub odczytywane poprzez tą szynę do procesora w sposób niezsynchronizowany. Wszystkie możliwe ustawienia bitu konfiguracyjnego ( CTRL ) zawiera poniższa tabela:
TRYB 1
W tym trybie pracy dane mogą być przesyłane do i z innych urządzeń poprzez porty PA lub PB. W tym trybie transmisja jest jednokierunkowa, tzn. dane mogą być odczytywane przez cały czas do kolejnej rekonfiguracji układu 8255 lub wyłącznie zapisywane. Niektóre z linii portu PC są w tym trybie przyporządkowane rejestrowi PA lub PB, a służą do przesyłania sygnałów synchronizujących transmisję, między rejestrami PA lub PB a urządzeniem zewnętrznym.
TRYB 2
W trybie tym układ 8255 potrafi transmitować dane w dwóch kierunkach jednocześnie wraz z potwierdzeniem transmisji. Rejestr PA wykorzystywany jest wtedy do transmisji danych między 8255 a urządzeniem zewnętrznym. Jako sygnały synchronizujące wykorzystywane są linie PC3...PC7. Pozostałe linie PC0...PC2 oraz rejestr PB mogą pracować niezależnie w trybie 0 lub 1.
KONFIGURACJA BADANEGO UKŁADU:
Badany układ pracuje w trybie „0”, adresem rejestru kontrolnego ( CTRL )w tym przypadku będzie: 11000011, a daną konfiguracyjną będzie: 10100011. Adres ten zawiera w sobie adres urządzenia zewnętrznego (badanego układu 8255), oraz adres rejestru kontrolnego (służącego do konfiguracji układu; dwa pierwsze bity). Zatem prawidłowa konfiguracja układu będzie wyglądała następująco:
MOV R0,# 11000011B ;WPISZ ADRES BAJTU KONFIGURACJI DO R0
MOV A,# 10100011B ;WPISZ DO AKUMULATORA DANĄ KONFIGURAYJNĄ UKLADU
MOVX @R0,A
Układ musi być w trakcie działania programu skonfigurowany co najmniej raz, przed wykonaniem poleceń związanych z działaniem układu.
Wybór odpowiedniego rejestru układu 8255:
W układzie 8255 każdy z 4 rejestrów ma przypisany odpowiedni adres. Przykładowo adres dla rejestru konfiguracyjnego adresem takim będzie: 11000011B. Gdzie dwa najmłodsze bity D1 i D0 oznaczać będą linie adresowe A1 i A0. Pozostałe bity adresu wynikają zarówno z budowy badanego układu, jak również z budowy układu DSM51-PPL.
Kombinacje linii A1 i A0 dla rejestrów poszczególnych portów:
A1 = 0, A0 = 0 - wybór rejestru portu PA.
A1 = 0, A0 = 1 - wybór rejestru portu PB.
A1 = 1, A0 = 0 - wybór rejestru portu PC.
A1 = 1, A0 = 1 - wybór rejestru konfiguracyjnego układu.
Sterowanie diodami:
Diody sterowane są za pomocą pierwszych 4 bitów portu PA, zatem to do nich trzeba wpisać odpowiednią wartość.
Adres rejestru portu PA to: 11000000B.
Przykładowo, aby zapalić diodę pomarańczową i białą musimy wykonać następuje instrukcje:
MOV R0,# 11000000B
MOV A,# 11110101B
MOVX @R0,A
Obsługa klawiatury:
Aby prawidłowo obsługiwać klawiaturę należy wykonać następujące czynności:
Na cztery ostatnie bity portu PA należy wystawić „1”, aby możliwe było wystąpienie przerwania po naciśnięciu dowolnego klawisza
Oczekiwać na wystąpienie przerwania
Sprawdzić stan czterech ostatni bitów portu PB, dla każdego wybranego rzędu klawiszy, przy czym wybór rzędu odbywa się przez podanie na odpowiedniego bitu portu PA (PA4, PA5, PA6, PA7) stanu niskiego.
Dzięki tym czynnością możliwe jest „zlokalizowanie” naciśnietego klawisza i tym samym uzyskanie jego kodu.
Przykład sprawdzenia jednego rzędu klawiszy:
MOV R0,# 11000000B ;\
MOV A,#1110XXXXB ;|} wybór rzędu pierwszego klawiszy
MOVX @R0,A ;/
MOV R0,# 11000001B ; wybór rejestru portu PB
MOVX @R0,A ; zapisanie wartości rejestru portu PB do akumulatora
Po tych instrukcjach należy dokonać sprawdzenia zawartości czterech ostatnich bitów akumulatora, i w przypadku, gdy są one różne od „1” oznacza to, że naciśnięty klawisz znajduje się w aktualnie badanym rzędzie a jego kod w danym rzędzie odpowiada czterem ostatnim bitom akumulatora.
Przykłady programów:
PŁYWAJĄCA „1” :
AD_CONFIG EQU 11000011B ;ADRES BAJTU REJESTRU KONFIGURACJI UKŁADU
AD_PA EQU 11000000B ;ADRES BAJTU REJESTRU PORTU PA
DATA_CONFIG EQU 10100000B ;DANA KONFIGURACYJNA UKLADU
LJMP START
ORG 100H
START:
MOV R0, #AD_CONFIG ;WPISZ ADRES REJESTRU BAJTU KONFIGURACJI DO R0
MOV A, #DATA_CONFIG ;WPISZ DO AKUMULATORA DANA KONFIGURAYJNĄ UKLADU
MOVX @R0, A ;WYŚLIJ POD ADRES REJESTRU BAJTU KONFIGURACYJNI UKLADU TĄ DANĄ
;(USTAL KONFIGURACJE UKŁADU)
MOV R0, #AD_PA ;WPISZ ADRES REJESTRU PORTU PA DO R0
LOOP:
MOV R4, #3 ;ILOŚĆ OBROTÓW AKUMULATORA W LEWO
MOV A,#00000001B ;DANA ZAPALAJĄCA PIERWSZĄ DIODĘ
LEWO:
MOVX @R0, A ;WYŚLIJ DANĄ POD ADRES PORTU PA
PUSH ACC ;UMIEŚĆ ZAWARTOŚĆ AKUMULATORA NA STOSIE
MOV A, #1 ;OPÓŹNIENIE O 1 SEKUNDĘ
LCALL DELAY_100MS
POP ACC ;ZDEJMIJ ZAWARTOŚĆ AKUMULATORA ZE STOSU
RL A ;OBRÓT AKUMULATORA W LEWO
DJNZ R4, LEWO ;ZMNIEJSZ R4 I SKOCZ JEŚLI RÓŻNE OD 0
MOV R4, #3 ;ILOŚĆ OBROTÓW AKUMULATORA W PRAWO
PRAWO:
MOVX @R0, A ;WYŚLIJ DANĄ POD ADRES PORTU PA
PUSH ACC ;UMIEŚĆ ZAWARTOŚĆ AKUMULATORA NA STOSIE
MOV A, #1 ;OPÓŹNIENIE O 1 SEKUNDĘ
LCALL DELAY_100MS
POP ACC ;ZDEJMIJ ZAWARTOŚĆ AKUMULATORA ZE STOSU
RR A ;OBRÓT AKUMULATORA W PRAWO
DJNZ R4, PRAWO ;ZMNIEJSZ R4 I SKOCZ JEŚLI RÓŻNE OD 0
LJMP LOOP
OBSŁUGA KLAWIATURY :
;PROGRAM WYSPISUJE NA WYŚWIETLACZU KOD NACISNIETEGO KLAWISZA I W TRAKCIE NACISKANIA KLAWISZA
;ZAPALA DIODĘ ODPOWIADAJĄCĄ RZĘDOWI NACIŚNIĘTEGO KLAWISZA
AD_CONFIG EQU 11000011B ;ADRES BAJTU REJESTRU KONFIGURACJI UKŁADU
AD_PA EQU 11000000B ;ADRES BAJTU REJESTRU PORTU PA
AD_PB EQU 11000001B ;ADRES BAJTU REJESTRU PORTU PB
DATA_CONFIG EQU 10100011B ;DANA KONFIGURACYJNA UKLADU
LJMP START
ORG 100H
START:
MOV R0,#AD_CONFIG ;WPISZ ADRES REJESTRU BAJTU KONFIGURACJI DO R0
MOV A,#DATA_CONFIG ;WPISZ DO AKUMULATORA DANA KONFIGURAYJNĄ UKLADU
MOVX @R0,A ;WYŚLIJ POD ADRES REJESTRU BAJTU KONFIGURACYJNI UKLADU TĄ DANĄ
;(USTAL KONFIGURACJE UKŁADU)
WYZERUJ_PORT_PA:
MOV R0,#AD_PA
MOV A,#0
MOVX @R0,A ;WYZERUJ PORT PA (UMOŻLIWIENIE WYKRYCIE NACISNIECIA KLAWISZA,
;WYNIKAJĄCE Z KONSTRUKCJI UKŁADU)
OCZEKUJ_NACISNIECIA:
MOV A,#10
LCALL DELAY_MS
JB P3.3,OCZEKUJ_NACISNIECIA
SPRAWDZ_KOD_RZEDU_JEDEN:
MOV R1,#1 ;WPISZ DO R1 AKTUALNIE SPRAWDZANY NUMER RZĘDU
MOV R0,#AD_PA
MOV A,#11100001B ;USTAW WARTOŚĆ WYJŚCIOWĄ DO SPRAWDZENIA KODU KLAWISZA W
;DANYM RZĘDIE I ZAPALENIA DIODY ODPOWIADAJĄCEJ NUMEROWI RZĘDU
;NA PORT PA
MOVX @R0,A
MOV R0,#AD_PB
MOVX A,@R0 ;ODCZYTAJ KOD KLAWISZA W DANYM RZĘDZIE, CZYLI STAN PORTU PB
CJNE A,#11111111B,SPRAWDZ_KOD_KLAW_RZEDU ;SKOCZ DALEJ, POMIŃ SPRAWDZENIE
;NASTENYCH RZĘDÓW, JEŻELI W
;AKTUALNIE SPRAWDZANYM RZĘDZIE
;NACIŚNIĘTY JEST KLAWISZ
SPRAWDZ_KOD_RZEDU_DWA:
MOV R1,#2
MOV R0,#AD_PA
MOV A,#11010010B
MOVX @R0,A
MOV R0,#AD_PB
MOVX A,@R0
CJNE A,#11111111B,SPRAWDZ_KOD_KLAW_RZEDU
SPRAWDZ_KOD_RZEDU_TRZY:
MOV R1,#3
MOV R0,#AD_PA
MOV A,#10110100B
MOVX @R0,A
MOV R0,#AD_PB
MOVX A,@R0
CJNE A,#11111111B,SPRAWDZ_KOD_KLAW_RZEDU
SPRAWDZ_KOD_RZEDU_CZTERY:
MOV R1,#4
MOV R0,#AD_PA
MOV A,#01111000B
MOVX @R0,A
MOV R0,#AD_PB
MOVX A,@R0
CJNE A,#11111111B,SPRAWDZ_KOD_KLAW_RZEDU
LJMP WYZERUJ_PORT_PA
SPRAWDZ_KOD_KLAW_RZEDU:
CJNE A,#01111111B,SPRAWDZ_KOD_KLAW_RZEDU_DWA ;SPRAWDZ CZY NACISNIETO PIERWSZY KLAWISZ W DANYM RZEDZIE
MOV R2,#1
LJMP WYSWIETL
SPRAWDZ_KOD_KLAW_RZEDU_DWA:
CJNE A,#10111111B,SPRAWDZ_KOD_KLAW_RZEDU_TRZY ;SPRAWDZ CZY NACISNIETO DRUGI
;KLAWISZ W DANYM RZEDZIE
MOV R2,#2
LJMP WYSWIETL
SPRAWDZ_KOD_KLAW_RZEDU_TRZY:
CJNE A,#11011111B,SPRAWDZ_KOD_KLAW_RZEDU_CZTERY
MOV R2,#3
LJMP WYSWIETL
SPRAWDZ_KOD_KLAW_RZEDU_CZTERY:
MOV R2,#4
WYSWIETL: ;WYSWIETL PEŁNY KOD KLAWISZA NA WYSWIETLACZU
LCALL LCD_CLR
MOV A,R1
LCALL WRITE_HEX
MOV A,R2
LCALL WRITE_HEX
LJMP WYZERUJ_PORT_PA
OBSŁUGA KLAWIATURY Z ZASTOSOWANIEM PRZERWANIA :
AD_CONFIG EQU 11000011B ;ADRES BAJTU REJESTRU KONFIGURACJI UKŁADU
AD_PA EQU 11000000B ;ADRES BAJTU REJESTRU PORTU PA
AD_PB EQU 11000001B ;ADRES BAJTU REJESTRU PORTU PB
DATA_CONFIG EQU 10100011B ;DANA KONFIGURACYJNA UKLADU
LJMP START
ORG 13 H ;ADRES PRZERWANIA INT1
LJMP POP ;SKOCZ DO PROGRAMU OBSŁUGI PRZERWAŃ
ORG 100H
START:
MOV IE, #84H ;ZEZWALAJ NA PRZERWANIE OD INT1
MOV IP, #04H ;USTAW PRIORYTET PRZERWANIA
MOV R0, #AD_CONFIG ;WPISZ ADRES REJESTRU BAJTU KONFIGURACJI DO R0
MOV A,# DATA_CONFIG ;WPISZ DO AKUMULATORA DANA KONFIGURAYJNĄ UKLADU
MOVX @R0, A ;WYŚLIJ POD ADRES REJESTRU BAJTU KONFIGURACYJNI UKLADU TĄ DANĄ
MOV R0,#AD_PA ;WPISZ ADRES REJESTRU PORTU PA DO R0
LOOP: ;(USTAL KONFIGURACJE UKŁADU)
MOV A, #00000101B ;\
MOVX @R0,A ; \
MOV A, #5 ; \
LCALL DELAY_100MS ; \
MOV A, #00001010B ; PROGRAM GŁÓWNY
MOVX @R0, A ; /
MOV A,#5 ; /
LCALL DELAY_100MS ; /
LJMP LOOP ;/
POP:
PUSH ACC ;UMIEŚĆ ZAWARTOŚĆ AKUMULATORA NA STOSIE
WYZERUJ_PORT_PA:
MOV R0,#AD_PA
MOV A,#0
MOVX @R0,A ;WYZERUJ PORT PA (UMOŻLIWIENIE WYKRYCIE NACISNIECIA KLAWISZA,
;WYNIKAJĄCE Z KONSTRUKCJI UKŁADU)
SPRAWDZ_KOD_RZEDU_JEDEN:
MOV R1,#1 ;WPISZ DO R1 AKTUALNIE SPRAWDZANY NUMER RZĘDU
MOV R0,#AD_PA
MOV A,#11100001B ;USTAW WARTOŚĆ WYJŚCIOWĄ DO SPRAWDZENIA KODU KLAWISZA W
;DANYM RZĘDIE I ZAPALENIA DIODY ODPOWIADAJĄCEJ NUMEROWI RZĘDU
;NA PORT PA
MOVX @R0,A
MOV R0,#AD_PB
MOVX A,@R0 ;ODCZYTAJ KOD KLAWISZA W DANYM RZĘDZIE, CZYLI STAN PORTU PB
CJNE A,#11111111B,SPRAWDZ_KOD_KLAW_RZEDU ;SKOCZ DALEJ, POMIŃ SPRAWDZENIE
;NASTENYCH RZĘDÓW, JEŻELI W
;AKTUALNIE SPRAWDZANYM RZĘDZIE
;NACIŚNIĘTY JEST KLAWISZ
SPRAWDZ_KOD_RZEDU_DWA:
MOV R1,#2
MOV R0,#AD_PA
MOV A,#11010010B
MOVX @R0,A
MOV R0,#AD_PB
MOVX A,@R0
CJNE A,#11111111B,SPRAWDZ_KOD_KLAW_RZEDU
SPRAWDZ_KOD_RZEDU_TRZY:
MOV R1,#3
MOV R0,#AD_PA
MOV A,#10110100B
MOVX @R0,A
MOV R0,#AD_PB
MOVX A,@R0
CJNE A,#11111111B,SPRAWDZ_KOD_KLAW_RZEDU
SPRAWDZ_KOD_RZEDU_CZTERY:
MOV R1,#4
MOV R0,#AD_PA
MOV A,#01111000B
MOVX @R0,A
MOV R0,#AD_PB
MOVX A,@R0
CJNE A,#11111111B,SPRAWDZ_KOD_KLAW_RZEDU
LJMP WYZERUJ_PORT_PA
SPRAWDZ_KOD_KLAW_RZEDU:
CJNE A,#01111111B,SPRAWDZ_KOD_KLAW_RZEDU_DWA ;SPRAWDZ CZY NACISNIETO PIERWSZY KLAWISZ W DANYM RZEDZIE
MOV R2,#1
LJMP WYSWIETL
SPRAWDZ_KOD_KLAW_RZEDU_DWA:
CJNE A,#10111111B,SPRAWDZ_KOD_KLAW_RZEDU_TRZY ;SPRAWDZ CZY NACISNIETO DRUGI
;KLAWISZ W DANYM RZEDZIE
MOV R2,#2
LJMP WYSWIETL
SPRAWDZ_KOD_KLAW_RZEDU_TRZY:
CJNE A,#11011111B,SPRAWDZ_KOD_KLAW_RZEDU_CZTERY
MOV R2,#3
LJMP WYSWIETL
SPRAWDZ_KOD_KLAW_RZEDU_CZTERY:
MOV R2,#4
WYSWIETL: ;WYSWIETL PEŁNY KOD KLAWISZA NA WYSWIETLACZU
LCALL LCD_CLR
MOV A,R1
LCALL WRITE_HEX
MOV A,R2
LCALL WRITE_HEX
MOV R0,#AD_PA
POP ACC
RETI ;POWRÓT Z PROGRAMU OBSŁUGI PRZERWAŃ
Schemat wyprowadzeń układu 8255:
D0-D7 (DATA) - końcówki trójstanowej magistrali danych
RESET - końcówka wejściowa sygnału zerującego rejestry
CS (CHIP SELECT) - końcówka wejściowa wyboru elementu
RD (READ) - końcówka czytania
WR (WRITE) - końcówka pisania
A0, A1 (ADDRESS) - końcówki wejściowe adresu bramy lub rejestru sterującego
PA7-PA0 (PORT A) - końcówki wejściowe/wyjściowe bramy A
PB7-PB0 (PORT B) - końcówki wejściowe/wyjściowe bramy B
PC7-PC0 (PORT C) - końcówki wejściowe/wyjściowe bramy C
VCC - końcówka napięcia zasilającego +5V
GND (GROUND) - końcówka masy
Schemat ideowy badanego układu:
8/11