Il driver per gli shift register '164
La procedura di trasferimento di un dato dal microcontroller al registro a
scorrimento è la seguente:
- iniziamo con il porre il primo bit da trasferire su un pin configurato
come uscita del microcontroller e collegato all' ingresso dello shift
register
- applichiamo ora un impulso di clock ai flip-flop. Il loro collegamento a
catena fa si che il dato contenuto in ogni flip-flop passi al successivo,
quindi il dato applicato all' ingresso sarà immagazzinato nel primo latch.
- poniamo ora il secondo dato e ripetiamo l' impulso di clock: il dato
precedentemente inserito scorre dal primo al secondo flip-flop mentre nel
primo sarà immagazzinato il dato ora caricato
- ripetiamo l' operazione fino ad esaurimento degli 8 bit del dato: ora
ogni flip-flop contiene uno dei bit del dato ed essi sono accessibili ai
pin di uscita dello shift register.
Peraltro, una simile procedura sarà utilizzabile per tutti quei
dispositivi ad ingresso seriale del genere dati + clock.
Il flow chart del programma è questo.
|
Il drive vero e proprio è schematizzato nel flowchart qui a lato.
Per prima cosa il dato viene passato dall' accumulatore WREG ad un
registro RAM intermedio (a cui è applicata la label SerialData).
Poi viene caricato un contatore (un' altra locazione RAM con label
HC164Cntr) con il numero dei bit da shiftare.
E' buona norma che i pin usati per una simile applicazione siano
lasciati, all' uscita del driver, in una condizione determinata. In
questo caso si è scelto di portare sia la linea del clock che quella
dei dati a livello basso. Questo permette di sapere con certezza lo
stato di quelle linee all' inizio e al termine dell' esecuzione del
driver.
La funzione chiave di comando dell' uscita è legata al test dello
stato del bit 7 del dato.
Questo è possibile in quanto nel set Enhanced ci sono istruzioni per
la rotazione senza interessare il Carry.
Lo stato del pin di uscita è presettato a 0: se il bit 7 del dato
è a 0, l' uscita non sarà modificata; se invece il bit 7 è a 1 l'
uscita sarà posta anch'essa a 1.
Segue subito la generazione di un impulso di clock, portando a
livello alto e popi riabbassando il pin del clock seriale. Esclusa la
versione CMOS (C164) tutte le altre versioni hanno la possibilità di
lavorare con clock di almeno 20 MHz, il che rende inutile una
temporizzazione (stretch) della durata dell' impulso di clock.
terminato l' impulso del clock, si riporta a 0 il pin di dato e si
effettua un decremento del contatore: se il contatore è arivato a 0
vuol dire che sono stati shiftati tutti i bit del dato. Altrimenti si
ripete il loop.
Da notare che la rotazione, avvenendo sul file SerialData stesso,
porta ad ogni passo un nuovo bit nella posizione 7 per il test di
uscita. Al termine delle rotazioni il contenuto del registro sarà
quello di inizio algoritmo.
Alla fine dell' algoritmo, la routine rientra al programma
chiamante.
|
Con una rotazione a sinistra iniziamo a shiftare il bit di peso maggiore,
che, al termine della routine si troverà posizionato all' uscita Q7 dello
shift register, con il bit 0 del dato corrispondente all' uscita Q0.
Ovviamente, eseguendo una rotazione a destra e analizzando il bit 0 invece
del 7 avremmo una uscita dei bit a specchio.
Questo è ottenibile senza variare il programma principale, ma solo
realizzando un diverso driver, che è in effetti un "modulo
software", ovvero un blocco funzionale autonomo progettato per
svolgere un certo compito e che comunica con il programma chiamante
attraverso una interfaccia definita.
Il driver avrà quindi:
- una funzione di uscita e una di ingresso
- un certo impiego di memoria RAM
- la possibilità di chiamare altri moduli
La documentazione relativa permetterà di inserire il modulo nel proprio
programma senza creare interferenze con il resto del programma stesso (ad
esempio, conflitti nell' uso di registri, overflow dello stack, ecc).
La soluzione di creare un "modulo software" è estremamente
efficiente: scrivendo una sola volta con la dovuta attenzione l' algoritmo del
driver si potrà utilizzare il modulo un numero infinito di volte in altri
programmi dove viene utilizzato il medesimo hardware, senza dover ripetere
ogni volta la scrittura di questa funzione.
Il driver, collezionato in una libreria, resterà a disposizione per ogni
futura occasione.
Inoltre, avendolo debuggato e sperimentato, questa parte di lavoro non deve
essere più ripetuta nelle successive applicazioni; sarà un "black
box" di cui sappiamo che cosa fa, cosa entra e cosa esce, quali risorse
impiega e, sopratutto, che funziona correttamente.
Richiesta di risorse
Per quanto riguarda la connessione con il PIC, basteranno 3 conduttori,
ovvero 3 pin di un port:
- un segnale per i dati
- un segnale per il clock
- un segnale per il clear
Nel driver, l' assegnazione di label al posto di valori assoluti è
essenziale per permettere al programmatore di utilizzare un qualunque pin del
processore, semplicemente con un equate che colleghi la label al registro
usato.
Se non viene utilizzata la funzione di Clear, la linea relativa dovrà
essere a livello alto per abilitare lo shift register.
In effetti, il driver vero e proprio non fa richiami alla funzione di Clear.
Nel modulo, però, sono presenti esempi di macro per comandare questa linea.
Il driver impiega due locazioni di RAM generiche, il cui contenuto verrà
modificato, che servono come buffer dei dati da shiftare e come contatore dei
lopp di shift.
Il driver modifica WREG, non richiama altre funzioni (per cui non utilizza
lo stack oltre il livello della sua chiamata come subroutine) e funziona per
qualsiasi frequenza di clock del processore, da 0 a 48 MHz.
Vediamo altri dettagli del driver.
|