Interfacciamento del convertitore ADC0820 su porta

Transcript

Interfacciamento del convertitore ADC0820 su porta
Interfacciamento
del convertitore
ADC0820 su
porta parallela
1
Sistema hardware
Lo schema generale d’interfacciamento del convertitore con la porta parallela segue a
grandi linee quello utilizzato per l’acquisizione di dati digitali riportato nel Modulo 9,
unità 1.
Nell’interfacciamento del convertitore dell’ADC0820 con la porta parallela si è utilizzato un modo di trasferimento dati con quattro
bit per volta.
La scheda può essere utilizzata sia con le porte
parallele di vecchio tipo Centronics che con
quelle bidirezionali di nuovo tipo. In questo
caso la porta deve essere usata in modalità
standard (SSP) ed il trasferimento dati avviene
in nibble mode anche se con modalità diverse
rispetto a quelle descritte nelle specifiche IEEE
1284.
In genere per utilizzare la scheda non è necessario impostare la porta parallela in modalità
SSP in quanto nel protocollo di negoziazione
iniziale il PC rivela automaticamente che la
porta parallela non è collegata con un dispositivo bidirezionale.
Per semplificare al massimo il software di
gestione del sistema, per l’input dei dati sono
usate le quattro linee di stato D7, D6 , D5 e D4 .
La linea D7, essendo negata dall’hardware del
PC, è stata negata anche sulla scheda di interfaccia. In questo modo, il bit D7 non deve essere invertito via software.
La scheda è dotata di un doppio generatore di
tensione di riferimento, potendosi così scegliere VREF = 5,12 V o VREF = 2,56 V.
Per rendere indipendente la durata del segnale WR, utilizzato per l’avvio delle conversioni
insieme con CS dal software di gestione della
scheda, si è utilizzato un monostabile che provvede a fornire all’ADC un segnale di durata
predeterminata. Nella figura 1.1 è riportato lo
schema completo del sistema. La scheda va alimentata con una tensione di 12 V.
Fig. 1
1.1
Analisi dello schema
Nelle figure 2 e 3 sono presentati il layout della scheda e il master in scala 1:1.
• Nella figura 2 i ponticelli da realizzare sul lato componenti sono di colore scuro.
• I segnali di uscita del bus dati del convertitore sono multiplexati sulle quattro linee di
ingresso della porta parallela usando come multiplexer il buffer three-state 74LS244.
• Per avviare la conversione nel convertitore e per leggere il dato convertito i pin
dell’ADC0820 (CS, RD e WR) sono stati collegati a tre linee di controllo della porta
parallela (IP, AF e STROBE).
• Poiché la linea AF (che pilota il segnale RD) è negata (all’interno del PC) è stata negata anche sulla scheda.
• La linea STROBE pilota con il suo fronte di salita l’ingresso di un monostabile, la cui
uscita, normalmente a livello alto, fornisce in uscita un impulso (a livello basso) di
durata pari a circa 10 µs inviato sul pin WR del convertitore A/D. In questo modo, il
tempo in cui il segnale WR rimane basso è indipendente dal software di gestione del
sistema (le specifiche tecniche dell’ADC0820 affermano che il segnale WR può rimanere basso per un periodo compreso tra 600 ns e 50 µs). Essendo poi la linea STR
OBE (che attiva CS attraverso il monostabile) negata all’interno del PC, per avviare la
conversione bisogna portarla a livello basso.
Fig. 2
Fig. 3
• Infine, la linea di controllo SI abilita il multiplexer per la lettura dei quatto bit di ordine alto o basso.
• Il convertitore ADC0820, presenta una resistenza d’ingresso piuttosto alta (5 kΩ ÷ 10
kΩ), pertanto, al suo ingresso è stato collegato un operazionale con ingresso a
MOSFET (CA3140), in configurazione voltage follower, con guadagno unitario.
• La resistenza R1, posta sull’ingresso non invertente dell’operazionale, e quella collegata tra ingresso invertente ed uscita (R2), servono per proteggere il dispositivo. Esse
non hanno alcun effetto sull’amplificazione, che rimane unitaria.
• I diodi posti in ingresso sull’ADC0820 sono di protezione al convertitore.
• Con i ponticelli J1 e J2 l’ingresso analogico può essere connesso direttamente al convertitore o inviato prima all’amplificatore d’ingresso.
• Il regolatore 7805 è richiesto per alimentare i componenti che richiedono una tensione di alimentazione pari a +5 V. La piastra va invece alimentata a 12 V.
• È possibile (tab. 1.1) selezionare con i ponticelli J3 e J4 due differenti tensioni di riferimento (2,56 V o 5,12 V):
– con il trimmer multigiri R4, da 10 kΩ, e con il ponticello J3 chiuso (J4 aperto), si regola la tensione di riferimento in modo da avere sul pin 12 del convertitore (+VREF),
una tensione pari a 5,12 V rispetto a massa;
– con il trimmer multigiri R12, da 10 kΩ, e con il ponticello J4 chiuso (J3 aperto) si regola la tensione di riferimento in modo da avere sul pin 12 del convertitore (+VREF),
una tensione pari a 2,56 V rispetto a massa.
• Gli integrati LM336 −5V e LM336 −2,5V, forniscono una precisa tensione di riferimento
VREF . P1 è un connettore di tipo D, maschio, con piedini piegati, che va direttamente
saldato sulla scheda.
TAB. 1
J1 aperto
J2 chiuso
VIN diretta su convertitore
J1 chiuso
J2 aperto
VIN su amplificatore d’ingresso
J3 aperto
J4 chiuso
VREF = 2,56 V
J3 chiuso
J4 aperto
VREF = 5,12 V
Il legame tra il valore della tensione analogica acquisita e quello digitale è dato dalla
nota relazione:
VIN =
VREF × N
256
ove:
– VIN rappresenta la tensione analogica posta in ingresso (nel range 0 V ÷ + 5 V con
VREF = 5,12 V e nel range 0 V ÷ + 2,5 V con VREF = 2,56 V);
– N è il valore digitale corrispondente alla tensione d’ingresso ottenuto dopo la conversione ed espresso in formato decimale;
– VREF è la tensione di riferimento, applicata al piedino 12 del convertitore, e scelta con
i ponticelli J3 e J4.
La massima tensione analogica d’ingresso non deve superare i + 5 V rispetto a massa con
VREF = 5,12 V e 2,5 V con VREF = 2,56 V.
1.2
Codici per la conversione e lettura dato convertito
Nella tabella 2 sono riportate le connessioni tra linee di controllo e segnali del convertitore e i codici in esadecimale da usare per l’avvio della conversione e la lettura del
dato convertito.
Per semplicità, può essere omessa l’analisi delle connessioni elettriche della scheda, utilizzando semplicemente i codici riportati nella tabella 2 per l’avvio della conversione e
la lettura del dato convertito.
TAB. 2
Linee controllo
SI
IP
AF
STROBE
CODICE
D3
D2
D1
D0
1G/2G
CS
RD
WR
Avvio conversione
X (0)
0
1
0
02h
Riporta alti CS e WR
X (0)
1
1
1
07h
Linee corrispondenti bus dati PC
Linee su scheda convertitore
Predispone lettura nibble alto
1
0
0
1
09h
Predispone lettura nibble basso
0
0
0
1
01h
X (0)
1
1
1
02h
Riporta alti CS e RD
Nota: nella formazione dei codici esadecimali sono state poste a zero le linee (D7 − D4) non utilizzate.
Nella tabella 3 sono invece rappresentati gli indirizzi da utilizzare per la porta parallela
(LPT1) per l’invio dei codici di controllo verso il convertitore per mezzo delle linee di controllo, e la lettura del dato su quattro linee di stato.
TAB. 3
Segnale
STROBE
Pin
Bus dati
connet.
PC
in/out
Registro
Indirizzo
LPT1
1
D0
OUT (IN)
CONTR.
37Ah
ACK
10
D6
IN
STATO
379h
BUSY
11
D7
IN
STATO
379h
PE
Paper End
12
D5
IN
STATO
379h
SE
Select
13
D4
IN
STATO
379h
AF
AutoLinefeed
14
D1
OUT (IN)
CONTR.
37Ah
IP
Inizialize
16
D2
OUT (IN)
CONTR.
37Ah
SI
SelectIn
17
D3
OUT (IN)
CONTR.
37Ah
GND
Ground
18 - 25
Nota: i segnali sopralineati sono attivi a livello basso, quelli con caselle in grigio sono negati dall’hardware del PC.
2
SEGNALE
C
PIN
Esempi di codice nei vari linguaggi
Sono riportati di seguito esempi di codice nei più comuni linguaggi di programmazione
per avviare la conversione e leggere il dato convertito utilizzando la scheda presentata.
Le operazioni da effettuare per avviare la conversione e leggere poi il dato convertito
sono le seguenti:
1. avviare la conversione – istruzione di out su periferica all’indirizzo 37Ah con il codice
02h per portare basse le linee CS e WR del convertitore;
2. riportare alte le linee CS e WR – istruzione di out su periferica all’indirizzo 37Ah con
il codice 07h (in realtà la linea WR, pilotata dal monostabile, torna alta da sola.
L’operazione serve per riportare a livello alto la linea STROBE, oltre che IP);
3. attendere fine della conversione (circa 2 µs). Normalmente basta inserire un breve
loop di attesa;
4. predisporre lettura nibble alto – istruzione di out su periferica all’indirizzo 37Ah con
il codice 09h per portare basse le linee CS e RD del convertitore e collegare il multiplexer alle linee DB7 – DB4 del convertitore;
5. leggere nibble alto – istruzione di input su periferica all’indirizzo 379h.
6. predisporre lettura nibble basso – istruzione di out su periferica all’indirizzo 37Ah
con il codice 01h per portare basse le linee CS e WR del convertitore e collegare il
multiplexer alle linee DB3 – DB0 del convertitore;
7. leggere nibble basso – istruzione di input su periferica all’indirizzo 379h;
8. riportare alte le linee CS e RD – istruzione di out su periferica all’indirizzo 37Ah con
il codice 02h.
ASSEMBLER x86
attesa:
………………………
MOV DX,37Ah
MOV AL,02h
OUT DX,AL
MOV AL,07h
OUT DX,AL
MOV CX,0FFh
LOOP attesa
MOV AL,09h
OUT DX,AL
MOV DX,379h
IN AL,DX
AND AL,0F0h
MOV BL,AL
MOV DX,37Ah
MOV AL,01h
OUT DX,AL
MOV DX,379h
IN AL,DX
AND AL,0Fh
ADD AL,BL
MOV DX,37Ah
MOV AL,02h
OUT DX,AL
…………………..
;carica in DX indirizzo parallela (linee controllo)
;in AL codice controllo per abbassare CS e WR (STROBE)
;avvio conversione
;in AL codice controllo per rialzare CS e WR (STROBE)
;porta alte CS e WR
;carica in CX valore per ritardo attesa conversione
;attende fine conversione
;in AL codice controllo CS e RD
;abbassa CS e RD e predispone lettura DB7-DB4
;carica in DX indirizzo parallela (linee stato)
;legge nibble alto
;azzera bit D3-D0
;salva nibble alto in BL
;carica in DX indirizzo parallela (linee controllo)
;in AL codice controllo CS e RD
;abbassa CS e RD e predispone lettura DB3-DB0
;carica in DX indirizzo parallela (linee stato)
;legge nibble basso
;azzera bit D7-D4
;somma nibble alto e nibble basso – dato completo in AL
;carica in DX indirizzo parallela (linee controllo)
;in AL codice controllo per portare alti CS e RD
;rialza CS e RD
Si noti che:
• il valore caricato nel registro CX per il ciclo di ritardo può variare in base alla frequenza di clock del sistema;
• alla fine del codice scritto in AL si trova il dato ad 8 bit risultato della conversione,
volendo acquisire un nuovo dato, quello precedente va salvato in memoria;
• l’azzeramento prima dei bit D3 – D0 e poi dei bit D7 – D4, si rende necessario perché
leggendo quattro bit per volta sugli altri quattro sono presenti valori casuali.
TURBO PASCAL
var i, datoh, datol, dato :byte
………………….
port[$37A] := $02;
(*avvio conv. con uscita su porta paral. codice per abbassare CS e WR*)
port[$37A] := $07;
(*uscita su porta parallela codice per rialzare CS e linea STROBE*)
For i:=1 to 10 do
(*attende fine conversione*)
begin
end;
port[$37A] := $09;
(*porta bassi CS e RD predisponendo lettura nibble alto*)
datoh := port [$379]; (*legge nibble alto e lo pone in datoh*)
datoh: = datoh AND $F0; (*azzera bit D3-D0*)
port[$37A] := $01;
(*porta bassi CS e RD predisponendo lettura nibble basso*)
datol := port [$379]; (*legge nibble basso e lo pone in datol*)
datol := shr 4;
(*sposta i bit D7 – D4 in D3 – D0*)
datol := datol AND $0F; (*azzera bit D7-D4 *)
dato := datoh + datol; (*somma nibble alto e basso – dato completo in dato*)
port[$37A] := $02;
(*rialza CS e RD*)
…………………..
TURBO C
Int i, datoh,
datol, dato;
………………….
outportb (0x37A , 0x2); /*avvio conv. con uscita su porta paral. codice per abbas. CS e WR*/
outportb (0x37A , 0x7); /*uscita su porta paral. codice per rialzare CS e linea STROBE*/
for (i =1; i = 10; i++); /*attende fine conversione*/
outportb (0x37A , 0x9); /*porta bassi CS e RD predisponendo lettura nibble alto*/
datoh = inportb (0x379); /*legge nibble alto e lo pone in datoh*/
datoh: = datoh & $F0;
/*azzera bit D3-D0*/
outportb (0x37A , 0x1); /*porta bassi CS e RD predisponendo lettura nibble basso*/
datol = inportb (0x379); /*legge nibble basso e lo pone in datol*/
datol >> 4;
/*sposta i bit D7 – D4 in D3 – D0*/
datol = datol & $0F;
/*azzera bit D7-D4 */
dato = datoh + datol;
/*somma nibble alto e basso – dato completo in dato*/
outportb (0x37A , 0x2); /*rialza CS e RD*/
…………………
VISUAL BASIC
Dim i As Byte, datoh As Byte, datol As Byte, dato As Byte
Private Sub Form_Load()
…………………
Call Fout(&H2, &H37A)
'avvio conv. con uscita su porta paral. codice per abbas. CS e WR
Call Fout(&H7, &H37A)
'uscita su porta parallela codice per rialzare CS e linea STROBE
For i = 1 To 10
'attende fine conversione
Next i
Call Fout(&H9, &H37A)
'porta bassi CS e RD predisponendo lettura nibble alto
datoh = Fin(&H379)
'legge nibble alto e lo pone in datoh
datoh = datoh And &HF0
'azzera bit D3-D0
Call Fout(&H1, &H37A)
'porta bassi CS e RD predisponendo lettura nibble basso
datol = Fin(&H379)
'legge nibble basso e lo pone in datol
datol = datol \ 16
'sposta i bit D7 - D4 in D3 - D0
datol = datol And &HF
'azzera bit D7-D4
dato = datoh + datol
'somma nibble alto e basso - dato completo in dato
Call Fout(&H2, &H37A)
'rialza CS e RD
…………………..
End Sub
Si noti che si deve aggiungere il modulo con la dichiarazione delle funzioni di I/O e la
DLL 32IOF.DLL in Windows/System.