Progetti - PIC

 

Demo board per SIPO '164 

 


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.


 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 20/04/11.