Disposizione e funzioni pin porta parallela

Specifiche tecniche

Descrizione dei segnali(pinout)

Registri

Verifica interfaccia parallela

La porta parallela come dispositivo generale di i/o

Programmazione porta parallela

Basic

Pascal

C

Assembler

Gestione MPX 5 input

Gestione MPX 4input

Applicazioni

Programmazione

Non è uno standard: permette di collegare al PC stampanti con interfaccia parallela. I segnali di I/O sono disponibili sul retro del PC attraverso un connettore di tipo D a vaschetta a 25 pin femmina.

Disposizione e funzioni pin porta parallela

PC Pin N°

I/O

Funzione

Indirizzo

Posizione

Descrizione

1

O

-STROBE

037A

-bit 0

Sincronizza il trasferimento

2

O

D0

0378

bit 0

Dato trasferimento (LSB)

3

O

D1

0378

bit 1

Dato da trasferire

4

O

D2

0378

bit 2

Dato da trasferire

5

O

D3

0378

bit 3

Dato da trasferire

6

O

D4

0378

bit 4

Dato da trasferire

7

O

D5

0378

bit 5

Dato da trasferire

8

O

D6

0378

bit 6

Dato da trasferire

9

O

D7

0378

bit 7

Dato da trasferire (MSB)

10

I

-ACK

0379

bit 6

Conferma ricezione

11

I

BUSY

0379

-bit 7

Stampante occupata

12

I

PE

0379

bit 5

Fine carta

13

I

SLCT

0379

bit 4

Stampante selezionata (ON_LINE)

14

O

-AUTOFD

037A

-bit 1

Avanzamento riga automatica

15

I

-ERROR

0379

bit 3

Errore hardware

16

O

-INIT

037A

bit 2

Inizializza la stampante

17

O

-SLCT IN

037A

-bit 3

Seleziona la stampante

18¸ 25

 

GND

     

Il connettore a 25 pin è differente dal normale connettore a 36 pin previsto per le stampanti dallo standard centronics. L'opportuno cavo di collegamento provvede a collegare i due secondo le modalità indicate in tabella.

 

Collegamento pc-stampante

25-PIN

36-PIN

SEGNALE

PC

PRINTER

 

1

1

-STROBE

2

2

D0

3

3

D1

4

4

D2

5

5

D3

6

6

D4

7

7

D5

8

8

D6

9

9

D7

10

10

-ACK

11

11

BUSY

12

12

PE (Paper Empty)

13

13

SELECT

14

14

-AUTO FEED XT

15

32

-ERROR

16

31

-INIT (INITialize)

17

36

-SELECT IN

18-25

15-17

GND (GrouND)

 

19-30

GND


Nel trasferimento dati verso una stampante i comandi o i dati sono caricati in un registro di otto bit, mandati sulla porta di uscita e contemporaneamente è abilitata una linea di STROBE per trasferire i dati nella periferica. Il programma può leggere la porta d’ingresso per ottenere le informazioni di stato, indicanti quando il successivo carattere può essere trasferito. La porta di uscita può essere letta tramite un'opportuna porta d’ingresso situata sull'interfaccia per operazioni di diagnostica. Questo permette di isolare eventuali problemi di collegamento con la stampante.
Le due porte parallele del PC rispondono ai seguenti indirizzi.

LPT1
378H..37FH
378H DATA PORT
379H STATUS PORT
37AH CONTROL PORT
LPT2
278H..27FH
278H DATA PORT
279H STATUS PORT
27AH CONTROL PORT
 

Specifiche tecniche

 

Descrizione dei segnali(pinout)

Si fa riferimento al connettore a 36 pin della stampante.

 

Registri

L'interfaccia parallela per la stampante risponde a cinque registri interni che possono essere scritti o letti mediante istruzioni di I/O.

  1. Output: data byte verso la stampante .
  2. Output: segnali di controllo verso la stampante.
  3. Input: segnali di stato della stampante.
  4. Input: data byte generato.
  5. Input: segnale di controllo generato.

Le due ultime operazioni d’input servono solo per la lettura dei dati generatori per la verifica degli stessi. I registri previsti sono dettagliatamente analizzati di seguito con la corrispondenza tra i bit di dati e i segnali sull'interfaccia del PC.

Output data byte: indirizzo 378H

D7

D6

D5

D4

D3

D2

D1

