Interfacciamento di periferiche con la porta parallela
Transcript
Interfacciamento di periferiche con la porta parallela
Interfacciamento di periferiche con la porta parallela La possibilità offerta al programmatore di realizzare programmi che possano inviare l’output verso periferiche esterne o che siano in grado di ricevere da esse un determinato input, rende le applicazioni didatticamente più efficaci. In questa unità è presentato un semplice circuito che permette di collegare dispositivi di I/O (input/output), direttamente con la porta parallela di un Personal Computer, a cui normalmente è connessa la stampante, funzionante in modalità standard (SPP). Il circuito d’interfaccia presentato lavora per semplicità con sole quattro linee di input, per l’ingresso di dati digitali a livello TTL, e con quattro linee per l’output (bufferizzate), in grado di erogare una corrente massima di 15 mA per ogni linea. Relativamente al software di gestione di tale interfaccia si utilizzerà il Visual Basic, ma è sempre possibile, per il lettore che abbia le nozioni necessarie, usare altri linguaggi ad alto livello come Q-BASIC, TURBO-PASCAL e il C, o anche il linguaggio assembly. 1 Interfaccia per porta parallela e programmi di gestione Esercitazione 1 - hardware La porta parallela denominata comunemente centronics, mette in comunicazione il PC con la periferica stampante. Essa è accessibile all’esterno del computer normalmente attraverso un connettore del tipo D a vaschetta a 25 poli femmina. Sono disponibili 8 linee per i dati (in uscita), 5 per segnali di stato (in ingresso) e 4 linee per segnali di controllo (in uscita), che permettono il colloquio tra la stampante e il computer, e altre linee, collegate a massa. Nella tabella 1 è riportato l’elenco completo dei segnali presenti sul connettore, con il relativo numero di pin e, nella figura 1, il disegno del connettore stesso. Nella tabella 1, nella colonna relativa al collegamento con il BUS DATI del PC, denominata BIT, è possibile osservare con quali bit di tale BUS sono collegati i singoli segnali della porta parallela. L’interfaccia proposta è un semplice circuito realizzato con il buffer three-state 74LS244 tenuto sempre attivo, mettendo a massa i pin di controllo (OE1 e OE2). 14 1 2 Fig. 1 Tale dispositivo aumenta la corrente che possono erogare le linee di uscita e protegge la porta parallela da eventuali collegamenti errati. Si fa presente comunque che nonostante la protezione offerta dal buffer, eventuali corto circuiti che dovessero verificarsi tra l’uscita della porta parallela del PC e l’ingresso della scheda potrebbero provocare danni ai circuiti interni del PC stesso. Si ricorda inoltre che nei moderni Personal Computer i circuiti d’interfaccia della parallela sono integrati in appositi chip CONNETTORE FEMMINA 25 POLI TIPO "D" 15 16 17 18 19 20 21 22 23 24 25 posti sulla scheda madre, che svolgono numerose funzioni. Si precisa che la modalità di trasferimento dati implementata nella scheda, pur eseguendo una trasmissione dati con quattro 3 4 5 6 7 8 9 10 11 12 13 bit per volta, non utilizza la modalità di trasferimento Nibble (VISTA FRONTALE) Mode . TAB. 1 Pin Segnale Sigla Bit SSP IN Registro OUT Indirizzo LPT1 LPT2 17 SelectIn SI D3 OUT CONTROL 37Ah 27Ah 16 IP D2 OUT CONTROL 37Ah 27Ah 14 Inizialize AutoLinefeed AF D1 OUT CONTROL 37Ah 27Ah 1 STROBE ST D0 OUT CONTROL 37Ah 27Ah 2÷9 D0 ÷ D7 11 BUSY OUT DATA 378h 278h D7 IN STATUS 379h 279h 10 ACK ACK D6 IN STATUS 379h 279h 12 Paper End PE D5 IN STATUS 379h 279h 13 Select SE D4 IN STATUS 379h 279h Error ER D3 IN STATUS 379h 279h 15 18-25 Ground GND GND Nota: le linee con casella colorata sono invertite via hardware all’interno del PC. Quelle sopralineate sono attive a livello basso. Nota: ACK = Acknowledge; IP = Inizialize Printer; SI = Select Input. Nella scheda sono usate per l’ingresso dei dati le 4 linee di stato Busy (bit D7), ACK (bit D6), PE (bit D5) e SE (bit D4) per trasferire i dati dalla periferica al computer. La linea ACK è internamente negata e quindi il bit D7, corrispondente a questa linea, deve essere negato via software dopo la lettura del dato. Per trasferire i dati dal computer alla periferica si sono utilizzate quattro delle otto linee dei dati (D3 ÷ D0). Lo schema completo del circuito è riprodotto nella figura 2. Fig. 2 L’alimentazione del buffer avviene attraverso un alimentatore esterno che deve fornire una tensione di 5 V continui e stabilizzati. La corrente che può assorbire la 74LS244 è di 24 mA (corrente di sink) mentre può fornire 15 mA (corrente di source). Pertanto, dispositivi con maggiori assorbimenti, vanno opportunamente bufferizzati. Al fine di semplificare la costruzione dell’interfaccia, viene fornita anche la riproduzione di un master in scala 1:1 (fig. 3), che permette la realizzazione di un circuito su basetta di vetronite ramata monofaccia. È previsto per il collegamento con il PC un connettore DB 25 poli maschio a piedini curvi da saldare direttamente sulla basetta. La connessione con il computer avviene poi con un cavo piatto munito di due connettori DB a 25 poli maschio (verso il computer) e femmina (verso la scheda). Nella figura 4 è rappresentato il layout della basetta visto dal lato componenti. Note relative alla realizzazione dell’interfaccia: Fig. 3 1) Il pin 1 dell’integrato corrisponde alla piazzola quadrata. 2) Eseguire con del filo rigido i due ponticelli disegnati in colore più scuro sul layout (fig. 4). 3) È opportuno porre delle morsettiere a vite sui terminali verso l’esterno, dei segnali di input, di output e delle alimentazioni (sul master è già predisposto il passo esatto) usando eventualmente connettori di tipo a due pezzi con spinotti. 4) Il collegamento con la porta stampante può essere effettuato con un cavo piatto flessibile munito di due connettori DB 25 muniti possibilmente di calotta (tipo maschio verso il PC e femmina verso la basetta). 5) Se il circuito realizzato non viene posto entro una apposita custodia, fare attenzione, durante il funzionamento, che esso non sia appoggiato su superfici conduttrici. 6) La basetta per funzionare deve essere alimentata dall’esterno con una tensione di +5 V. Non dimenticare di collegare all’alimentatore anche il terminale GND. Come verrà illustrato negli esempi successivi, al circuito realizzato possono essere collegati vari dispositivi di I/O (periferiche), su cui inviare dati (digitali a livello TTL) attraverso le 4 linee di uscita denominate OUT0, OUT1 , OUT2 , OUT3 oppure prelevare dati (digitali a livello TTL) dall’esterno attraverso le 4 linee chiamate IN3, IN4, IN5, IN6. L’operatore per poter inviare dati fuori dal Personal Computer, o leggere quelli provenienti dal mondo esterno (periferica), dovrà utilizzare particolari istruzioni che assumono caratteristiche diverse, a seconda del linguaggio con cui si sta operando. Si tenga presente che i dati inviati in uscita sulla porta parallela rimangono memorizzati e non variano fino all’invio di un nuovo dato. Fig. 4 Nel linguaggio proprio dei calcolatori viene denominata porta un canale attraverso cui ci si collega con il mondo esterno. Nel caso che si sta esaminando, si parlerà quindi di porta di output, per l’uscita dei dati, o di porta di input, per la loro lettura. In un computer sono presenti in genere diverse porte di input e di output, e quindi, per poterle distinguere l’una dall’altra è necessario assegnare ad esse degli indirizzi. Nel caso della porta parallela esaminata gli indirizzi da utilizzare sono: LPT1 379h (esadecimale) 889 (decimale) INPUT DEI DATI 378h (esadecimale) 888 (decimale) OUTPUT DEI DATI LPT2 LPT2 279h (esadecimale) 633 (decimale) INPUT DEI DATI 278h (esadecimale) 632 (decimale) OUTPUT DEI DATI Con il circuito d’interfaccia realizzato, i dati ricevuti, o quelli inviati in uscita sono formati da 4 bit, tanti quante sono le linee implementate nell’interfaccia, per l’input o l’output. Sarà quindi necessaria sempre una manipolazione del dato, per selezionare i bit interessati ed eventualmente formare un byte utilizzando due metà byte (nibble). Nella tabella 2, sono riportate le istruzioni da utilizzare nel Q-BASIC, nel TURBOPASCAL e nel TURBO C e in VISUAL BASIC per scrivere dati o leggerli. TAB. 2 Q-BASIC TURBO PASCAL TURBO C VISUAL BASIC dato = INP (&H379) il dato letto viene assegnato alla variabile dato. INPUT OUT &H378 , dato il valore presente in dato, viene inviato in uscita. OUTPUT dato := PORT [$379] il dato letto viene assegnato alla variabile dato. INPUT PORT [$378] := dato il valore presente in dato, viene inviato in uscita. OUTPUT dato = inportb(0x379) il dato letto viene assegnato alla variabile dato. INPUT outportb(0x378, dato) il valore presente in dato, viene inviato in uscita. OUTPUT Non esistono nel linguaggio istruzioni specifiche per effettuare l’INPUT e l’OUTPUT su periferiche. È necessario utilizzare un file di libreria dinamica (DLL) appositamente creato, scritto in VISUAL C o con linguaggio analogo, per svolgere le funzioni di I/O. Vedere per questo gli esempi proposti2. Nella tabella 2 gli indirizzi sono stati espressi in esadecimale secondo le notazioni proprie dei linguaggi indicati, ma si sarebbe potuto scriverli anche in decimale. Il dato da inviare o da ricevere, individuato attraverso l’identificatore dato, deve essere di tipo intero (o byte), compreso tra 0 e 255 (00h e FFh) 1. È poi evidente che di tale dato ad otto bit (1 byte), debbono essere isolati solo i bit interessati, con operazioni logiche. Se si esprime l’intero dato in binario, denominando con D0 il bit meno significativo e con D7 quello più significativo, i bit interessati nelle operazioni di ingresso ed uscita sono riportati nella tabella 1.3 indicati con un punto (•). 1 È preferibile utilizzare sempre la notazione esadecimale in quanto in tale forma rende più immediata la trasformazione di un numero dal formato esadecimale a quello binario. 2 Il file 3210F.DLL e le relative istruzioni di installazione possono essere reperite sul sito www.calderini.it, in cor- rispondenza della descrizione riferita al presente volume. TAB. 3 D7 D6 D5 D4 D3 D2 D1 D0 OUTPUT x x x x • • • • INPUT • • • • x x x x I bit contrassegnati con una x sono quelli che non hanno alcuna rilevanza. La configurazione dei bit riportata nella tabella 3 può essere rilevata direttamente dallo schema elettrico di figura 2. Per chiarire quanto detto, si fanno alcuni esempi per il Q-BASIC, il TURBO-PASCAL, TURBO C e VISUAL BASIC. ➜ Esempio 1 - Output di dati Si invii alla porta parallela in uscita un dato che abbia i seguenti bit: D3 = 1, D2 = 0, D1 = 1, D0 = 0 Si presuppone di utilizzare LPT1 con l’indirizzo 378h. Si scriva il dato in binario contrassegnando con x i bit che non interessano (D7 ÷ D4). A tali bit possono essere attribuiti indifferentemente il valore zero o uno. D7 D6 D5 D4 D3 D2 D1 D0 x x x x 1 0 1 0 0 0 0 0 1 0 Assegnando valore 0 alle x 0 1 0 A Si ha il dato 0Ah, in esadecimale, o, in decimale 10. La parte di programma relativa all’uscita del dato nei vari linguaggi è la seguente: Q-BASIC ..................... dato = &H0A OUT &H378 , dato .................... 'assegna alla variabile dato il valore 0AH • 'invia alla porta di uscita il dato preparato TURBO-PASCAL var dato : byte; ..................... dato := $0A PORT [$378] := dato .................... (*assegna alla variabile dato il valore 0AH*) (*invia alla porta di uscita il dato preparato*) TURBO C Int dato; ..................... dato = 0x0A outportb (dato, 0x378) .................... /*assegna alla variabile dato il valore 0AH*/ /*invia alla porta di uscita il dato preparato*/ VISUAL BASIC Dim dato as byte .................... dato = &H0A Call Fout (dato, &H378) .................... 'assegna alla variabile dato il valore 0AH 'invia alla porta di uscita il dato preparato Con Fout si è indicato il nome della funzione contenuta in una DLL che effettua l’operazione di output all’indirizzo indicato (378h). Dopo l’esecuzione dell’istruzione di out, le quattro linee di uscita del circuito di interfaccia assumeranno i livelli di seguito riportati: OUT3 = 1, OUT2 = 0, OUT1 = 1, OUT0 = 0 e rimarranno a tale livello, fino ad una nuova istruzione di uscita che li modifichi. ➜ ➜ Esempio 2 - Input di dati Si legga la porta parallela e si assegni ad una variabile il valore numerico che corrisponda al numero binario relativo ai livelli presenti sulle quattro linee d’ingresso (utilizzate nella scheda d’interfaccia) al momento della lettura. Nel momento che verrà effettuata la lettura delle quattro linee d’ingresso, ciascuna di esse si troverà ad un livello alto o basso che dipenderà dal modo con cui esse sono collegate con dispositivi esterni. Pertanto i valori che potremmo avere, sono tutti quelli, espressi in binario, compresi tra 00002 e 11112. Da quanto precedentemente detto, tali livelli saranno associati ai bit D7 ÷ D4. Per poter ottenere un dato significativo ad 8 bit si dovrà effettuare una traslazione dei bit D7 ÷ D4, di quattro posizioni verso destra, e, dopo, i bit D7 ÷ D4, dovranno essere posti a zero. Le operazioni possono essere schematizzate nel seguente modo: D7 D6 D5 D4 D3 D2 D1 D0 • x • x • x • x x D7 x D6 x D5 x D4 CONFIGURAZIONE DOPO L’ACQUISIZIONE 0 0 0 0 D7 D5 D4 D3 CONFIG. DOPO AZZERAMENTO DEI BIT CONFIGURAZIONE DOPO LO SHIFT Se per esempio, i bit letti dopo un’operazione di input assumono i valori seguenti: D7 = 1, D6 = 0, D5 = 1, D4 =1, si avranno le seguenti configurazioni: D7 D6 D5 D4 D3 1 x 0 x 1 x 1 x x x x x CONFIGURAZIONE INIZIALE 1 0 1 1 CONFIGURAZIONE DOPO LO SHIFT 0 0 0 0 1 0 1 1 CONFIG. DOPO AZZERAMENTO DEI BIT D2 D1 D0 e pertanto il dato acquisito assumerà il valore 0Bh (1110). È illustrata di seguito la parte di programma che esegue l’input dalla porta parallela per i vari linguaggi. Con Fin si è indicato il nome della funzione contenuta in una DLL che effettua l’operazione di input all’indirizzo indicato (379h). Si tenga presente che l’informazione ricevuta è associata, dopo la trasformazione, ai soli 4 bit di ordine basso e che il bit D3 (D7 iniziale) deve essere negato. Q-BASIC ..................... dato% = INP (&H379) dato% = dato% \ 16 dato% = dato% AND &H0F .................... 'assegna alla variabile dato il valore letto 'si trasla a destra di tre bit il dato letto 'si azzerano i 4 bit più significativi 3 TURBO-PASCAL var dato :byte; ..................... dato := PORT [$379] dato := dato shr 4 dato := dato AND $0F (*il dato ricevuto è assegnato alla variabile dato*) (*si effettua lo shift di 4 posizioni a destra*) (*vengono azzerati i quattro bit più significativi*) TURBO C Int dato; ..................... dato = inportb(0x379) dato = dato >> 4 dato := dato & 0x0F /*il dato ricevuto è assegnato alla variabile dato*/ /*si effettua lo shift di 4 posizioni a destra*/ /*vengono azzerati i quattro bit più significativi*/ VISUAL BASIC Dim dato As Byte ..................... dato = Fin(&H379) dato = dato \ 16 dato = dato AND &H0F 'il dato ricevuto è assegnato alla variabile dato 'si trasla a destra di tre bit il dato letto 'si azzerano i 4 bit più significativi ➜ 2 Unità di prova con diodi LED e interruttori antirimbalzo Esercitazione 2 - hardware I2 I1 LD1 74LS279 O1 O2 4XR Vcc = 5 V O3 O4 4XR 1 16 2 15 3 14 4 13 5 12 6 11 7 10 8 9 I3 I4 LD2 LD3 LD4 Il dispositivo proposto permette di collaudare la scheda d’interfaccia ed eseguire alcuni degli esercizi in seguito sviluppati. Può ovviamente essere adoperata al suo posto una qualsiasi unità con diodi di visualizzazione e interruttori, purché essa operi a livelli TTL. Nel circuito proposto riportato nella figura 5 è utilizzato il buffer-driver inverter TTL 7406 a collettore aperto, per accendere i LED e l’integrato 74LS279, contenente al suo interno 4 FLIP FLOP S-R, per realizzare i circuiti antirimbalzo da collegare ai deviatori. Vcc = 5 V R1 R3 R2 IN1 IN2 1 14 2 13 3 12 4 11 5 10 6 9 8 7 7406 Fig. 5 R4 Collegamenti scheda interfaccia parallela con scheda I/O (Fig. 5) IN3 IN4 R = 2.2 K R1 = R2 = R3 = R4 = 1 K INTERF. PARALLELA SCHEDA I/O INGRESSI USCITE IN0 IN1 IN2 IN3 O1 O2 O3 O4 USCITE INGRESSI OUT0 OUT1 OUT2 OUT3 IN1 IN2 IN3 IN4 3 In BASIC e VISUAL BASIC non esiste un’istruzione che effettua direttamente lo shift dei bit. Si deve ricorrere per- tanto alla divisione intera senza resto. Ogni volta che un numero viene diviso per 2, l’operazione equivale ad una traslazione di ciascun bit a destra, di una posizione. Ad ogni shift effettuato, il bit meno significativo viene perso. 3 Sonda logica con visualizzazione sul video dei livelli logici ➜ Programma 1 - Software: programma in VB Si legga la porta parallela e si controlli lo stato del bit D7. Se tale livello è alto viene visualizzato sul video un LED rosso, se è basso un LED verde. R I1 IN2 Fig. 6 Una volta posto in esecuzione il programma, con un deviatore connesso con l’ingresso IN2 con Vcc e GND della scheda d’interfaccia, collegato come rappresentato in figura 6, variare il livello dell’ingresso. Il LED raffigurato sul video deve colorarsi di rosso se il livello d’ingresso è alto e di verde se esso è basso. Nel programma in VISUAL BASIC viene effettuata una chiamata ad una libreVcc = 5 V ria dinamica DLL per implementare la funzione di input da porta parallela. Si descrivono tutti i passi necessari per realizzare il programma. Entrati nell’ambiente di VB si scelga la creazione di un nuovo progetto (EXE standard). Si inseriscano sul form visualizzato un CommandButton (Command1), due shape (shape1 e shape2), due Label (Label1 e Label2) ed il timer (Timer1) come rappresentato nella figura 7. Nella finestra delle proprietà dei singoli controlli si impostino le seguenti proprietà: • • • • • Fig. 7 Command1 - In caption scrivere il testo PREMERE QUI PER TERMINARE. Shape1 e shape2 – BorderColor nero, FillColor bianco, FillStyle solid, Shape Circle. Label1 – In caption scrivere L, Alignement center, BorderStyle none, in Font scegliere punti 10. Label2 – In caption scrivere H, Alignement center, BorderStyle none, in Font scegliere punti 10. Timer – Interval 100 (circa 100 ms). Nelle varie Sub scrivere il codice riportato nel programma 1. Prog. 1A (4M9U1P1.VBP) 'legge bit D6 della porta parallela - controlla se il bit è alto o basso 'se alto H (Higth) accende LED rosso - se basso L (Low) accende LED verde 'i LED sono simulati su video Dim X As Byte, Bit As Byte Private Sub Command1_Click() Unload Me End Sub Private Sub Timer1_Timer() X = Fin(&H379) 'LEGGE PORTA PARALLELA Bit = X And &H40 'AZZERA TUTTI BIT TRANNE D6 If Bit = 0 Then 'SE D6 E' 0 Shape1.FillColor = &H80FF80 'VERDE Shape2.FillColor = &H0 'NERO Else 'SE D6 E' 1 Shape2.FillColor = &HFF 'ROSSO Shape1.FillColor = &H0 'NERO End If End Sub Al codice scritto relativo a form1, va aggiunto un modulo contenente la dichiarazione per la chiamata della DLL. Si proceda nel seguente modo: • Dal menu dei comandi scegliere INSERISCI ⇒ MODULO. • Scegliere NUOVO ⇒ APRI. • Scrivere il codice seguente: Prog. 1B (4M9U1P1.BAS) Public Declare Function Fin Lib "32IOF.DLL" (ByVal ind_port As Integer) As Byte Public Declare Function Fout Lib "32IOF.DLL" (ByVal dato As Byte, ByVal ind_port As Integer) As Byte Ogni dichiarazione deve essere posta tutta su una stessa riga. 1) Con la finestra dove è scritto il codice del modulo attiva, salvare il modulo con il menu FILE ⇒ SALVA MODULO1 CON NOME ... attribuendogli il nome 4M9U1P1 (l’estensione .bas verrà aggiunta automaticamente). 2) Rendendo attiva poi la finestra del form salvare il form1 utilizzando il menu FILE ⇒ SALVA FORM1 CON NOME ... scegliendo il nome 4M9U1P1 (l’estensione .frm verrà aggiunta automaticamente). 3) Salvare infine il progetto utilizzando il menu FILE ⇒ SALVA PROGETTO CON NOME ... scegliendo il nome 4M9U1P1 (l’estensione .vbp verrà aggiunta automaticamente). 4) Il programma può essere messo in esecuzione con il solito procedimento (clic su 䊳). Vengono visualizzati i due LED e cambiando lo stato della linea D6 con l’interruttore si accende il LED rosso o quello verde. Si noti che: • Perché il programma funzioni correttamente la DLL 32IOF.DLL deve essere posta nella cartella C:\WINDOWS\SYSTEM. Questa libreria è adatta sia per l’input che per l’output su periferiche. Tuttavia in questo secondo caso sono abilitati, per motivi di sicurezza, solamente gli indirizzi per LPT1, LPT2 e quelli inclusi nel campo 300h ÷ 31Fh. Per evidenziare il funzionamento del programma con il sistema operativo WINDOWS XP leggere le avvertenze riportate nel ➜ Modulo 2, unità 2. • Il programma è predisposto per leggere la porta parallela LPT1. • Con lo strumento timer si ripete ogni 100 ms circa la Sub di lettura della porta parallela e la visualizzazione dello stato dei LED. L’oggetto timer non è visibile in fase di esecuzione del programma. • L’uscita dal programma si ottiene automaticamente premendo sul pulsante. Per questo scopo è utilizzata la proprietà Unload Me attivata dalla pressione sul pulsante. ➜ 4 Visualizzazione di conteggio binario su LED ➜ Programma 2 - Software: programma IN VB Si invii sulla porta parallela il contenuto di un contatore binario a 4 bit. Se alle linee di uscita OUT0 , OUT1 , OUT2 e OUT3 della porta, a cui corrispondono i bit D0 , D1 , D2 e D3 , sono collegati dei LED, viene visualizzato il conteggio effettuato via software. Per realizzare il programma in VB si procede al solito modo. 1) Aperto il progetto e creati sul Form1 due pulsanti come riportato in figura 8, si scrive nella casella caption dei due form il testo (PREMERE PER INIZIARE e PREMERE PER TERMINARE). Aggiungere poi il controllo timer. Le proprietà di timer verranno impostate con il codice. 2) Si apre poi un modulo e si scrive il codice per dichiarare la DLL (uguale a quello dell’applicazione precedente). 3) Si salva il modulo con il nome 4M9U1P2.BAS. Si scrive poi il codice relativo al Form1, riportato di seguito. 4) Si salva quindi Form1 con il nome 4M9U1P2.FRM ed infine il progetto con il nome 4M9U1P2.VBP. Fig. 8 Il programma una volta posto in esecuzione accende i LED collegati all’interfaccia secondo un conteggio binario e visualizza sul form il conteggio. L’intervallo tra le visualizzazioni è di circa un secondo. Prog. 2 (4M9U1P2.VBP) 'contatore binario per 16 su porta parallela 'accende secondo un conteggio binario 4 LED collegati alle linee 'D3 - D2 - D1 - D0 della porta parallela Private conta As Byte, I As Integer Private Sub Command1_Click() conta = 0 Timer1.Enabled = True 'Attiva il timer End Sub Private Sub Command2_Click() Unload Me End Sub Private Sub Form_Load() Timer1.Interval = 1000 'Imposta l'intervallo di Timer. Timer1.Enabled = False 'Disattiva il timer End Sub Private Sub Timer1_Timer() If conta = 16 Then 'se conta = 16 azzera contatore conta = 0 Form1.Cls End If Call Fout(conta, &H378) 'uscita sulla porta parallela Print conta; 'visualizza valore del contatore conta = conta + 1 'incrementa il contatore End Sub Si noti che: • Per evitare che il timer entri in funzione appena messo in esecuzione il programma, esso viene prima disattivato nella Sub Form_Load (assegnando alla proprietà Enabled il valore false) e poi attivato dopo aver premuto il pulsante di avvio. Si noti come, diversamente dal programma dell’esempio precedente, il valore dell’intervallo viene impostato con il codice e non nella fase di progettazione del form. • Anche questo programma utilizza la DLL 32IOF.DLL che deve trovarsi nella cartella C:\WINDOWS\SYSTEM. ➜ 5 Interfacciamento del display TIL 311 con la porta parallela ➜ Esempio 3 - Hardware Si crei un collegamento del display TIL 311 all’interfaccia della porta parallela. Il dispositivo ha integrate nel contenitore le funzioni di decodifica binario-esadecimale e di memoria. Inoltre, il display effettua la visualizzazione dei valori convertiti per mezzo di punti luminosi. Analizzando le funzioni del TIL 311 (fig. 9), si può osservare che occorrono 4 linee (D C B A) per inviare al dispositivo il dato binario compreso tra 00002 e 11112. Il decoder interno effettua la decodifica convertendolo nel corrispondente valore esadecimale (0hFh). Il pin LE (LatchEnable) abilita la memoria, permettendo di memorizzare il dato inviato. Se tale pin si trova a livello basso, il latch è trasparente, e, variando il dato in ingresso, varia anche quello visualizzato. Portato a livello alto invece avviene la memorizzazione del dato presente in tale istante sui pin d’ingresso. Sono disponibili sul chip anche due punti decimali che però debbono essere attivati con pilotaggio esterno. È inoltre disponibile un pin di input per il blanking che opera lo spegnimento del display se portato a livello alto. Vcc 1 14 Vcc IN6 B 2 13 C IN5 A 3 12 D IN4 P1 4 11 P2 IN3 LE 5 10 Vcc 6 9 OUT0 7 8 GND P1 P2 LE BI Fig. 9 OUT1 BI TIL311 CATODO PUNTO DECIMALE CATODO PUNTO DECIMALE ABILITAZIONE MEMORIA INGRESSO BLANKING OUT2 OUT3 1 14 2 B C 13 3 A D 12 4 11 5 LE 10 6 9 7 8 TIL311 GND CONNETTORE INTERFACCIA PARALLELA Disponendo nell’interfaccia per la porta parallela di sole quattro linee per i dati, esse andranno collegate ai corrispondenti pin del display (tra parentesi sono posti i numeri dei pin). OUT3 ⇒ D (pin 12), OUT2 ⇒ C (pin 13), OUT1 ⇒ B (pin 2), OUT0 ⇒ A (pin 3). La funzione di memoria deve essere disattivata, tenendo a livello basso il pin LE (pin 5). In tale maniera il dato presentato in ingresso è immediatamente convertito in esadecimale e visualizzato sul display. Se esso cambia, cambia immediatamente anche la cifra visualizzata. La funzione di latch viene comunque effettuata dalla porta parallela stessa, che mantiene memorizzato l’ultimo dato inviato in uscita con un’istruzione di output, fino a quando non viene inviato un successivo dato. Il TIL 311 deve essere poi opportunamente alimentato con una tensione continua di + 5 V, seguendo le indicazioni dello schema riportato nella figura 9. Il funzionamento del display può essere eseguito utilizzando, senza alcuna modifica, il programma 2 (visualizzazione di un conteggio binario). Adoperando il TIL 311 si disporrà di una visualizzazione in esadecimale anziché in binario. ➜ Esercizi proposti valli regolari di tempo, e si visualizzino poi sul video, o in forma grafica, o con i bit 0 e 1, i risultati ottenuti. Il numero di campionamenti del segnale che possono essere effettuati è legato alla possibile occupazione della memoria. Si scelga un’opportuna frequenza del segnale d’ingresso. Gli esercizi proposti di seguito richiedono l’utilizzazione della porta parallela opportunamente bufferizzata con la scheda di interfaccia illustrata in figura 2. 1 2 3 4 Si interfacci ad una delle linee di uscita della scheda della figura 2 un relè, opportunamente pilotato da un BJT. Al relè possono essere connessi carichi di diversa natura. Si scriva un programma che azioni in modo intermittente, attivandolo e disattivandolo, con intervalli di circa un secondo, il carico collegato con il relè (per esempio una piccola lampada alimentata a 12 V). Si colleghi ad una delle linee di ingresso della scheda della figura 2 un relè-reed e si rilevi per mezzo di un programma l’apertura e la chiusura del contatto quando ad esso è avvicinato un magnete. (Il relè deve essere collegato ad una sorgente di alimentazione a + 5 V, mettendolo in serie con un resistore.) Si colleghi ad una delle linee di ingresso della scheda della figura 2 una lamina bi-metallica e si rilevi per mezzo di un programma l’apertura e la chiusura del contatto al variare della temperatura. (Il contatto elettrico della lamina deve essere collegato ad una sorgente di alimentazione a + 5 V, mettendolo in serie con un resistore.) Si colleghi una delle linee d’ingresso della scheda della figura 2 con un generatore di segnali ad onda quadra, con uscita a livello TTL. Si scriva un programma in grado di acquisire i livelli del segale ad inter- 5 Si connettano a quattro linee d’ingresso della scheda della figura 2 altrettanti contatti magnetici, e, a due delle linee di uscita, un diodo LED verde ed uno rosso. Si scriva un programma che controlli lo stato dei sensori accendendo il diodo LED verde, se essi sono tutti chiusi, ed il LED rosso se uno dei contatti risulta invece aperto. 6 Si scriva un programma per generare un segnale con forma d’onda quadrata di assegnato periodo. La visualizzazione degli stati del segnale può essere effettuata tramite un LED collegato sulla linea di uscita dell’interfaccia OUT0, se la frequenza del segnale non è troppo elevata (al di sotto dei 10 Hz), oppure direttamente con un oscilloscopio, nel caso di frequenze più elevate. 7 Visualizzazione su 4 LED del valore binario di un numero decimale digitato da tastiera. Si invii sulla porta parallela il valore binario a 4 bit, corrispondente ad un numero decimale, compreso tra 0 e 15, digitato da tastiera. Se alle linee di uscita OUT0, OUT1, OUT2 e OUT3 della porta, a cui corrispondono i bit D0, D1, D2 e D3, sono collegati dei LED, essi si accendono o spengono, seguendo il codice binario, corrispondente al numero digitato.