1 Capitolo Interfacciamento di periferiche I/O con il PC 1.1 Il BUS di espansione del PC 1.2 Interfacciamento di periferiche I/O con il PC, con dispositivi non programmabili 1.3 Istruzioni per leggere o scrivere un dato su una periferica 1.4 Interfacciamento di periferiche I/O con il PC, con dispositivi programmabili PPI 8255 . Interfacciamento di periferiche I/O con il PC INTERFACCIAMENTO DI PERIFERICHE CON IL PC 1.1 IL BUS DI ESPANSIONE DEL PC Ogni PC è dotato di un Bus di espansione su cui l'utente può inserire le proprie schede. Questo bus di espansione ha subito dalla sua nascita notevoli trasformazioni si à passati dal Bus tipo XT a quello AT (detto anche ISA), al VESA , al PCI, all’AGP , USB, ecc. Nei moderni PC, anche se sono implementati i nuovi tipi di bus, tuttavia è ancora presente un connettore di tipo ISA in cui è possibile inserire anche schede di tipo XT. Il Bus ISA è costituito da due connettori, il primo 31+31 pin che implementa il BUS XT e l'altro a 18+18 pin con segnali propri del BUS ISA. 1.1.1 PRINCIPALI SEGNALI DEL BUS XT Il Bus XT fu realizzato per operare in sistemi in cui era presente il µP 8088/8086. I principali tipi di segnali adoperati per l'interfacciamento di periferiche I/O sono: • A0÷A19 Bus indirizzi: sono 20 linee di trasmissione unidirezionali (dal µP verso l'esterno), dove transitano gli indirizzi. • D0÷D7 Bus dati: sono otto linee di trasmissione bidirezionali che consentono di inviare o ricevere una parola di 8 Bit. • IOR\ I/O Read (lettura): il segnale, attivo a livello basso, è utilizzato per effettuare una operazione di lettura di un dato posto sulle linee D0-D7 da un dispositivo esterno. Sostituisce l'insieme dei segnali RD\ e IO/M\ presenti sul BUS della CPU • IOW\ I/O Write (scrittura): tale segnale, attivo a livello basso, indica al dispositivo esterno che la CPU vuole effettuare, attraverso le linee D0-D7 , la scrittura di un dato su di esso. Sostituisce l'insieme dei segnali WR\ e IO/M\ presenti sul BUS della CPU • AEN: Enable (abilitazione dell'indirizzo): attivo a livello alto Indica che il bus è impegnato per operazioni di DMA. Quindi. poiché durante le operazioni di lettura o scrittura su periferiche il BUS non deve essere impegnato con le operazioni di DMA, esse si considerano valide se AEN si trova a livello basso • +5V ±12V Tensioni stabilizzate, che potremmo usare per alimentare una eventuale scheda di interfacciamento. Prof. Francesco Di Sabatino - Dispense di Sistemi Elettronici Automatici I-2 Interfacciamento di periferiche I/O con il PC 1.2 INTERFACCIAMENTO DI PERIFERICHE DISPOSITIVI NON PROGRAMMABILI I/O CON IL PC CON Per collegare una periferica di input ( ad es. interruttori, convertitore A/D) al bus dati, si fa uso di un buffer tree-state (ad es. il C.I. 74LS244), il quale state viene abilitato dal circuito di decodifica (decoder address). Mentre per collegare invece una periferica di output (ad es. Led , convertitore D/A, display) al bus dati, si fa uso i di un D-FF (ad es. il C.I. 74LS374), il cui clock è comandato anche esso dal circuito di decodifica. Ciò si rende necessario in quanto la periferica non può essere collegata permanentemente al Bus Dati, ma deve essere collegata soltanto quando essa selezionata. Per l'indirizzamento di periferiche di I/O realizzate dall’utente è riservato un campo di indirizzi compresi da 300H a 31FH, per non interferire con le altre periferiche del PC. Un tipo schema a blocchi per l’interfacciamento di periferiche I/O è il seguente Dalla periferica di ingesso Alla periferica di uscita Note sul circuito di decodifica Per effettuare la selezione di un dispositivo periferico si utilizza in genere insieme alle linee indirizzo, anche il segnale AEN, IOR per le periferiche di input, IOW per le periferiche di output. In tabella è riportato lo stato dei segnali durante la lettura o scrittura su periferiche. AEN L L IOW H L IOR L H Lettura Scrittura Prof. Francesco Di Sabatino - Dispense di Sistemi Elettronici Automatici I-3 Interfacciamento di periferiche I/O con il PC 1.3 • ISTRUZIONI PER PERIFERICA LEGGERE O SCRIVERE UN DATO SU UNA SCRITTURA (TRASMISSIONI DATI AD UNA PERIFERICA) L’istruzione OUT sia in Assembler che in Basic e outp in C++, consente di scrivere un dato su una periferica. Esempio. Supponendo di voler accendere solo i led dispari collegati alla Porta B, il cui indirizzo è 301H Il dato da inviare è 10101010 = 55h Le istruzioni sono: IN ASSEMBLER MOV AX, 55 h MOV DX, 301h OUT DX, AX outp (0x301, 0x55); OUT &H301, &H55 ‘carica il dato da inviare alla periferica nel registro AX ‘ carica l’indirizzo che seleziona la periferica nel registro DX ‘ invia il dato posto in AX alla periferica.. il cui indirizzo è posto in DX. IN C++ ' trasmette il dato (55h) alla periferica il cui indirizzo è 301h IN BASIC ' trasmette il dato (55h) alla periferica il cui indirizzo è 301 . Prof. Francesco Di Sabatino - Dispense di Sistemi Elettronici Automatici I-4 Interfacciamento di periferiche I/O con il PC • LETTURA ( RICEZIONE DATI DA UNA PERIFERICA). Es. Supponendo di voler leggere lo stato di 8 interruttori collegati alla Porta A il cui indirizzo è 300H Le istruzioni sono: MOV DX, 300h IN AL, DX IN ASSEMBLER 'carica l'indirizzo (300h) che seleziona la periferica nel registro DX 'carica nel registro AL il dato proveniente dalla periferica (l’indirizzo che seleziona la periferica è posto in DX IN C++ (bisogna caricare la libreria dos.h) N = inp(0x300); N=INP(&H300) ‘assegna alla variabile N, il dato proveniente dalla periferica il cui indirizzo è 300H. IN BASIC ‘assegna alla variabile N, il dato proveniente dalla periferica il cui indirizzo è 300H. . Prof. Francesco Di Sabatino - Dispense di Sistemi Elettronici Automatici I-5 Interfacciamento di periferiche I/O con il PC 1.4 INTERFACCIAMENTO DI PERIFERICHE I/O CON IL PC, CON DISPOSITIVI PROGRAMMABILI PPI 8255 Generalità: La PPI 8255 (Programmable Peripheral Interface), è stata progettata per interfacciare periferiche I/O con i microprocessori INTEL della famiglia 80XXX, ed è in grado di gestire 3 porte (port) (PA, PB, PC) a 8 linee TTL compatibili, che possono essere programmate come input o come output (queste ultime dotate di latch). Schema a blocchi Interfaccia I/O con PPI8255 col Bus del PC. Scegliendo come indirizzo base dell’address decoder (decodificatore d’indirizzi) ad es.300H (11 0000 0000), gli indirizzi con i quali si possono chiamare i port risultano dal data sheet della PPI 8255: indirizzo base+0 300H port A indirizzo base+1 301H port B indirizzo base+2 302H port C indirizzo base+3 303H registro di controllo Prof. Francesco Di Sabatino - Dispense di Sistemi Elettronici Automatici I-6 Interfacciamento di periferiche I/O con il PC 1.4.1 ESEMPIO DI PROGRAMMAZIONE DELL’INTERFACCIA CON PPI8255. (INDIRIZZO BASE DELL’INTERFACCIA 300H) Si vuole programmare la PPI nel seguente modo: port A = input, port B = output, port C = input. Avendo ipotizzato che l’indirizzo base dell’interfaccia sia 300h , l’indirizzo per accedere al registro di controllo risulta (300+3)h Per programmare la PPI8255 nel modo richiesto, bisogna scrivere nel registro di controllo(Control Register) la parola di controllo (WORD CONTROL). La parola di controllo si ricava dal data sheet della PPI8255; nel nostro caso essa vale 99h PROGRAMMAZIONE DELLA PPI 8255 IN ASSEMBLER MOV AX, 99H ' carica la parola di controllo 99H nel registro AX ' carica l’indirizzo del registro di controllo 303H nel registro DX ' invia la parola di controllo caricata nel registro AX al registro di controllo, il cui indirizzo è posto in DX. MOV DX, 303H OUT DX, AX PROGRAMMAZIONE DELLA PPI8255 IN C++ Oupt(0x303, 0x99); // invia la “word control “ (99H) al “control register” il cui indirizzo è 303H. PROGRAMMAZIONE DELLA PPI8255 IN BASIC OUT &H303, &H99 ' invia la “word control “ (99H) al “control register” il cui indirizzo è 303H Prof. Francesco Di Sabatino - Dispense di Sistemi Elettronici Automatici I-7 Interfacciamento di periferiche I/O con il PC 1.4.3. ESEMPIO DI SCRITTURA SULLA PORTA PB Supponiamo di mandare alla porta B il cui indirizzo è 301H la seguente parola: (F7H) PB7 1 PB6 1 PB5 1 PB4 1 PB3 0 PB2 1 PB1 1 PB0 1 IN ASSEMBLER MOV AX, 99 H MOV DX, 303H OUT DX, AX Programmazione PPI8255 port A = input, port B = output, port C = input. MOV AX, F7H MOV DX, 301H OUT DX, AX outp(0x303, 0x99); IN C++ // Programmazione PPI8255 port A = input, port B = output, port C = input. outp(0x301, 0xF7); OUT &H303, &H99 IN BASIC Programmazione PPI8255 port A = input, port B = output, port C = input. OUT &H301, &HF7 Prof. Francesco Di Sabatino - Dispense di Sistemi Elettronici Automatici I-8 Interfacciamento di periferiche I/O con il PC 1.4.5 ESEMPIO DI LETTURA DEL DATO PRESENTE SULLA PORTA PA (INDIRIZZO PORTA A 300H) MOV AX, 99 H MOV DX, 303H OUT DX, AX IN ASSEMBLER Programmazione PPI8255 port A = input, port B = output, port C = input. MOV DX, 300H IN AL, DX outp(0x303, 0x99); IN C++ Programmazione PPI8255 port A = input, port B = output, port C = input. N = inp(&H300); OUT &H303, &H99 IN BASIC Programmazione PPI8255 port A = input, port B = output, port C = input. N = INP(&H300) Prof. Francesco Di Sabatino - Dispense di Sistemi Elettronici Automatici I-9