D0

Otto linee di uscita del byte del carattere da stampare, sono dotate di latch (in altre parole mantengono l’ultimo dato scritto) e possono anche essere lette allo stesso indirizzo, ma allora restituiscono il dato memorizzato dal latch.
Il significato dei bit è il seguente.

bit
0
1
2
3
4
5
6
7
segnale
D0
D1
D2
D3
D4
D5
D6
D7
pin
2
3
4
5
6
7
8
9

Output segnale di controllo: indirizzo 37AH


XXXX


XXXX


XXXX


IRQ


SLCTIN

INIT


AUTOFD


STROBE

Quattro linee di controllo in uscita, dotate di latch, che servono ad inviare comandi di handshake e controllo alla stampante.

bit
0
1
2
3
4
5
6
7
segnale
-strobe
-auto feed xt
init
-select in
irq enable
riservato
riservato
riservato
pin
1
14
16
17



Bisogna tenere presente che sono emessi in forma negata.

Input segnali di stato: indirizzo 379H


BUSY


ACK


PE


SLCT


ERROR


XXXX


XXXX


XXXX

Cinque linee di controllo in ingresso che servono per leggere lo stato della stampante .
Sono le uniche linee utilizzabili in input.

bit
0
1
2
3
4
5
6
7

segnale
riservato
riservato
riservato
error
select
pe
ack
-busy

pin



15
13
12
10
11

Bisogna tenere presente che BUSY è acquisito in forma negativa, in pratica è letto 1 quando la linea è a 0 e viceversa.

 

 

Verifica interfaccia parallela

Un malfunzionamento sull'interfaccia parallela non pregiudica il funzionamento base del PC. Un guasto di questo tipo è individuato solamente quando si utilizza l'interfaccia stessa collegando una stampante o altri dispositivi di tipo parallelo. Diventa pertanto difficile poter operare un test sull'interfaccia parallela senza disporre di periferiche da collegare. Il PC possiede internamente una serie di dispositivi che permettono in qualche modo una verifica interna di funzionamento corretto. Nel seguito questa verifica sarà condotta direttamente sul connettore di uscita. Sarà verificata, tramite comandi in BASIC, la correttezza delle varie linee di segnale. Si faccia riferimento al connettore dell'interfaccia parallela. Le linee presenti possono essere divise in tre gruppi e per ogni gruppo si procede in modo differente.

LINEE DATI
Per il test sulla correttezza di queste linee si proceda scrivendo un programma che provvede a generare una sequenza di livelli logici 1 (+5 V) e si verifichi con un tester la correttezza del livello del segnale.
10 FOR I%=0 TO 7
20 OUT (&H378),2^I% 'out dato
30 IF INKEY$="" THEN 30 'premere un tasto per proseguire
40 NEXT I%

LINEE DI USCITA
STROBE: segnale impulsivo.
10 OUT (&H37A),0
20 FOR J=1 TO 100:NEXT
30 OUT (&H37A),1
40 FOR J=1 TO 100:NEXT
50 GOTO 10
INIT: segnale impulsivo.
10 OUT (&H37A),0
20 FOR J=1 TO 100:NEXT
30 OUT (&H37A),4
40 FOR J=1 TO 100:NEXT
50 GOTO 10
SELECT IN: segnale fisso.
OUT (&H37A),0 'segnale a "0"
OUT (&H37A),8 'segnale a "1"
AUTO FEED XT: segnale fisso.
OUT (&H37A),0 'segnale a "0"
OUT (&H37A),2 'segnale a "1"

LINEE D’INGRESSO
Si scrivano dei semplici programmi di monitoraggio di queste linee, si colleghino le stesse rispettivamente a massa (0 V) o a +5 V e si verifichi il funzionamento.

ACK
10 DATO%=INP (&H379)
20 PRINT DATO% AND 2^6
30 GOTO 10
BUSY
10 DATO%=INP (&H379)
20 PRINT DATO% AND 2^7
30 GOTO 10
PE
10 DATO%=INP (&H379)
20 PRINT DATO% AND 2^5
30 GOTO 10
SELECT
10 DATO%=INP (&H379)
20 PRINT DATO% AND 2^4
30 GOTO 10

 

La porta parallela come dispositivo generale di i/o

