8259A IT Controller ------------------- A 2011. március 29-én élőszó helyett gépelten "elhangzott" magyarázat. (Aki nem volt jelen, annak nem biztos, hogy érthető, hiányoznak a tábla rajzok és amit mégis hangosan mondtam el. Néhány helyen letisztáztam a leírtakat, de korántsem mindenhol.) Megszakításokról elvileg már volt szó. A 8085-nél van néhány megszakítás, pl. RST5.5, RST6.5, RST7.5: Ezeken kívül lehetőség van egy külső megszakításvezérlő illesztésére. Ilyen a 8259A. Kérem, nézzék a segédanyagot! Most röviden leírom, hogy milyen lábai vannak. 8db megszakítás vonala van: IR0-IR7 ezeken tehát 8 db egység képes megszakítást kérni. Ha 8-nál több megszakítást kérő egységünk van, akkor segít a KASZKÁDOSÍTÁS: Ezt bővebben nem tanuljuk, a lényege, hogy: - van egy master (erre kötjük a slave-ket) - és max 8db slave (erre kötjük a megszakítást kérő eszközöket) Így max 64 megszakítást igénylő eszközt lehet kiszolgálni. A többi lábáról: (amikor a jel nulla aktív, nem tudok felülvonást írni, azt írom utána, hogy "nem") CSnem : Chip select: ha 0, akkor van a tok kiválasztva, különben stand by D0-7: adatbusz RDnem, WRnem: perifériaként olvashatjuk, írhatjuk, a 8085' IORDnem, IOWRnem kötendő ide A0: Az A0 címbitet kell ide kötni: Ez azt jelenti, hogy a periféria 2 egymást követő portcímet foglal el!!! CAS0-2: kaszkádosításnál használjuk, a MASTER ezeken keresztül címzi meg a SLAVE-et (vegyék észre: 2 a 3-dikon az éppen 8) SPnem: ezt programozhatjuk kimentre és bemenetre is. Ha bemenetre van programozva, akkor amint az ábra alatt is látják: 0: master, 1: slave INT: ezen kéri a megszakítást a 8085-től INTAnem: ezzel jelez vissza neki a 8085 Kérdésre: OK: Az A0 nagyon speciális!!! Képzeljék el, hogy van pl. 8kB RAM: Ekkor az A15-13 címbitek mennek a dekóderre, ezekkel választjuk ki, hogy melyik 8kB-ról van éppen szó. A12-0 címbiteket belekötjük: 2 a 13-dikon az éppen 8kB: ezzel címezzük meg a bájtokat benne. Ez eddig OK? Itt meg 2 db perifériacímet foglal el a 8259A, tehát 1 db címbit kell bele: A0 Perifériacímből összesen 256 lehetséges, 8 biten címezzük őket: A7-0 Amikor 8259A-t illesztünk, akkor fogunk egy címkomparátort (lásd táblán) Például az a2h perifériacímre illesztjük: ekkor az a2h, a3h címen is őt érjük el! A 8259A-t fel kell programozni. Bizonyos információt A0=0, másokat A0=1 mellett kell beleírni!!! Ezzel tulajdonképpen két különböző címen érem el: mást jelent, ha egyik, mást jelent, ha a másik címen írok bele!!! Értiek ezt elvileg? Most megmutatom, hogy melyik MIT is jelent!!! A felprogramozása elég bonyolut, csak egy részét fogjuk tanulni!!! FONTOS, hogy: ICW: Initial Command Word -- felprogramozás, ICW1 és ICW2 mindenképpen kell!!! OCW: Operation Command Word -- működési mód megváltoztatás, csak ha kell, akkor használjuk! MIKOR van ICWx, OCWy? x, y: számok... Figyeljék meg: Kezdetben adom ki, A0=0, D4=1 : ekkor ICW1-ről beszélünk. Közvetlenül ICW1 után, A0=1: ICW2-ről van szó. Az ICW-ből kiderül, hogy lesz-e ICW3, ICW4 -- megnézzük! D0 alapján: van-e ICW4 D1 alapján: van-e több IT controller: ha nincs, akkor nincs ICW3, ha van, akkor van! A többi előtt egy kis magyarázat!!! Van vektoros megszakításkezelés, ami azt jelenti, hogy az ITC (Interrupt Controller) csak egy címet ad a CPU-nak. Ezt használja a 8085-nél fejlettebb 8086 és az összes késöbbi CPU is. A 8085 (hasonlóan az elődjéhez, a 8080-hoz) UTASÍTÁS-t vár az ITC-től: a 8085 3db INTAnem jelet ad ki, az első alatt a CALL utasítás kódját adja ki az adatbuszra a megszkításvezérlő, a 2. alatt a cím alsó bájtját, a 3. alatt a felső bájtot Honnan veszi a címet az ITC? Vajon 8db független címet tud elárolni? NEM! Adok neki egy báziscímet: ICW2-ben van felső 8 bit, és ICW1-ben még 3 bit Honnan jön a maradék A4-0??? Egyszerű: a 8 db megszakítás címe nem tetszőleges, hanem: ICW1 D2 bitjétől függően: -ha D2=1: a kezdőcímek távolsága 4 byte: IR0-nál az alsó 5 bit 00000 IR1 00100 IR2 01000 IR3 01100 ... IR7 11100 -ha D2=0: a kezdőcímek távolsága 8 byte: IR0-nál az alsó 6 bit 000000 IR1 001000 IR2 010000 IR3 011000 ... IR7 111000 Ilyenkor A5 bitnek 0-nak kell lennie, mert nem 32, hanem 64 byte az ugrási táblázat mérete. D3: mire érzékeny? Mi váltja ki a megszakítást? - szintre: az 1 szint kiváltja a megszakítást, ha vége van és még fennáll: újra kiváltja! - élre: a 0->1 átmenet vált ki megszakítást! OCW: Miután az összes ICW-t kiadtam, ha írok: A0=1-re, akkor az OCW1 A0=0-ra és D4=0, akkor OCW lesz, méghozzá, ha D3 is 0, akkor OCW2, ha D3 1 akkor OCW3! OCW1: maszkolás: amelyik helyére 1-et írok, az a megszakítás nem jön létre! (Így ki tudom válaszatani, hogy IR0-IR7 közül melyik lábon fogadok el IT-t.) OCW2-ből csak az EOI (End of Interrupt) EOI: általános EOI: az elfogadott legmagasabb priorítású interrupt vége SEOI: specifikus EOI: D2-D1 biteken mondom meg, melyik IT-nek van vége! Mi is ez az egész? Az interruptoknak prioritása van! Alapértelmezésben a legmagasabb prioritású az IR0-val kért, és a legalacsonyabb az IR7 lábon kért megszakítás prioritása. Mire jó a prioritás? - Ha egyszerre több igény van, akkor a legmagasabb prioritású jut érvényre - Ha egy megszakítást elfogadtunk és még nem jeleztük a kiszolgálásának a végét, akkor az ITC úgy tekinti, hogy az folyamatban van. VAN 2 regiszter a 8259A-ban: IRR: Interrupt Request Register: azt mutatja meg a 8 bitje, hogy melyiken van kérés ISR: Interupt Service Register: azt mutatja meg a 8 bitje, hogy melyik megszakítás aktív. Mit jelent, hogy egy megszakítás aktív? - Kérés jött, és elfogadtuk (ezt az ITC tudja: ITC jelezte a CPU-nak, és az INTAnem-mel a CPU elfogadta) - Még nincs vége az Interrupt kiszolgálásának -- Ezt vajon honnan tudja? Onnan, hogy a CPU köteles erről tájékoztatni az ITC-t: erre vannak: EOI, SEOI parancsok (OCW2) Mi csak az EOI-val foglalkozunk: a legmagasabb aktív megszakításnak van vége A prioritások állíthatók, lehet pl. körbenforgó, de mi csak az alapbeálítással foglalkozunk! Az óravázlatban kitűzött mintafeladat... KÉREM, HOGY MINDENKI OLDJA MEG ÖNÁLLÓAN, MERT SZÜKSÉGES GYAKOROLNI!!! (A hardverre egy megoldást a táblára fel is rajzoltunk.) Programban: ICW1 D4-0 bitek beállítása: D0=1: nincs ICW4 D1=1: csak egy db ITC van D2=0: 8 bájt távolság... D3=1: felfutó élre van IT D4=1: hiszen ICW1-ről van szó. ITC báziscíme 06h, tehát A0=0 esetén out 06h, A0=1 esetén out 07h kell! OCW2: EOI: Ehhez D5=1, a többi 0, azaz 20h ... ICW1 összeállítása: IT_TABL olyan címre van elhelyezve, ami 64-gyel osztható (alsó 6 bitje 0) (ezt az ORG ($+TBL_OFFS-1) AND NOT (TBL_OFFS-1) trükkel megoldottuk!) HL<-- IT_TABL után az L-ben van az alsó bájt, aminek a legutolsó 6 bitje 0 A felső bitjei kellenek, ez megy bele az ICW0-ba. bitenkénti logika VAGY-gyal hozzátesszük ICW1D40-t: előáll ICW1 ICW2 pedig a H regiszterben van (IT rutinok báziscímének felső bájtja) Szóban: Az IT rutinok eltérő része 1+2+3=6 bájtba fér bele, + 2db NOP kell... ZH: terv szerint április 12-én. Próbáltam termet foglalni du. 1-re. NEM volt! A társaságnak 12-e után melyik nap lenne jó? szerda? csütörtök? péntek? Jövő héten itt lesz nagyjából mindenki, akkor megegyezünk az pontos időpontban.