PkLab.net
Meccatronica
Italy - Basilicata - Matera
 
Robotica&Image processing Sistemi di controllo Applicazioni speciali Networking Didattica
 
Home e contatti
PORTE DI Input/Output su Intel 8086/88

PROGRAMMABLE INTERRUPT CONTROLLER (PIC intel 8259A)

Nota: questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte

Application Notes

COLLEGA LE PERIFERICHE ALLA LINEA INTR DELLA CPU

LE PERIFERICHE INVIANO LE RICHIESTE DI CALCOLO AL PIC. QUESTO LE ORDINA PER IMPORTANZA (PRIORITA) ED INVIA UN INTR ALLA CPU. QUESTA CHE ESEGUE LA ROUTINE DI SERVIZIO PER L'INTR RICHIESTO, SE IL IF E' ABILITATO. IL TERMINE DELL'INTERRUPT DEVE ESSERE COMUNICATO AL PIC CHE DEVE LIBERARE LA LA LINEA INTR QUINDI LA CPU.

IL PIC DISPONE DI DUE REGISTRI AGLI INDIRIZZI DI I/O:

20h per segnalazione di fine interupt (EOI)
21h registro degli interrupt gestiti

quando nel registro 20h viene scritto 20h viene liberata la linea INTR.

Di seguito viene riportata la tipica conclusione di una routine di servizio per un interrupt generato dal PIC

    ....
    out 20h,20h ;EOI
    iret


GLI INTERRUPT GESTITI DAL PIC


Priorita* Interrupt  Periferiche

IRQ0         08h     System Timer canale 0
IRQ1         09h     Tastiera (no su PCjr)
IRQ2         0Ah     CGA (no su PCjr)
IRQ3         0Bh     Com 2 (com su PCjr)
IRQ4         0Ch     Com 1
IRQ5         0Dh     Hard Disk (PC e XT)Com 2 (AT e PS/2)
IRQ6         0Eh     Floppy Disk
IRQ7         0Fh     Stampante (porta par. 1)

* 0 = priorità massima


Contenuto del registro alla porta 20h


7 6 5 4 3 2 1 0  byte in 20h
+-+-+-+-+-+-+-+
| | | | | | | +-- IRQ0-timer
| | | | | | +--------- IRQ1-tastiera
| | | | | +--------------- IRQ2-CGA
| | | | +--------------------- IRQ3-COM2
| | | +--------------------------- IRQ4-COM1
| | +--------------------------------- IRQ5-Hard Disk
| +--------------------------------------- IRQ6-Floppy Disk
+--------------------------------------------- IRQ7-Stampante

bit = 0 per abilitare l'interrupt della perifierica
bit = 1 per disabilitare l'interrupt della periferica


SYSTEM TIMER (PIT INTEL 8253)

Application Notes

E' UN TERMPORIZZATORE PROGRAMMABILE, CON TRE CONTATORI DISTINTI.

CANALE 0: collegato ad IRQ0 del PIC.
CANALE 1: riservato ai cicli di refresh della RAM
CANALE 2: disponibile per uso generale

Il timer si basa su un clock interno a 4.77MHz che viene diviso per 4 per ottenere la frequenza fondamentale di 1.19318 MHz.

Ogni canale ha un registro a 16 bit che viene decrementato ad ogni impulso della fondamentale.

Quando il registro di un canale diventa 0 il canale produce un impulso verso l'esterno.

PER RIPROGRAMMARE UN CANALE DEL TIMER BISOGNA CAMBIARE IL CONTENUTO DEL SUO REGISTRO CONTATORE (DIVISORE).

Ponendo nel registro contatore del canale 0 il numero 10, si ha che il canale 0 emette un impulso ogni 10 periodi della frequenza fondamentale quindi circa a 120kHz

1.19318MHz / 10 = 119.318kHz

Dato che il canale 0 è collegato ad IRQ0, si ha che ad ogni impulso del canale viene generato un int 08H.

Il bios pone nel divisore del canale 0 il numero FFFFh

1,193,180 / 65535 = 18.2 cicli al secondo (55ms)

Il canale 0 genera un interrupt su IRQ0 (int 08h) ogni 55ms.

L'INT 08h esegue diversi compiti:

  • tiene il conto del numero di INT 08 avvenuti dall'accensione (system timer)
  • decrementa un contatore per il controllo del floppy disk. Quando 0 allora motor off
  • chiama INT 1Ch, che per default non fà nulla