La porta parallela possiede dodici linee di uscita a livello TTL, con latch, che possono essere scritte e lette sotto controllo del programma usando operazioni IN e OUT. Inoltre sono presenti cinque linee d’ingresso che possono essere lette usando operazioni di IN. In aggiunta, una linea d’ingresso può anche essere usata per generare un’interruzione al microprocessore (pin 10 ACK).
La porta parallela quindi può essere usata anche per l’acquisizione di dati a velocità medio bassa: diventa allora bidirezionale consentendo non solo la trasmissione parallela di otto bit per volta, ma anche la loro ricezione. La rivitalizzazione dell’interfaccia parallela come mezzo di scambio tra PC e mondo esterno è stata conseguenza del boom dei notebook e da alcuni lettori di CD-ROM esterni.
Le linee di dati sono collegate al connettore tramite un buffer latch le cui uscite, tramite un ulteriore buffer, possono essere rilette in ingresso.
Questa organizzazione, consentendo di rileggere l'ultimo dato in uscita, favorisce la diagnostica, ma condiziona la lettura dall'esterno tramite connettore. Infatti i bit dell'ultimo carattere inviato in uscita condizionano quelli eventualmente predisposti all'esterno sul connettore.
Quanto detto riguarda i valori d'uscita con degli zero. Si supponga infatti che sia stato inviato in uscita il carattere F0H e che invece in ingresso sia impostato il carattere 0FH. Le linee di uscita con il valore zero comporterebbero in lettura valori ambigui o farebbero risultare come zeri quei bit che sono stati impostati come uni.
Per ovviare a ciò bisogna fare precedere le operazioni d’input all'indirizzo 378H da un OUT, allo stesso indirizzo, con il valore FFH, in modo da forzare le uscite del latch allo stato alto, eliminando ogni interferenza.
Un altro accorgimento utile per l'uso generico della porta parallela è quello di disaccoppiare, mediante buffer e latch esterni, i dispositivi collegati al connettore, o comunque di utilizzare delle resistenze sulle linee di uscita che limitino la corrente erogata ai valori consentiti di 2.6 mA max, resistenze di 2.2K
W possono anche bastare.
Collegamento parallelo-parallelo tra due PC

SEGNALE
D0
D1
D2
D3
D4
-ACK
BUSY
PE
SELECT
-ERROR
GND
DB25 MASCHIO
2
3
4
5
6
10
11
12
13
15
25

DB25 MASCHIO
15
13
12
10
11
5
6
4
3
2
25

SEGNALE
-ERROR
SELECT
PE
-ACK
BUSY
D3
D4
D2
D1
D0
GND
 

Programmazione porta parallela

1. MS-DOS: comando MODE.
2. C: function biosprint

#include <stdio.h>
#include <conio.h>
#include <bios.h>
#define STATUS 2 /* printer status command */
#define PORTNUM 0 /* port number for LPT1 */
int main(void)
{ int status, abyte=0;clrscr();
printf("Please turn off your printer. Press any key to continue\n");getch();
status = biosprint (STATUS, abyte, PORTNUM);
if (status & 0x01) printf("Device time out.\n");
if (status & 0x08) printf("I/O error.\n");
if (status & 0x10) printf("Selected.\n");
if (status & 0x20) printf("Out of paper.\n");
if (status & 0x40) printf("Acknowledge.\n");
if (status & 0x80) printf("Not busy.\n");return 0;
}

3. BIOS: INT 17H.

 

Basic

