Italiano - English

Programmable Interrupt Controller (PIC Intel 8259a)

Sommario

    Esercitazioni di Informatica Industriale
    1. Architettura di un sistema basato su microprocessore Intel 8086
    2. Gestione degli Interrupt su micropocessori 80/86
    3. Programmable Interrupt Controller (PIC Intel 8259a)
    4. Demo Kernel Multitasking
    5. La Porta Seriale
    6. La Porta Parallela

    Viene descritta la gestione e la riprogrammazione degli interrupt per un processore Intel 8086. Viene presentato anche il timer di sistema e il suo controllo per generare interrupt  temporizzati

     

    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


    Vota questa pagina:

    0 Commenti:

    Lascia il tuo commento:

    Note:
    • La tua email non è obligatoria e non sarà visibile in alcun modo
    • Si prega di inviare solo commenti relativi a questa pagina
    • Commenti inappropriati o offensivi saranno modificati o eliminati
    • Codici HTML non sono consentiti. Prego usare i BB code:
      [b]bold[/b], [u]underline[/u], [i]italic[/i], [code]code[/code]
    Il codice, le illustrazioni e gli esempi riportati in questa pagina sono solo a scopo illustrativo. L'autore non prende alcuna responsabilità per il loro utilizzo da parte dell'utente finale.
    Questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte.