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.