Gestione dei dati d'ingresso.
INP (ADR)
dove ADR è l'indirizzo e vale 379H per LPT1 e testa i bit pin 15-13-12-10-11
Per testare un byte si può fare:
OUT &37A, dato1 (dato di commutazione l'MPX ;S0=0 parte bassa del byte)
LO = INP (&379)
OUT &37A, dato2 (dato di commutazione l'MPX; S0=1 parte alta del byte)
HI = INP (&379)
VALINPUT = ((HI AND 248)*4)+((LO AND 248) / 8))
Il valore della variabile di tipo byte VALINPUT corrisponde al byte acquisito.
Gestione dei dati in uscita.
OUT ADR, NR
dove ADR è indirizzo e vale 378H per LPT1 e gestisce i bit d'uscita sui pin 2-3-4-5-6-7-8-9, NR è il valore numerico da inviare in uscita, ed è dato dalla somma del valore che ogni bit possiede se è messo a livello 1 (uno).
Esempio: OUT &H378, 81

Pin 9 8 7 6 5 4 3 2
  27 26 25 24 23 22 21 20
Valore 128 64 32 16 8 4 2 1
NR=81 0 1 0 1 0 0 0 1
 

Pascal

Gestione dei dati d'ingresso.
Var dato,HI,LO:byte;
Port [$37A]:=0 Gestione del selettore del MPX S0=0
LO:= Port [$379] Sono acquisiti i 5 bit di valore più bassi
LO:= (A AND 248) Sono forzati a zero i bit che non interessano
LO:= LO SHR 3 Sposta di tre posti verso destra i 5 bit acquisiti
Port[$37A]:=4 Gestione del selettore del MPX S0=1
HI:= Port [$379] Sono acquisiti di bit di valore più alto
HI:= (HI AND 248) Sono forzati a zero i bit che non interessano
HI:= HI SHL 2 Sposta di due posti verso sinistra i 5 bit acquisiti
DATO:= LO OR HI; Somma la parte bassa con la parte alta
Gestione dei dati in uscita.
Var dato:byte;
Port[$378]:=dato Il dato viene inviato all'indirizzo indicato nella posizione 2-3-4-5-6-7-8
Esempio: Port[$378]:= 81

Pin 9 8 7 6 5 4 3 2
  27 26 25 24 23 22 21 20
Valore 128 64 32 16 8 4 2 1
NR=81 0 1 0 1 0 0 0 1
 

C

Gestione dei dati d'ingresso.
OUTPORT (37A,0*0); Gestione del selettore del MPX S0=0
LO = INPORT (379); Sono acquisiti i 5 bit di valore più basso
LO = (LO AND 248); Sono forzati a zero i bit che non interessano
LO = SHR 3; Sposta di tre posti verso destra i 5 bit acquisiti
OUTPORT(37A,0*4); Gestione del selettore del MPX S0=1
HI = INPORT (379) ; Sono acquisiti di bit di valore più alto
HI = (HI AND 248) ; Sono forzati a zero i bit che non interessano
HI = SHL 2; Sposta di due posti verso sinistra i 5 bit acquisiti
DATO = LO OR HI; Somma la parte bassa con la parte alta
Gestione dei dati in uscita.
OUTPORT[$378]:=dato Il dato è inviato all'indirizzo indicato nella posizione 2-3-4-5-6-7-8
Esempio: OUTPORT[$378]:= 81

Pin 9 8 7 6 5 4 3 2
  27 26 25 24 23 22 21 20
Valore 128 64 32 16 8 4 2 1
NR=81 0 1 0 1 0 0 0 1
 

Assembler

Gestione dei dati d'ingresso.
MOV DX, 379H
IN AL, DX
carico in AL 8 bit di cui però soltanto i 5 bit più significativi sono quelli riferiti ai pin 11-10-12-13-15.

Pin 11 10 12 13 15 X X X
  27 26 25 24 23 22 21 20
Valore 128 64 32 16 8 4 2 1

MOV DX, 379H
IN AL,DX
carico in AL 8 bit di cui però solo i 5 meno significativi sono riferiti ai pin 11-10-12-13-15.

Pin X X X X 17 16 14 1
  27 26 25 24 23 22 21 20
Valore 128 64 32 16 8 4 2 1

Ricordarsi che i bit facenti capo al pin 11 è negato rispetto agli altri pin 10-12-13-15.

Pin 11 10 12 13 15 16 14 1
  27 26 25 24 23 22 21 20
Valore 128 64 32 16 8 4 2 1

MOV DX,379H preparo DX per l'input
IN AL,DX carico AL con 8 bit di cui solo 5 utili
AND AL,0F8H elimino i bit che non servono
SHR 3 spostare di 3 posti i dati verso destra
MOV VARIABILE,AL (variabile dove tenere momentaneamente AL)
MOV DX,379H punto ad altro input
IN AL,DX carico AL con 8 bit di cui solo 5 utili
AND AL,0F8H elimino i bit che non servono
SHL 2 spostare di due posti i dati verso sinistra
OR AL,VARIABILE sommo il contenuto di AL con il contenuto di variabile
Gestione dei dati in uscita.
MOV DX,378H
OUT DX,AL
prendo gli 8 bit del registro AL e li metto sui pin 9-8-7-6-5-4-3-2 pin 9 = bit 7 pin 2 = bit 0

 

Gestione MPX 5 input

Questa gestione avviene attraverso gli MPX contenuti in due I.C. tipo 74ls157.

Dalla Mappatura del registro di Stato Indirizzo 379H, possiamo notare che il bit -Busy è negato rispetto a tutti gli altri, per questo diventa più comodo gestire la porta attraverso l'acquisizione a 4 bit anziché 5. In questo modo cambieranno solamente due istruzioni in input:

Basic
VALINPUT = ((HI AND 120)*2)+((LO AND 120) / 8))
Pascal
Dato := ((HI AND 120)*2)+((LO AND 120) / 8))
C
Dato =
((HI AND 120)*2) + ((LO AND 120)/8)
Assembler
MOV DX,379H preparo DX per l'input
IN AL,DX carico AL con 8 bit di cui solo utili
AND AL,78H forzo a zero i bit che non servono
SHR 3 spostare di 3 posti i dati verso destra
MOV VARIABILE,AL (variabile dove tenere momentaneamente AL)
MOV DX,379H punto ad altro input
IN AL,DX carico AL con 8 bit di cui solo 4 utili
AND AL,78H forzo a zero i bit che non servono
SHL 1 spostare di 1 posto i dati verso sinistra
OR AL,VARIABILE sommo il contenuto di AL con il contenuto di variabile

 