E' POSSIBILE RIPROGRAMMARE L'INT 08h PER PRENDERE IL CONTROLLO DELLA CPU AD INTERVALLI REGOLARI, INDIPENDENTEMENTE DA QUELLO CHE SI STA' ESEGUENDO.

E' POSSIBILE RIPROGRAMMARE IL TIMER PER IMPOSTARE LA FREQUENZA CON CUI SI DESIDERA GENERARE L'INT 08h


RIPROGRAMMAZIONE DEL PIT

IL PIT E' COLLEGATO ALLE PORTE

40h Divisore contatore 0
41h Divisore contatore 1
42h Divisore contatore 2
43h Registro di Controllo

Il divisore relativo alla frequenza desiderata è dato:

divisore = 1,193,180 Hz / freq desiderata Hz

Un divisore è da 2 byte. Le porte sono da 1 byte


Registro di controllo PORTA 43h


¦7¦6¦5¦4¦3¦2¦1¦0¦  byte della porta 43h
¦ ¦ ¦ ¦ ¦ ¦ +------------ tipo di conteggio
¦ ¦ ¦ ¦ ¦ ¦                0= binario
¦ ¦ ¦ ¦ ¦ ¦                 1= BCD
¦ ¦ ¦ ¦ +---+------ modo contatore
¦ ¦ ¦ ¦             000 = 0 modo attesa
¦ ¦ ¦ ¦             001 = 1 impulso programmabile
¦ ¦ ¦ ¦             010 = 2 gen. di frequenza
¦ ¦ ¦ ¦            011 = 3 gen. onda quadra
¦ ¦ ¦ ¦             100 = 4 consenso sw
¦ ¦ ¦ ¦             101 = 5 consenso hw
¦ ¦ +-+-------- lettura / scrittura
¦ ¦             00 = salva contatore
¦ ¦             01 = solo MSB
¦ ¦             10 = solo LSB
¦ ¦            11 = prima LSB poi MSB
+-+--------- selezione canale
            00 = contatore 0
             01 = contatore 1
             10 = contatore 2

00 11 011 0 = 36h tipico byte di controllo canale 0


ESEMPIO: Riprogrammazione del PIT


count DW 59659 ;un int ogni 5ms
....
nuova routine gestione int 08h
....
cli                ;INTR OFF
mov     al,36h     ;byte di controllo
out     43h,al     ;imposto PIT canale 0 onda quadra
jmp     $+2        ;salta a istr. succ. (ritardo)
mov     cx,count   ;
mov     al,cl      ;carico LSB
out     40h,al     ;invio LSB al contatore
jmp     $+2        ;salta a istr. succ. (ritardo)
mov     al,ch      ;carico MSB
out     40h,al     ;invio MSB al contatore
jmp     $+2        ;salta a istr. succ. (ritardo)
sti                ;INTR ON

cambiando la frequenza sul canale 0 cambia la frequenza con cui viene attivato INT 08h.

Questo non tiene conto della variazione avvenuta.

Per conservare la correttezza delle operazioni effettuate da INT 08h, è necessario intercettarlo.

IL NUOVO INT 08H DEVE CHIAMARE IL VECCHIO OGNI 55ms

IL NUOVO PERIODO PER IL CANALE 0 DEVE ESSERE UN SOTTOMULTIPLO DI 55ms

IL NUOVO PERIODO PER IL CANALE 0 DEVE ESSERE SUPERIORE DELLA DURATA DEL NUOVO+ IL VECCHIO INT 08


Esempio:

Riprogrammazione del CLOCK di sistema per generare un orologio da visualizzare a schermo.

In queso esempio viene modificata la frequenza con cui viene generato l'int 08H in modo da ottenere un int ogni 5ms.

Viene riprogrammato l'int08H in modo da contare quanti tick vengono generati e quanto vengono raggiunti 120 tick (quindi 120x5ms = 1000ms=1s) viene fatto avanzare il contatore dei secondi ed aggiornato l'orologio.

La nuova routine di interrupt conta anche quando sono passati 11 tick (quindi 55ms) per svolgere le funzioni associate al vecchio INT 08H e mantenere correttamente il sistema

newclock.c



Il PKLAB aderisce ai principi Open Access della Dichiarazione di Berlino (Sito italiano)
[Home Page]  [System Control]   [Robotic & Image processing]   [Applicazioni Speciali]  [Didattica]   [Networking]   [Search]

Contatto:
Valid CSS!