Professional Documents
Culture Documents
Komponenta 8255
Bitni pinovi
RD WR CS A0 A1 Efekat
0 1 0 0 0 PA → CPU
0 1 0 0 1 PB → CPU
0 1 0 1 0 PC → CPU
0 1 0 1 1 Ctr → CPU
1
Struktura kontrolne re£i Predstavlja kombinaciju za pode²avanje smera
portova A, B i C . Prikazana je na slici 1.1. Bit postavljen na jedinicu zna£i
da je nazna£eni port ulazni (input ); dok nula ozna£ava izlazni port (output ).
1 0 0 0
smer donje polovine PC
smer PB
smer gornje polovine PC
smer PA
režim
enable flag
Re²enje.
1
a) Kada je taster pritisnut, £itamo 0 na portu B , ²to dovodi do toga da
imamo 0 na portu A i uklju£ivanje LED. Logi£ka ²ema je prikazana na
slici 3.7. Isprekidane linije izmeu RD i WR nagla²avaju £injenicu da
ova veza nije direktna (obi£no ovi signali idu najpre na dekoder).
1 Svaki zadatak se sastoji od 4 dela i to su: a) crtanje osnovne logi£ke ²eme, b) odrei-
vanje adresne ²eme, c) odreivanje kontrolnih re£i i d) program.
2
8255 8086
D0 – D7 a0 – a15
a1 A0 BHE
a2 A1 ALE
LED PA RD RD
prekidači PB WD WD M/IO
CS
8205
a3 A0 Y0
Y1
a4 A1 Y2
a5 A1 Y3
Y4
Y5
Y6
Y7
E1 E2 E3
..
BHE
M/IO
a0
a3 · · · a5
a6
a15
3
A15 A12 A11 A8 A7 A4 A3 A0
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
; CLI - uklju£ivanje zabrane prekida
PETLJA:
MOV DX, 0FFC2h ; adresa PB
4
IN AL, DX
MOV DX, 0FFC0h ; adresa PA
OUT DX, AL
JMP PETLJA
POP DX
POP AX
RET
MAIN ENDP
5
Glava 2
512k · 8b 512k · 8b
CS CS
BHE A0
adresna
magistrala
magistrala D8 – D15 D0 – D7
za podatke
6
4. Procesor prenosi 16-bitni podatak sa neparne adrese:
MOV AX, [4C01h] BHE = 0 i A0 = 0
U poslednjem slu£aju je u pitanju neporavnat pristup, pa se zato obavlja iz
2 takta. Za prva tri slu£aja se sve obavlja u jednom taktu.
7
Glava 3
Komponenta 8251
8251
serijski
PC interni 8086
prenos bafer
marking
start 5b – 8b bit
bit parnosti
8
• Sinhroni ima dodatnu liniju za klok, tako da se podatak moºe pojaviti
samo u odreenim vremenskim intervalima.
8251
C/D D0 – D7
RD
WR
TxE
RxD
RxRDY
TxD
TxRDY
RxC
TxC CS
CS C/D RD WR Efekat
9
Kontrolne re£i Sa CPU-a dolaze dve kontrolne re£i: mode i command. Iz
kontrolnog registra dolazi samo status. Kontrola re£ mode prikazana je na
slici 3.4, a kontrolna re£ command na ??.
00 – disable 00 – 5b 00 – Sync
1 sb – 01
01 – disable 01 – 6b 01 – 1×
1.5 sb – 10
10 – neparna 10 – 7b 10 – 16×
2 sb – 11
11 – parna 11 – 8b 11 – 64×
broj stop bitova bit parnosti broj prenetih bitova definiše mod i brzinu
preko serijske linije serijskog prenosa
0 0 0 0
TxE
RxE
Reset Error Flag
Internal Reset
10
PE OE FE
TxRDY
RxRDY
TxE
Re²enje.
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
11
8251 8086
D0 – D7
RD BHE
WR
a1 C/D
RD
WD M/I0
CS
8205
Y0 A0 a3
Y1
A1 a4
Y2
Y3 A2 a5
Y4
Y5
Y6
Y7
E1 E2 E3
..
BHE
M/IO
a0
a2 – a8
a9
a15
idle
mode
sync1
reset
sync2
command
12
; inicijalizacija 8251
; CLI
; Resetuj komponentu
MOV AL, 40h
OUT DX, AL
;STI
PETLJA:
MOV DX, 0FE02h
IN AL, DX
TEST AL, 38h ; izvuci statusne bitove
JNZ GRESKA ; sko£i na obradu gre²ke
CMP SI, N
JL SLANJE
CMP DI, N
JL PRIJEM
13
JMP KRAJ
SLANJE:
CMP SI, N ; broja£ poslatih
JZ PRIJEM
TEST AL, 01h ; provera TxRDY == 1
JZ PRIJEM ; ako nije spreman
MOV DX, 0FE00h
MOV AL, SEND[SI]
OUT DX, AL ; prenos u 8251
INC SI ; uve¢anje poslatih
PRIJEM:
CMP DI, N
JZ PETLJA
MOV DX, 0FE02h
IN AL, DX
TEST AL, 02h ; provera RxRDY == 1
JZ PETLJA
MOV DX, 0FE00h
IN AL, DX ; £itanje podatka
MOV RECV[DI], AL
INC DI ; uve¢anje primljenih
JMP PETLJA
GRESKA:
; Bez obrade. Moºe da se javi na prijemu
; podataka, ali ¢e se registrovati tek
; prolaskom kroz glavnu petlju.
KRAJ:
MOV AH, 4Ch
INT 21h
CODE ENDS
END START
14
Glava 4
Komponenta 8259
Prekidi kod 8086 Prvi kilobajt procesora 8086 ima posebu namenu i
zove se tabela vektora prekida (Interrupt Vector Table ). Ilustrovan je
na slici 4.1. Zapis i tabele prekida je podeljen na 2 dela:
1 kB
CSi
i 256 zapisa od po 4 B
IPi
15
Da bi procesor mogao da iskoristi ovakvu konguraciju, pridruºena mu je
komponenta 8259. Logi£ka ²ema komponente 8259 prikazana je na slici 4.2.
Magistralom podataka se ²alje vektor prekida INTV ka procesoru 8086 (iden-
tikator prekida). A0 nije zi£ki odvojen registar, ve¢ mu govori kako da
protuma£i podatak u registru. Sluºi za adresiranje internih registara. Signal
INT prekida proces, a signal INTA ozna£ava potvrdu prekida.
8259
8b
IR0
IR1
IR2
IR3
IR4
IR5 A0
IR6
IR7 INT ka procesoru
INTA iz procesora
WR
RD CS
16
Kada je postavljen na 1, prekid ¢e se otkriti na IR liniji ako jedinica
traje zadato vreme.
ICW2 (A0 = 1) Prva tri bita zdesna nemaju efekta kod inicijalizacije.
Levih pet bitova su deo vektora prekida.
Re²enje.
17
d) Kontrolne re£ za 8259 su: ICW1 0x13, ICW2 0xA8, ICW4 0 0x03
i OCW1 0xDF.
e) Program:
EXTRN PREKID:FAR ;pomocna procedura za obradu prekida
PUBLIC RECV, BRULAZ ;vidljivo i iz drugih modula
DATA SEGMENT
BRULAZ DB 0
;baferi primljenih i poslatih podataka
SEND DB 64 DUP (3Fh)
RECV DB 64 DUP (?)
DATA ENDS
STEK SEGMENT
BOS DW 256 DUP (?)
TOS LABEL WORD
STEK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STEK
START:
;inicijalizacija segmenata
MOV AX, DATA
MOV DS, AX
MOV AX, STEK
MOV SS, AX
LEA SP, TOS
;inicijalizacija komponenti
CLI
;8251
MOV AL, 00h
MOV DX, 0FF02h
OUT DX, AL
OUT DX, AL
OUT DX, AL
MOV AL, 40h
OUT DX, AL
MOV AL, B2h ;slanje mode kontrolne reci
OUT DX, AL
MOV AL, 15h ;slanje komandne kontrolne reci
18
OUT DX, AL
;8259
MOV DX, 0FF04h
MOV AL, 13h ;ICW1
OUT DX, AL
MOV DX, 0FF06h
MOV AL, 0A8h ;ICW2
OUT DX, AL
MOV AL, 03h ;ICW4
OUT DX, AL
MOV AL, 0DFh ;OCW1
OUT DX, AL
;inicijalizacija tabele vektora prekida
MOV AX, OFFSET PREKID
MOV 0:[173*4], AX ;PROVERITI OVO - trebalo bi da ne moze sa nulom, ali da m
MOV AX, SEG PREKID
MOV 0:[173*4+2], AX ;I OVO
MOV CX, 64
MOV SI, 0
STI ;dozvola prekida
PETLJA:
CEKAJ:
MOV DX, 0FF02h
IN AL, DX ;AL -- status
TEST AL, 38h ;test na gresku koja se moze javiti u prijemu
JNZ GRESKA
TEST AL, 01h ;TxRDY == 1?
JZ CEKAJ ;ako nije spreman, cekaj da bude
MOV DX, 0FF00h
MOV AL, SEND[SI]
OUT DX, AL
INC SI
LOOP PETLJA ;64 prolaza
CEKAJ1: ;cekanje na prekidnu proceduru
CMP BRULAZ 64
JL CEKAJ1
MOV DX, 0FF02h ;testiranje na gresku
IN AL, DX
TEST AL, 38h
JZ KRAJ
GRESKA: ;kod za upravljanje greskom
19
KRAJ:
MOV AH, 4Ch
INT 21h
CODE ENDS
END START
;----------------------
;Eksterna procedura za prekide
;Radi paralelno i vrsi prijem podataka
EXTRN RECV:BYTE, BRULAZ:BYTE
PUBLIC PREKID
PROCED SEGMENT
PREKID PROC FAR
ASSUME CS:PROCED
;cuvanje konteksta procesora
PUSHF
PUSH AX
PUSH DI
PUSH DX
MOV DX, 0FF00h ;bez testiranja na spremnost jer je RxRDY sigurno 1
IN AL, DX
MOV DI, BRULAZ
MOV RECV[DI], AL
INC BRULAZ ;uvecanje brojaca primljenih
;vracanje konteksta procesora
POP DX
POP DI
POP AX
POPF
IRET ;vracanje iz procedure
PREKID ENDP
PROCED ENDS
20
Glava 5
21
PUBLIC DISPLAY, ZBIR, ROTOR, DEFC, POZC
DATA segment
DEFC db 7eh, 30h, 6dh, 79h, 33h, 5bh, 5fh, 70h, 7fh, 7bh
DISPLAY db 10 dup (0)
ZBIR db 10 dup (0)
ROTOR dw 0
POZC dw 0
DATA ends
STACK segment
bos dw 256 dup (?)
tos label word
STACK ends
CODE segment
assume CS:CODE, DS:DATA, SS:STACK
start:
mov AX, DATA
mov DS, AX
mov ES, AX
mov AX, STACK
mov SS, AX
lea SP, tos
cli
; 8259 inic.
; ICW1
mov DX, 0F000h
mov AL, 13h
out DX, AL
; ICW2
mov DX, 0F002h
mov AL, 70h
out DX, AL
; ICW4
mov AL, 03h
out DX, AL
; OCW1
mov AL, 5Fh
out DX, AL
22
; 8255-1 inic.
mov DX, 0F00Eh
mov AL, 80h
out DX, AL
; 8255-2 inic.
mov DX, 0F016h
mov AL, 92h
out DX, AL
sti
main:
jmp main
CODE ends
end start
PCODE SEGMENT
assume CS: PCODE
Osvez_proc proc far
pushf
push AX
push CX
push DX
23
push SI
cli
mov AL, ROTOR
inc AL
cmp AL, 10
jl dalje1
mov AL, 0
dalje1:
mov ROTOR, AL
mov AH, 0
mov SI, AX
mov AL, DISPLAY[SI]
mov SI, AX
mov AL, DEFC[SI]
sti
pop SI
pop DX
pop CX
pop AX
popf
iret
Osvez_proc endp
24
push DX
push BX
cli
mov DX, 0F010h
in AL, DX
cmp AL, 0
je portb
mov BX, 0
poredi:
cmp AL, 1
je nasao
shr AL, 1
inc BX
jmp poredi
nasao:
call Cifra_proc
jmp kraj
portb:
mov DX, 0F012h
in AL, DX
cmp AL, 1
je losam
cmp AL, 2
je ldevet
cmp AL, 4
je lreset
cmp AL, 8
je lplus
jmp ljednako
losam:
mov BX, 8
call Cifra_proc
jmp kraj
ldevet:
mov BX, 9
call Cifra_proc
25
jmp kraj
lplus:
call Plus_proc
jmp kraj
ljednako:
call Jednako_proc
jmp kraj
lreset:
call Reset_proc
kraj:
sti
pop BX
pop DX
pop AX
popf
iret
Taster_proc endp
pop CX
pop SI
popf
ret
Reset_proc endp
26
push CX
call Plus_proc
xor SI, SI
mov CX, 10
petlja:
mov AL, DS:[SI+ZBIR]
mov DS:[SI+DISPLAY], AL
inc SI
loop petlja
pop CX
pop AX
pop SI
popf
ret
Jednako_proc endp
novacifra:
mov DS:[BP+DISPLAY], BL
inc POZC
kraj:
pop AX
pop BP
27
popf
ret
Cifra_proc endp
inc SI
cmp SI, 9
jbe petlja
mov POZC, 0
pop SI
pop SI
pop AX
ret
Plus_proc endp
PCODE ends
END
Napomene:
a) Tehnika osveºavanja na primeru dva sedmosegmentna displeja
SLIKAAA
b) Izvori prekida mogu biti taster ili generator takta za osveºavanje di-
28
spleja koji generi²e prekid na tr sekundi.
c) Matri£na tastatura2 SLIKAAAAA
Obja²njenje: Koristimo 2 komponente 8255 (jedna za displej a druga za
tastaturu). Pinovi A3 do A5 se vode na dekoder. Promenljiva DEFC pred-
stavlja kodove cifara. Niz DISPLAY predstavlja niz cifara koji su prikazani,
pri £emu na poziciju najmanje teºine ide i cifra najmanje teºine. Glavni
program ne radi ni²ta (vrti beskona£nu petlju). ROTOR predstavlja broj
osveºavanja i njegova vrednost nam kazuje koji ¢e displej biti osveºen.
Kod (SCAN algoritam):
DATA SEGMENT
;inicijalizacija tabele koja pamti karaktere
;Ovi karakteri se salju na PA komponente 8255
;i na osnovu njih se proverava koji tester
;je pritisnut. EEh je vrednost gornjeg levog tastera.
TABLE DB 77h, 78h, 7Dh, 7Eh, 0B7h, 0BBh, 0BDh, 0BEh, 0D7h, 0DBh, 0DEh, 0E7h, 0EB
DATA ENDS
;procedura za skeniranje
KEYBRD PROC NEAR
PUSHF
PUSH BX
PUSH CX
PUSH DX
MOV AL, 0
MOV DX, 0FFF9h ;port A je smesten na 0FFF9h
OUT DX, AL ;saljemo sve nule na PA
MOV DX, 0FFFBh ;port B je smesten na 0FFFBh
;naredni deo koda ceka nulu sa tastature
;nula nam kazuje da je neki od tastera pritisnut
WAIT_OPEN:
IN AL, DX
AND AL, 0Fh
CMP AL, 0Fh
JNE WAIT_OPEN
;naredni deo koda ceka otpustanje dugmeta
WAIT_PRESS:
IN AL, DX
2 Problemi pri implementaciji matri£ne tastature je jedno od pitanja za usmeni
29
AND AL, 0Fh
CMP AL, 0Fh
JE WAIT_PRESS
30
;Pomeranje maske - odabir novog reda
ROL CL, 1
MOV AL, CL
MOV AH, AL
JMP NEXT_ROW
ENCODE:
MOV DX, 000Fh ;zbunjen sam - ako neka zna zasto ovo, neka javi
IN AL, DX ;broj kolone
SHL AH, 4 ;pomeramo masku u gornji deo AH
OR AL, AH ;spajamo AL i AH u AL
TRY_NEXT:
CMP AL, TABLE[BX] ;poredjenje sa kodom iz memorije
JZ DONE
DEC BX
JNS TRY_NEXT ;ako nije to taj kod, idemo dalje
MOV AH, 1 ;u AH je status
JMP EXIT
DONE:
MOV AL, BL
MOV AH, 0
EXIT:
POP DX
POP CX
POP BX
POPF
RET
KEYBRD ENDP
MAIN:
;Posto je ovo blokirajuca procedura
;ona ide u glavni program, a ne u prekidnu proceduru
XOR BX, BX
CALL KEYBRD
CMP AH, 0 ;provera statusa
JNE MAIN ;los status, pa je potrebno novo citanje
CMP AL, 10 ;provera cifre
JL CIFRA_L
;CMP AL, 10 - ovo smo utvrdili na casu da je visak
31
JE PLUS_L
CMP AL, 11
JE JEDNAKO_L
CMP AL, 11
JE RESET_L
JMP MAIN
CIFRA_L:
MOV BL, AL
CALL CIFRA_PROC
JMP MAIN
PLUS_L:
CALL PLUS_PROC
JMP MAIN
JEDNAKO_L:
CALL JEDNAKO_PROC
JMP MAIN
RESET_L:
CALL RESET_PROC
JMP MAIN
32