Gestione MPX 4 input

Questa gestione avviene attraverso 1 solo MPX contenuto nell' I.C. tipo 74ls157.

 

Applicazioni

PROGETTO N°1
L’interfaccia proposta è un semplice circuito realizzato con il buffer three-state 74LS244, tenuto sempre attivo, mettendo a massa i pin di controllo (-1G, -2G). Tale dispositivo aumenta la corrente che possono erogare le linee di uscita e protegge la porta parallela da eventuali collegamenti errati.
Al fine di semplificare la scheda, sono stati utilizzati solamente quattro linee d’ingresso (segnali di controllo: -ACK, PE, SELECT, -ERROR) e quattro di uscita (segnali dati: D0, D1, D2, D3).
Lo schema completo del circuito è il seguente.

L’alimentazione del buffer avviene attraverso un alimentatore esterno che deve fornire una tensione di 5V continui e stabilizzati. La corrente massima che può assorbire il 74LS244 è di 24 mA (corrente di sink) mentre può fornire al massimo 15 mA (corrente di source). Pertanto, dispositivi con maggiori assorbimenti, vanno opportunamente bufferizzati.
Al fine di semplificare la costruzione dell’interfaccia , è fornita anche la riproduzione di un master in scala 1:1, che permette la realizzazione di un circuito su basetta di rame.

Note relative alla realizzazione dell’interfaccia.

Al circuito realizzato possono essere collegati vari dispositivi su cui inviare dati attraverso le quattro linee di uscita denominate OUT0, OUT1, OUT2, OUT3 oppure prelevare dati dall'esterno attraverso le quattro linee chiamate IN3, IN4, IN5, IN6.
Relativamente al circuito realizzato, si può affermare che il dato ricevuto, o quello inviato in uscita è formato da un byte, è poi evidente che di tale dato devono essere isolati solo i quattro bit interessati.
Inviare un dato alla porta di uscita
10 DATO% = &H0A
20 OUT &H378,DATO%
Dopo l’esecuzione dell’istruzione le quattro linee di uscita del circuito d’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.
Leggere un dato dalla porta d’ingresso
Nel momento che sarà effettuata la lettura delle quattro linee d’ingresso, i livelli saranno associati ai bit 6, 5, 4, 3. Per poter ottenere un byte significativo si dovrà effettuare una traslazione dei bit 6..3, di tre posizioni verso destra, e, dopo, i bit 7..4 dovranno essere posti a zero.
10 DATO% = INP (&H379)
20 DATO% = DATO% \ 2^3
30 DATO% = DATO% AND &H0F
Per collaudare la scheda d’interfaccia può essere adoperata una qualsiasi unità con diodi di visualizzazione e pulsanti, purché essa operi a livelli TTL.
Esempio
Leggere la porta parallela e controllare lo stato del bit 6, se tale livello è alto è visualizzato su video un LED rosso, se è basso un LED verde.
10 DATO% = INP (&H379)
20 BIT% = DATO% AND &H40
30 IF BIT% = 0 THEN VERDE ELSE ROSSO
Esempio
Inviare sulla porta parallela il contenuto di un contatore binario a quattro bit ed accendere i quattro LED collegati alle linee di uscita.
10 CONTA% = 0
20 DO
30 OUT &H378, CONTA%
40 CONTA% = CONTA% + 1
50 DELAY (1000)
60 LOOP WHILE CONTA% < 16
Esempio
Generare sulla linea 0 della porta parallela un segnale ad onda quadra di assegnato periodo. La visualizzazione degli stati del segnale può essere effettuata direttamente con un oscilloscopio.
10 PRINT "INTRODURRE IL PERIODO [SEC] "; PERIODO%
20 TEMP% = INT (PERIODO% * 1000 /2)
30 DO
40 OUT &H378,0
50 DELAY (TEMP%)
60 OUT &H378,1
70 DELAY (TEMP%)
80 LOOP WHILE A$ = ""
Attraverso la porta parallela è anche possibile interfacciare in modo semplice ed economico convertitori analogici-digitali.

