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.