PkLab.netMeccatronica |
Italy - Basilicata - Matera | ||||||
|
Home e contatti |
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)
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 ....
GLI INTERRUPT GESTITI DAL PIC
IRQ0 08h
System Timer canale 0
* 0 = priorità massima
Contenuto del registro alla porta 20h
bit = 0 per abilitare l'interrupt della perifierica
SYSTEM TIMER (PIT INTEL 8253)Application NotesE' UN TERMPORIZZATORE PROGRAMMABILE, CON TRE CONTATORI DISTINTI. CANALE 0: collegato ad IRQ0 del PIC.
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:
E' POSSIBILE RIPROGRAMMARE IL TIMER PER IMPOSTARE LA FREQUENZA CON CUI
SI DESIDERA GENERARE L'INT 08h
RIPROGRAMMAZIONE DEL PITIL PIT E' COLLEGATO ALLE PORTE40h Divisore contatore 0
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
00 11 011 0 = 36h tipico byte di controllo canale 0
ESEMPIO: Riprogrammazione del PIT
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 |