PROGETTO N° 2
È un sistema a basso costo, realizzato con una basetta millefori mediante tecnica Wire wrapping, capace di realizzare output tramite display e relè e un’acquisizione dati, si divide in due parti.

  1. Una scheda hardware, da collegare alla porta parallela Centronic del PC, con a bordo tutti i componenti per l’I/O.
  2. Un software per la gestione delle funzionalità della scheda.

Parte di Output

Comprende quattro display a sette segmenti e due relè per il controllo di potenza. I display utilizzati sono del tipo a catodo comune, tutti i singoli segmenti sono collegati a massa, di conseguenza il decoder, 7448, deve essere del tipo appropriato. Questo componente ha la funzione di convertire i quattro bit in ingresso in segnali utili per formare il numero, rappresentato in forma binaria, sul display. A valle dei decoder ci sono due 74574 che contengono ciascuno otto flip-flop di tipo D. I flip-flop sono le unità fondamentali di memoria. Con due integrati del tipo utilizzato si hanno ha disposizione 16 bit per mantenere il dato da visualizzare sui display. Ogni display ha bisogno di quattro bit per rappresentare tutte le cifre, più altri quatto segni 24=16 combinazioni possibili. Avendo, da controllare, quattro display servirebbero ben 16 bit. Purtroppo la porta parallela ne mette a disposizione solamente 12 bit per l’output. La strategia utilizzata per superare questo ostacolo consiste nell’inviare i dati ai display utilizzando otto bit per volta. I bit inviati ad una coppia di display sono memorizzati nei relativi flip-flop; successivamente la CPU può inviare i secondi otto bit. Il bus dati è collegato contemporaneamente ad entrambe le serie di flip-flop. Per la memorizzazione di un dato ad un flip-flop è necessario un impulso di clock, sfruttando questa proprietà è possibile selezionare la coppia di display cui sono indirizzati i dati spediti dal processore.
I relè utilizzano gli ultimi due bit di output rimasti. A monte del relè è stato aggiunto un circuito formato da un transistor, BC517, in configurazione Darlington per avere a disposizione una corrente più elevata in uscita. Il diodo, chiamato "spegni scintilla", è stato inserito nel circuito per proteggere il transistor dalle sovratensioni prodotte dalla forza elettromotrice indotta che si genera all’accensione e allo spegnimento del relè.

Parte di input: il componente principale è il convertitore analogico digitale, TLC549, con uscita seriale. La scelta è ricaduta su questo componente in quanto non sono disponibili sulla porta parallela otto bit per l’input ma solo 5. Per questo motivo è risultato indispensabile utilizzare un componente con l’uscita seriale, bit a bit. Per le altre funzionalità il convertitore è simile ad altri componenti più famosi. Al convertitore è collegato un trasduttore di temperature, LM35, che fornisce un segnale in tensione. Per adattare il range di tensione da 0 – 5V, richiesti in input dal convertitore, a valle del trasduttore è stato inserito un amplificatore operazionale in configurazione non invertente.

L’amplificatore è di tipo non invertente e deve presentare un guadagno di tensione pari a 10.

AV =

