| | ![](../../../IMG/PUNTI/new.gif) | | Pagina creata il 01/09/2012 [4390 giorni fa] |
![Applicazioni Software](../../../Img/28x48/ProgrammiG.gif) |
Applicazioni Software
|
PROGETTO n° 15 - 6/6
[150 di 189]
|
La procedura Out08bit, dedicata alla gestione dell'interfaccia hardware costituita dai
due
decoder con memoria 9368,
è descritta nella
seguente casella di testo:
Essa è chiamata una-tantum solo per provvedere ad accendere i due
digit con il codice ricevuto in ingresso in
AL, il byte
00H, spedito direttamente sui pin 2÷pin
9 del connettore della porta parallela con
un OUT sul suo
Registro d'uscita 0378H/0278H
e, di fatto, fornito stabilmente in ingresso anche ai due decoder.
Non appena il digit accende i suoi segmenti, in coerenza con il valore dei
bit racchiusi nella parola ricevuta, il numero esadecimale di quest'ultima è
visualizzato al centro del monitor, per dare la possibilità di verificarne
il valore: di questo si occupa la sottoprocedura CALL
Byt2Asc, che mette a video i due caratteri ascii corrispondenti ai
due nibble del byte corrente, ancora disponibile in
AL, come detto entrambi "0".
Ma in questo caso, l'azione più interessante è gestita dalla parte affidata
ai due Servizi previsti per la
gestione di questo progetto: non si tratta di procedure
ma di codice
specificatamente pensato per rispondere propriamente alla pressione del tasto
relativo; a ciascuno di essi si accede infatti con un salto condizionato
(dalla flag di Zero, JZ Address, la cui presenza a 1 stabilisce che
l'evento si è verificato e va servito) e vi si esce con un salto incondizionato (JMP
xxx01)
direttamente in ingresso al
loop d'attesa (.. non esiste dunque RET).
Entrambe sono visibili nella
seguente casella di testo:
Ciascuno dei due Servizi (IncByt e
DecByt) si limita semplicemente ad incrementare o decrementare il valore
trovato nella variabile BlkTIME, usato per
stabilire contemporaneamente sia la durata t1 della parte alta che quella t2
della parte bassa della forma d'onda quadra asimmetrica necessaria per il
controllo della luminosità; i due tempi sono complementari tra loro e la
loro somma t1+t2 è pari al periodo T, mantenuto pari a 22 ms.
Se l'aspetto dell'onda quadra è quello di un treno
d'impulsi di breve durata, molto distanziati tra loro (tipico di un duty cycle
molto basso, per esempio del 5%) l'effetto sui digit è quello di tenerli (quasi)
spenti, mentre se l'onda quadra assomiglia ad un treno d'impulsi molto lunghi,
praticamente attaccati l'uno all'altro (tipico di un duty cycle molto alto, per
esempio del 95%) l'effetto sui digit è quello di accenderli (quasi) al
massimo; la figura seguente mostra i segnali
necessari rispettivamente per una discreta (duty cycle pari a 86%) e una bassa
(duty cycle del 14%) accensione dei digit; l'effetto ottenuto è legato al valore
medio del segnale imposto su BI, più vicino a 1 logico nel primo caso e allo 0
nel secondo.
L'effettiva onda quadra TTL (cioè con valori tra 0,2 V e 2,4V) viene generata forzando
prima a "1" (per il tempo t1) e poi a "0" (per il tempo t2) il bit0 del Registro di Controllo
037AH/027AH, per assicurare sul
pin1 del connettore della parallela (in virtù
del fatto che il valore del bit è invertito internamente) rispettivamente prima un livello
basso e poi un livello alto; questa sequenza, offerta all'ingresso
BI/RBO
(pin4) del
decoder con memoria 9368, produce lo spegnimento di tutti i segmenti dei Digit
per un tempo t1 e la loro successiva riaccensione per un tempo t2.
Da notare che le temporizzazioni sono rese possibili dalla procedura
Del_1, in grado di generare un ritardo fisso di 1 millisecondo con
particolare precisione, appoggiandosi per questo al Timer di sistema del
personal computer; spetta poi ai due loop interni (Blk_01 e
Blk_02)
richiamarla il numero di volte necessario per dare all'onda quadra il duty cycle
desiderato.
La creazione di ogni periodo T=t1+t2 deve continuare senza interruzioni, per
garantire l'effetto Blanking in modo continuativo; per questo è necessario appoggiarsi
alla Funzione 01H (MOV AH,01) della procedura a livello BIOS nota come
INT 16H, che consente
di verificare la eventuale pressione di tasti senza fermarsi; non appena viene
rilevata la pressione di un tasto qualunque viene infatti imposto il rientro nel
Main Loop, per cambiare comando o per terminare il nostro test.