Disposizione e funzioni pin porta parallela
Descrizione dei segnali(pinout)
Verifica interfaccia parallela
La porta parallela come dispositivo
generale di i/o
Programmazione porta parallela
![]()
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.
|
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 dingresso 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 dingresso 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 |
Descrizione dei segnali(pinout)
Si fa riferimento al connettore a 36 pin della stampante.
L'interfaccia parallela per la stampante risponde a cinque registri interni che possono essere scritti o letti mediante istruzioni di I/O.
Le due ultime operazioni dinput 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 lultimo
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 |
|
|
|
|
INIT |
|
|
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 |
|
|
|
|
|
|
|
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 DINGRESSO
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 dingresso che possono
essere lette usando operazioni di IN. In aggiunta, una linea dingresso
può anche essere usata per generare uninterruzione al
microprocessore (pin 10 ACK).
La porta parallela quindi può essere usata anche per lacquisizione
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 dellinterfaccia
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 dinput
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.2KW
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.
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 |
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 |
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 |
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
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
Questa gestione avviene attraverso 1 solo MPX contenuto nell' I.C. tipo 74ls157.

PROGETTO N°1
Linterfaccia 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 dingresso (segnali di controllo: -ACK,
PE, SELECT, -ERROR) e quattro di uscita (segnali dati: D0,
D1, D2, D3).
Lo schema completo del circuito è il seguente.

Lalimentazione 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 dellinterfaccia , è
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 dellinterfaccia.
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 lesecuzione dellistruzione
le quattro linee di uscita del circuito dinterfaccia
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 dingresso
Nel momento che sarà effettuata la lettura delle quattro
linee dingresso, 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 dinterfaccia
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 unacquisizione
dati, si divide in due parti.
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 loutput. La strategia utilizzata per
superare questo ostacolo consiste nellinviare 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 allaccensione 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 linput ma solo 5. Per questo motivo è risultato indispensabile utilizzare un componente con luscita 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.

Lamplificatore è di tipo non invertente e deve presentare un guadagno di tensione pari a 10.
AV =![]()
Per comandare il convertitore serve il
comando dinizio conversione, CS, e il CLOCK per scandire luscita
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 lalimentazione fornita dallinterfaccia
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
lamplificatore operazionale che abbisogna, per un corretto
funzionamento, di unalimentazione simmetrica.

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 lapplicazione è lanciata, è possibile
inserirla nella cartella "esecuzione automatica",
preleva lora dallorologio di sistema e la trasferisce
sul sistema di visualizzazione. Un timer, dopo essersi
sincronizzato con lorologio 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 laccensione automatica dei relè.
Unaltra 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 è lultima operazione gestibile
dallapplicazione. È possibile visualizzare la temperatura
a monitor oppure inviare il dato al dispositivo di
visualizzazione presente sulla scheda stessa.
Visualizzazione dellora

Questa è la funzione che è richiamata ogni volta che si deve aggiornare lora 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. Uneventuale 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 allindirizzo
37AH.
Supponiamo che il registro abbia questo contenuto:
| 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
Prendo il contenuto del registro e utilizzo loperatore 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 laspetto 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 nellambiente, dando la possibilità di
selezionare la temperatura desiderata; lalgoritmo si occupa
dellaccensione 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à allutente
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.