Per comandare il convertitore serve il comando d’inizio conversione, CS, e il CLOCK per scandire l’uscita dei dati proposti in modo seriale. È possibile collegare queste due linee ai segnali utilizzati per comandare il CLOCK dei flip-flop. Per evitare anomalie nel funzionamento dei display è necessario provvedere a spedire, sul bus dei dati, il valore corretto ogni qualvolta che si utilizzano queste linee.
Alimentazione: per il corretto funzionamento della scheda non è sufficiente l’alimentazione fornita dall’interfaccia parallela. Per questo motivo è stato progettato un circuito di alimentazione realizzato sulla stessa basetta. La tensione di rete è ridotta di voltaggio tramite un trasformatore a presa centrale. Tramite questo elemento è possibile ottenere una tensione simmetrica rispetto alla massa. La tensione in uscita al trasformatore è
± 15 V. A questo punto è raddrizzata per mezzo di un ponte di Graetz. Successivamente è introdotto un filtro capacitivo per linearizzare maggiormente la tensione. Come ultimo stadio è inserito uno stabilizzatore integrato a 5V per alimentare tutti gli integrati digitali presenti. La tensione presente prima dello stabilizzatore è utilizzata per alimentare l’amplificatore operazionale che abbisogna, per un corretto funzionamento, di un’alimentazione simmetrica.

 

Programmazione

Il linguaggio di programmazione utilizzato per la gestione del software è Microsoft Visual Basic 4.0 a 32 bit. Il Visual Basic, tramite la DLL impout, mette a disposizione le istruzioni IN e OUT che servono per scrivere oppure leggere un dato presente in qualche registro nello spazio di indirizzamento di I/O.
Il programma gestisce i quattro display come se fossero un orologio. Quando l’applicazione è lanciata, è possibile inserirla nella cartella "esecuzione automatica", preleva l’ora dall’orologio di sistema e la trasferisce sul sistema di visualizzazione. Un timer, dopo essersi sincronizzato con l’orologio di sistema, genera degli eventi ogni minuto in modo tale da tenere aggiornato il dato visualizzato su quattro display.
Selezionando il menu opzioni è possibile modificare gli indirizzi cui risponde la scheda. È stata prevista anche una procedura per programmare l’accensione automatica dei relè.
Un’altra funzione è quella relativa al controllo di potenza, aprendo la relativa finestra sono disponibili i due relè presenti sulla scheda. Selezionando le caselle di spunto è possibile abilitare quello desiderato.
La misura della temperatura è l’ultima operazione gestibile dall’applicazione. È possibile visualizzare la temperatura a monitor oppure inviare il dato al dispositivo di visualizzazione presente sulla scheda stessa.
Visualizzazione dell’ora

Questa è la funzione che è richiamata ogni volta che si deve aggiornare l’ora sul display. Di solito questa procedura è avviata dal timer ogni volta che trascorre un minuto.

Codice relativo alla funzione ORA

Public Sub Ora()
Dim stringa As String
Dim minuti As Integer
Dim som As Integer
Dim Ora As Integer
stringa = Format(Time, "Long Time")
minuti = Minute(stringa)
'trasforma i minuti da decimale in codice BCD
som = minuti \ 10
som = som * 6
som = som + minuti
Out DATI, som
'spedisce il dato in BCD alla porta In DATI c'è l'indirizzo del registro dei dati
car = Inp(CONT)
risultato = car Or 1 '1 il primo bit
'prima di spedire il ciclo di clock sul bit interessato si esegue una maschera per evitare di modificare gli altri bit del registro. È importante fare ciò perché si potrebbe modificare il display sbagliato
Out CONT, risultato
Out CONT, car
stringa = Format(Time, "Long Time")
'le stesse operazioni sono eseguite per le ore
Ora = Hour(stringa)
som = Ora \ 10
som = som * 6
som = som + Ora
Out DATI, som
car = Inp(CONT)
risultato = car Or 2 'secondo bit a 1
Out CONT, risultato
Out CONT, car
'è calcolato il tempo per settare la prossima interruzione
Princ.Timer1.Interval = 60000 - (Second(stringa) * 1000)
End Sub

Controllo di potenza
La finestra relativa al controllo di potenza contiene due caselle di spunto che rappresentano i due relè da pilotare. Le modifiche sono attivate solamente se si preme il tasto OK oppure Applica. Nella fase di caricamento il programma controlla la situazione dei relè e la visualizza per mezzo delle caselle di spunto.

