Autori
Beograd, Vujović
Ivana 81 96
11.01.2001. Kovačević
Miloš 250 97
0. Uvodna razmatranja
Maksimalna brzina pokretne trake je 0.5m/s = 50cm/s = 10cm/200ms = 30cm/600ms. Komandni signali (za pokretanje trake,
pakovanje proizvoda i menjanje kutije) mogu da traju do 300ms. U najgorem
slučaju između nailaska dva proizvoda treba poslati dva signala (pakovanje i
zamena) što može da traje do 600ms, a to pri maksimalnoj brzini trake daje minimalno
rastojanje od 30cm između dva proizvoda, da bi sistem korektno funkcionisao.
To ujedno znači da novi proizvod ne može da stigne do detektora pre nego što
prethodni ne stigne do pakera (30cm od detektora).
Dodatne
pretpostavke:
-
U toku
nailaska proizvoda od detektora do pakera traka se pomera približno
konstantnom brzinom.
-
Minimalna
brzina trake iznosi Vmin=30cm/60000ms = 5mm/s, sve ispod toga
sistem tretira kao zaustavljanje trake.
-
Maksimalan
kapacitet kutije za
pakovanje proizvoda je 65535 (U slučaju da se preko tastature unese
kapacitet 0 ili veći od 65535, unos se ponavlja)
Uputstvo za upotrebu sistema:
-
Po uključivanju sistema
ukucati kapacitet kutije za pakovanje proizvoda (u slučaju pogrešno unetog
broja otkucati pet nula pa korektan broj) i Unesi.
-
Ako signal za pokretanje trake iz sistema nije vezan za motor koji pokreće
traku, pokrenuti traku ručno.
-
U slučaju zaustavljanja trake (na displeju će se pojaviti poruka reset)
resetovati sistem, ručno zameniti kutiju ako nije prazna i ponoviti postupak od
početka.
1. Korišćene komponente
komponenta |
komada |
opis |
8086 |
1 |
Procesor |
8284 |
1 |
Generator takta za procesor i periferije |
74HC373 |
3 |
Adresni lečevi |
8254 |
1 |
Brojač Tajmer 0 generiše prekid na
svaku 1ms (radi u modu 2) Tajmer 1 generiše prekid na
svakih 20ms (radi u modu 2) Tajmer 2 meri vreme u [ms] potrebno da traka pređe 10cm (radi u modu 0) |
8255 |
1 |
Paralelni port za slanje spoljašnjih izlaznih signala |
8259 |
1 |
Kontroler prekida prima sledeće zahteve za prekid IRQ0 - proizvod detektovan
(spoljašnji ulazni signal) IRQ1 - prošla 1ms (izlaz
Tajmera 0) IRQ2 - prošlo 20ms (izlaz
Tajmera 1) IRQ3 - traka pomerena za 10cm
(spoljašnji ulazni signal) IRQ4 - traka se zaustavila
(izlaz Tajmera 2) |
8279 |
1 |
Kontroler za tastaturu i displej |
5x4 tastatura |
1 |
Mehanička tastatura sa 4 reda i 5 kolona tastera |
5c displej |
1 |
Displej za prikaz pet osmosegmentnih znakova |
MS6264 |
8 |
8K8 RAM kapaciteta 8KB |
27C256 |
2 |
32K8 EPROM kapaciteta 32KB |
MB7117E |
1 |
Memorijski adresni PROM 256x8 kapaciteta 256B |
MB7134E |
1 |
Ulazno/izlazni adresni PROM 4K4 kapaciteta 2KB |
Rxx |
X |
Otpornici |
Cxx |
X |
Kondenzatori |
Svakoj periferiji je
dodeljeno po 8 uzastopnih adresa u ulazno/izlaznom adresnom prostoru, počev od
adrese 00000h:
8254: 00000:00007h
8255: 00008:0000Fh
8259: 00010:00017h
8279: 00018:0001Fh
Memorijski adresni
prostor je raspoređen na sledeći način:
RAM1: 00000:03FFFh
RAM2: 04000:07FFFh
RAM3: 08000:0BFFFh
RAM4: 0C000:0FFFFh
ROM: F0000:
FFFFFh
IVT: 00000:003FFh
STEK: SP
: 0FFFFh
Prog: F0000: ?
Sadržaj adresnih PROMova je
sledeći:
MB7117E |
RD cmpl |
M/IO |
A19 |
A18 |
A17 |
A16 |
A15 |
A14 |
CSRAM1 |
CSRAM2 |
CSRAM3 |
CSRAM4 |
CSROM cmpl |
|
|
|
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
Ao |
O0 |
O1 |
O2 |
O3 |
O4 |
O5 |
O6 |
O7 |
|
|
X |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
X |
X |
X |
|
X |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
X |
X |
X |
|
X |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
X |
X |
X |
|
X |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
X |
X |
X |
|
0 |
1 |
1 |
1 |
1 |
1 |
X |
X |
0 |
0 |
0 |
0 |
0 |
X |
X |
X |
|
SVE
OSTALO |
0 |
0 |
0 |
0 |
1 |
X |
X |
X |
MB7134E |
A14 |
A13 |
A12 |
A11 |
A10 |
A9 |
A8 |
A7 |
A6 |
A5 |
A4 |
A3 |
CS54
cmpl |
CS55
cmpl |
CS59
cmpl |
CS79
cmpl |
A11 |
A10 |
A9 |
A8 |
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
Ao |
O0 |
O1 |
O2 |
O3 |
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
|
SVE
OSTALO |
1 |
1 |
1 |
1 |
spoljni izgled tastature
2. Dijagram toka procesa pakovanja
Proizvod
nailazi ? NE
Pređeno
30cm ? NE
DA
Broj preostalih
mesta = 0 ? NE
DA
2. Program
JMP FAR PTR Start
IVT DW 2*256
DUP (?) ; inicijalizacija IVT-a
IVTPdetekt EQU (20h)*4
; ulaz u IVT za prekidnu rutinu
detekcija
cifre DB 5
dup (0) ; kapacitet kutije u BCD
formatu
kapacitet DW 0 ; kapacitet kutije
vreme30cm DW 60000 ; vreme potrebno da traka pređe 30cm [ms]
merenjeBrz DB 0 ; da li je počelo merenje
brzine trake
nailazak DB 0 ; da li je proizvod između detektora i pakera
KRENI EQU 00000001b ;
signal "Pokreni Traku"
PAKUJ EQU 00000010b ;
signal ”Pakuj Proizvod"
MENJAJ EQU 00000100b ;
signal "Menjaj Kutiju"
NOS EQU 00h ;
nijedan signal
PortA EQU 08h ;
adresa porta A
VrhSteka EQU
10000h
; inicijalizacija SP-a
dec2sseg DB 00111111b ; Tabela za konverziju decimalne cifre
DB 00000110b ; u kod za ispis na sedmosegmntnom
DB 01011011b ; displeju sa zajedničkom katodom
DB 01001111b ; po formatu DPgfedcba2
DB 01100110b
DB 01101101b
DB 01111101b
DB 00100111b
DB 01111111b
DB 01101111b
ASSUME CS:Kod, DS:Podaci,
ES:Podaci, SS:Podaci
; Inicijalizacija segmentnih registara i SP
Start: xor AX, AX
; AX = 0
mov DS, AX ; inicijalizacija DS
mov ES, AX ; inicijalizacija ES
mov SS, AX ;
inicijalizacija SS
mov SP, VrhSteka ;
inicijalizacija SP
; Inicijalizacija ulaza u IVT za sve prekidne rutine
cli ; nedozvoljavamo prekide
cld ;
autoinkrement
mov DI, IVTPdetekt
mov AX,offset detekcija
stosw
mov AX,seg detekcija
stosw
mov AX,offset vreme1ms
stosw
mov AX,seg vreme1ms
stosw
mov AX,offset vreme20ms
stosw
mov AX,seg vreme20ms
stosw
mov AX,offset traka10cm
stosw
mov AX,seg traka10cm
stosw
mov AX,offset trakastop
stosw
mov AX,seg trakastop
stosw
; Inicijalizacija periferija
call Init8259
call Init8254
call Init8255
call Init8279
call Unos ;
unos kapaciteta kutije
mov AL, KRENI ;
signal za pokretanje trake
out PortA, AL
xor BX, BX ;
BX (vremex20 [ms]) = 0
mov AL, 11111011b ;
dozvoljen samo IRQ2 (vreme20ms)
out R59ICW2, AL
sti ; dozvoli prekide
cekaj1:cmp BX, 7 ; vreme (±40ms) - 140 ms
jb cekaj1 ;
ako je manje čekaj još
mov AL, NOS ;
prekini sve signale na portu A
out portA, AL
mov AL, 11110110b ;
dozvoljeni prekidi od trake i detektora
out R59ICW2, AL
mov DX, kapacitet ; broj preostalih slobodnih mesta u kutiji
cekaj3:cmp nailazak, 1 ; čeka se nailazak
sledećeg proizvoda
jne cekaj3
cekaj4:cmp CX, vreme30cm ; da li je traka prešla 30cm ?
jb cekaj4 ;
nije
mov nailazak, 0 ;
proizvod je prošao zonu nailaska, čeka se sled.
xor BX, BX ;
BX (vremex20 [ms]) = 0
mov AL, 11110010b ; dozvoli prekid za detekciju sledećeg proizvoda,
out R59ICW2, AL ; vreme20ms i pomeraj traje za 10cm
mov AL, PAKUJ ;
signal za pakovanje proizvoda
out PortA, AL
cekaj5:cmp BX, 7 ; vreme (±40ms) - 140 ms
jb cekaj5 ;
ako je manje čekaj još
mov AL, NOS ;
prekini sve signale na portu A
out PortA, AL
dec DX ;
broj preostalih slobodnih mesta u kutiji --
jnz dalje1 ;
mov AL, MENJAJ ;
ako je kutija puna menjaj je
out PortA, AL
xor BX, BX ;
BX (vremex20 [ms]) = 0
cekaj6:cmp BX, 7 ; vreme (±40ms) - 140 ms
jb cekaj6 ;
ako je manje čekaj još
mov AL, NOS ;
prekini sve signale na portu A
out PortA, AL
mov DX, kapacitet ;
reset broja preostalih slobodnih mesta u kutiji
dalje1:in AL, R59ICW2 ; učitaj Interrupt Mask
Register
or AL, 00000100b ;
maskiraj prekid vreme20ms
out R59ICW2, AL
jmp cekaj3 ;
čekaj sledeći proizvod
; Inicijalizacija 8259
R59ICW1 EQU 10h ; adresa za ICW1, OCW2, OCW3
R59ICW2 EQU 12h ; adresa za
ICW2, ICW4, OCW1
ICW1 EQU 00010011b ;
ivično okidanje,
samo jedan 8259, ICW4 slati
ICW2 EQU 20h ; tipovi
prekida su u opsegu 20 - 27
h
ICW4 EQU 00000011b ;
Auto End Of Interrupt, 8086 sistem
; Procedura za
inicijalizaciju kontrolera prekida 8259
; koristi: sve gore
navedene konstante
; menja: AL
Init8259 PROC NEAR
mov AL,ICW1
out R59ICW1,AL
mov AL,ICW2
out R59ICW2,AL
mov AL,ICW4
out R59ICW2,AL
ret
Init8259 ENDP
; Inicijalizacija 8254
R54Ctrl EQU 06h ; adresa za
kontrolni registar
R54T0 EQU 00h ; adresa za
Timer0
R54T1 EQU 02h ; adresa za
Timer1
R54T2 EQU 04 ; adresa za Timer2
Ctrl54T0 EQU
00110100b ; Timer0, LSB i MSB, Mod 2, Binarno
Ctrl54T1 EQU
01110100b ; Timer1, LSB i MSB, Mod 2, Binarno
Ctrl54T2 EQU 10110000b ; Timer2, LSB i MSB, Mod 0, Binarno
T0LSB EQU 0C4h ; 2.5MHz/2500 = 1kHz = 1/1ms
T0MSB EQU 009h ; 250010=09C416
T1LSB EQU 050h ; 2.5MHz/50 000 = 50Hz = 1/20ms
T1MSB EQU 0C3h ; 50 00010=C35016
T2LSB EQU 020h ; 20 00010=4E2016
T2MSB EQU 04Eh
; Procedura za
inicijalizaciju kauntera 8254
; koristi: sve gore
navedene konstante
; menja: AL
Init8254 PROC NEAR
mov AL, Ctrl54T0 ; Inicijalizacija Tajmera 0
out R54Ctrl, AL
mov AL,
T0LSB
out R54T0, AL
mov AL, T0MSB
out R54T0, AL
mov AL,Ctrl54T1 ; Inicijalizacija Tajmera 1
out R54Ctrl,AL
mov AL,
T1LSB
out R54T1, AL
mov AL, T1MSB
out R54T1, AL
mov AL, Ctrl54T2 ;
Inicijalizacija Tajmera 2
out R54Ctrl,AL
; vrednost se šalje u
prek.rutini traka10cm
ret
Init8254 ENDP
; Inicijalizacija 8255
R55Ctrl EQU 0Eh ;
adresa za kontrolni registar
Ctrl55 EQU
10000000b ; Mod 0, Izlaz
; Procedura za
inicijalizaciju paralelnog porta 8255
; koristi: sve gore
navedene konstante
; menja: AL
Init8255 PROC near
mov AL,Ctrl55
out R55Ctrl,AL
ret
Init8255 ENDP
; Inicijalizacija 8279
R79CtrlStat EQU 1Ah
; adresa za
kontrolni i statusni registar
R79Data EQU 18h ;
adresa za data registre (displeja i tastature)
Ctrl79a EQU
00010000b ; 8 8b right entry display, encoded scan
; 2 key lockout
keyboard
Ctrl79b EQU 00111001 ; 2.5MHz/110012 (2510) = 100kHz
Ctrl79RdFifo EQU 01000000 ;
čitanje je iz fifo bafera tastature
Ctrl79WrDisp EQU 10010000 ;
upis je u displej, autoinkrement, od 0. pozicije
; Procedura za inicijalizaciju
kontrolera tastature i displeja 8279
; koristi: sve gore
navedene konstante
; menja: AL
Init8279 PROC near
mov AL, Ctrl79a
out R79CtrlStat, AL
mov AL, Ctrl79b
out R79CtrlStat, AL
mov AL, Ctrl79RdFifo
out R79CtrlStat, AL
mov AL, Ctrl79WrDisp
out R79CtrlStat, AL
ret
Init8279 ENDP
; Procedura za unos podataka
sa tastature i ispis na displej
; ulaz: tabela za
konverziju cifara u sedmosegmentni kod na adresi dec2sseg
; koristi: definisane
konstante za kontroler 8279
; menja: AX, BX, CX, SI, DI
; izlaz: Uneti kapacitet
kutije na adresi kapacitet
start1: mov BX, offset dec2sseg ;
adresa tabele za konverziju cifara u 7segmentni
cekaj: in AL,R79CtrlStat ; kod.
and AL,00000111b ;
da li je pritisnuto neko dugme?
jz cekaj ; nije
in AL,R79Data ; jeste => učitaj ga
cmp 14h ; da li je
ENTER
je izlaz ;
jeste => kraj unosa
cmp AL,00h ;
da li je 1
mov AH,1 ;
jeste => upisi 1 u AH
je input ;
...
cmp AL,01h
mov AH,2
je input
cmp AL,02h
mov AH,3
je input
cmp AL,03h
mov AH,4
je input
cmp AL,04h
mov AH,5
je input
cmp AL,08h
mov AH,6
je input
cmp AL,09h
mov AH,7
je input
cmp AL,0Ah
mov AH,8
je input
cmp AL,0Bh
mov AH,9
je input
cmp AL,0Ch
jne citaj ; nedozvoljeno
dugme => ignoriši ga
mov AH, 0
input: mov SI, offset cifre + 1 ;
cifra posle najviše
mov DI, offset cifre ; najviša cifra
mov CX, 4
rep movsb ;
šiftuj cifre u levo za jedno mesto
mov AL, AH
stosb ; ubaci
učitanu cifru na najniže mesto
xlat ;
konvertuj cifru u 7segm. kod i
out R79Data, AL ;
ispiši to na displej
jmp citaj ;
čitaj dalje
izlaz: mov SI, offset cifre ;
konverzija cifara u broj
mov BX,
10 ; množilac
mov CX,
4 ; broj
cifara za množenje sa 10
mnozi:lodsb ;
sledeća (niža) cifra
xor AH,
AH ; u AX
add AX, kapacitet ;
+ prethodno
sabrane
mul BX ; * 10
jc start1 ; ako je doslo do
prekoračenja čitaj ponovo
mov kapacitet, AX
loop mnozi ; dalje
lodsb ; najniža cifra
xor AH, AH
add kapacitet, AX ;
se samo sabira bez množenja
jz start1 ; ako je rezultat 0
jc start1 ; ili veci od
65535 ponovi učitavanje
ret
Unos ENDP
; Prekidna rutina za prekid
pri pomeraju trake za 10cm
; koristi: indikator merenjeBrz
, definisane konstante za 8254
; izlaz: vreme potrebno
traci da pređe 30cm - vreme30cm, indikator merenjeBrz
traka10cm PROC FAR ; prekidna rutina
za pomeraj trake od 10cm
push AX
push BX
cmp merenjeBrz, 0 ; da li je ovo prvo merenje brzine
je initT2 ;
jeste => inicijalizuj tajmer 2
mov AL, 10000000b ; Counter Latch Command za tajmer 2
out R54Ctrl, AL
in AL, R54T2 ;
pročitaj LSB
mov BL, AL
in AL, R54T2 ;
pročitaj MSB
mov BH, AL
mov AX, 20000 ; 20 000 - count =
sub AX, BX ;
koliko je ms prošlo za pređenih 10cm
mov BX, 3
mul BX ;
vreme potrebno za prelazak 30cm
mov vreme30cm, AX
initT2: mov AL, T2LSB ;
resetuj brojač tajmera 2
out R54T2, AL
mov AL, T2MSB
out R54T2, AL
mov merenjeBrz, 1 ; označi da je merenje brzine počelo
pop BX
pop AX
iret
traka10cm ENDP
; Prekidna rutina za prekid
pri detekciji novo proizvoda
; ulaz: IMR
; izlaz: CX=0, indikator nailazak=1, IMR
detekcija PROC FAR
push AX
xor CX, CX ;
vreme [ms] = 0
in AL, R59ICW2 ;
učitaj Interrupt Mask Register
or AL, 00000001b ;
maskiraj prekid za detekciju proizvoda (sebe)
and AL, 11111101 ;
demaskiraj prekid vreme1ms
out R59ICW2, AL
mov nailazak, 1
pop AX
iret
detekcija ENDP
; Prekidna rutina za prekid
posle svake protekle milisekunde
; izlaz: inkrementiran
brojač
milisekundi <-> CX
vreme1ms PROC FAR
inc CX ;
vreme [ms] ++
iret
vreme1ms ENDP
; Prekidna rutina za prekid
posle svakih 20 proteklih milisekundi
; izlaz: inkrementiran
brojač
x20 milisekundi <-> BX
vreme20ms PROC FAR
inc BX ;
vremex20 [ms] ++
iret
vreme20ms ENDP
; Prekidna rutina za prekid
zbog nedozvoljeno spore brzine trake
;menja: AL
trakastop PROC FAR ; traka se
zaustavila =>
mov AL, 01010000b ; prvo se ispisuje poruka na displej
out R79Data, AL ;
slovo r
mov AL, 01111011b ; slovo e
out R79Data, AL ;
mov AL, 01101101b ; slovo s
out R79Data, AL ;
mov AL, 01111011b ; slovo e
out R79Data, AL ;
mov AL, 01111000b ; slovo t
out R79Data, AL ;
halt ; blokiraj procesor
iret
trakastop ENDP
Kod ENDS
END Start
3. Električna šema