Private Sub_Click()
car = Inp(CONT)
If (Check1.Value = 1) Then
'controlla se è stata spuntata la prima casella
risultato = car Or 4
'pone a 1 il bit 3 è utilizzata la maschera per non "sporcare" gli altri bit del registro
Out CONT, risultato 'è inviato il byte elaborato
ElseIf (Check1.Value = 0) Then
risultato = car And 251
'se la casella è disattivata viene disattivato anche il relè relativo
Out CONT, risultato
End If
car = Inp(CONT)
If (Check2.Value = 1) Then
risultato = car And 247 'pone a 1 il bit 4
Out CONT, risultato
ElseIf (Check2.Value = 0) Then
risultato = car Or 8
Out CONT, risultato
End If
Ora
Unload Contr
End Sub
Quando si agisce su registro DATI della porta parallela è importante non modificare i bit che non sono interessati alla operazione corrente. Questo accorgimento è necessario in quanto due bit di questo registro comandano gli impulsi di clock dei flip-flop. Un’eventuale variazione degli stessi provocherebbe situazioni sporche in uscita, sui display. A questo scopo conviene preliminarmente leggere la maschera corrente del registro e fare un AND con i bit che interessano se si vogliono abilitare, oppure un OR se si vogliono inibire.
Esempio: accendere il primo relè.
Bisogna porre a 1 il 4° bit del registro dati che si trova all’indirizzo 37AH.
Supponiamo che il registro abbia questo contenuto:

0 1 1 0 0 0 1 1

Prendo il contenuto del registro e utilizzo l’operatore OR bit a bit con i seguente byte:

0 0 0 1 0 0 0 0

Il risultato sarà ovviamente il seguente

0 1 1 1 0 0 1 1

Come si può vedere solo il 4° bit ha modificato il proprio valore e il resto del byte ha mantenuto l’aspetto originario. La parte di codice che esegue tale operazione è la seguente

car = Inp(CONT)
If (Check1.Value = 1) Then ‘controlla se è stata spuntata la prima casella
risultato = car Or 4
'pone a 1 il bit 3 è utilizzata la maschera per non "sporcare" gli altri bit del registro
Out CONT, risultato ‘è inviato il byte elaborato

Opzioni

Type Record 'record utilizzato nel file di configurazione
Accm As Integer 'ora di accensione
Acco As Integer 'minuto di accensione
Spegm As Integer 'ora di spegnimento
Spego As Integer 'minuto di spegnimento
Indirizzo As Integer '1: 3F8 2: 2F8 3:3BC codice per il campo di indirizzo scelto
End Type

Private Sub Ok_Click()
Open "c:\scheda\scheda.dat" For Random As #1 Len = Len(MioRecord)
If Option1(0).Value = True Then
DATI = &H378 'setta gli indirizzi adeguati
CONT = &H37A
MioRecord.Indirizzo = 1 'setta per la memorizzazione
Put #1, 1, MioRecord
End If
If Option1(1).Value = True Then
DATI = &H278
CONT = &H27A
MioRecord.Indirizzo = 2
Put #1, 1, MioRecord
End If
If Option1(2).Value = True Then
DATI = &H3BC
CONT = &H3BE
MioRecord.Indirizzo = 3
Put #1, 1, MioRecord
End If
Get #1, 1, MioRecord
MioRecord.Acco = Acc(0).Text 'setta il file per l'accensione automatica
MioRecord.Accm = Acc(1).Text
MioRecord.Spego = Speg(0).Text
MioRecord.Spegm = Speg(1).Text
Put #1, 1, MioRecord
Close #1
Ora
Unload Opzione
End Sub


Questo sistema può essere utilizzato per gestire qualsiasi dispositivo, elettrico di tipo ON/OFF, che deve mutare il suo funzionamento in base alla temperatura. Il dispositivo più semplice può essere una caldaia. Tramite il sensore di temperatura è possibile conoscere la temperatura ambientale. A questo punto il software si occupa della gestione del calore nell’ambiente, dando la possibilità di selezionare la temperatura desiderata; l’algoritmo si occupa dell’accensione e dello spegnimento della caldaia, tramite il relè. Se si dovesse progettare un software ad un livello superiore si potrebbe pensare di dare la possibilità all’utente di memorizzare un programma per la gestione del calore articolato nelle ore del giorno e nei giorni della settimana. Sicuramente si potrà ottenere un risultato migliore rispetto a quello offerto dai termostati presenti sul mercato.