ESERCITAZIONE # 8
Espansioni
Una prima espansione che proponiamo è la seguente:
Dovremmo aver notato che una possibile funzione di una periferica SIPO è
quella di utilizzare solamente un paio di pin del microcontroller per comandare più uscite; in sostanza, si tratta di
una espansione della capacità di I/O: con due pin comandiamo 8 uscite.
Certamente il sistema di comando dei singoli bit è del tutto differente
rispetto al comando diretto su un PORT; ad esempio, è richiesto un tempo ben
maggiore da parte del driver dello shift register per trasferire gli 8 bit
rispetto ad un semplice movlw. Però, in un vastissimo numero di applicazioni,
questo è del tutto irrilevante.
Vediamo ad esempio una possibilità: facciamo lampeggiare
alternativamente i LED collegati al '164.
Se questo sembra a prima vista complesso, in pratica è estremamente
semplice, sopratutto avendo a disposizione il driver del componente già pronto.
|
Il flow chart è altrettanto semplice:
- inviamo un set di bit che accendono alcuni LED
- attendiamo un tempo adeguato perchè l' occhio apprezzi
- inviamo un nuovo set di dati che invertono lo stato dei LED
- attendiamo un tempo adeguato perchè l' occhio apprezzi
- e ripetiamo il ciclo
Il tempo necessario per passare il dato dal processore allo shift
register è dell' ordine delle decine di microsecondi e quindi del tutto
impercettibile all' occhio, che, invece, percepirà solamente l'
alternarsi dei LED accesi e spenti. Possiamo notare che la semplicità
dello schema a blocchi dipende essenzialmente dal fatto che stiamo
utilizzando dei "moduli" per confezionati.
Questi moduli, sotto forma di sub routine sono :
- il driver dello shift register
- la routine di pausa
|
In sostanza, il flow chart è analogo a quello utilizzato in esercizi
precedenti; solamente si sostituisce la semplice copia del dato sul registro di
uscita del PORT con il driver che carica il dato nello shift register.
Dal punto di vista della struttura non cambia nulla, in quanto ci troviamo ad
utilizzare il driver come un black box, un modulo pre confezionato, del quale
sappiamo che il dato in WREG verrà trasferito alle uscite dello shift register.
Abbiamo sostituito una coppia di istruzioni del genere:
movlw
dato ; carica il dato da presentare
movf PORT
; nel latch di uscita del port |
con la coppia:
movlw
dato ; carica il dato da presentare
call Driver ;
nel driver dello shift register |
Il driver, modulo software in se compiuto, una volta creato e verificato, non
ha più bisogno di essere rivisto; va semplicemente utilizzato.
E questo è il senso dell' uso di moduli ben strutturati, invece che la
ripetizione di file di istruzioni.
Nell' esecuzione del loop ci appariranno gli 8 LED lampeggianti
alternativamente, dato che carichiamo un dato che inizialmente fa accendere i
LED dispari e successivamente un dato che accende invece i LED pari.
la pausa determina la percezione dell' effetto e la durata del lampeggio.
AVVERTENZA:
Abbiamo visto nella prima parte dell' esercizio che i dati scorrono
nella catena dei flip-flop, comandati dal clock, passando da un
flip-flop al successivo ed essendo quindi presenti sulle uscite Q, dove
i LED ne segnalano il livello alto.
Questo vuol dire che, durante il caricamenti dei dati le uscite dei
flip-flop variano di conseguenza e diventano stabili solamente al
cessare del clock.
Se il driver non viene interrotto, il tempo di trasferimento dipende
solo dal clock delle istruzioni. A 1 MHz di clock ogni istruzione
impiega 4 us per essere eseguita; per quanto breve sia tutto il ciclo,
le uscite Q, prima di diventare stabili, potranno variare, anche se per
tempi di decine di us.
Questa situazione può non essere adeguata per tutte le
applicazioni.
Nel caso sia necessario disporre dei dati alle uscite solamente
quando questi sono diventati stabili, esistono altri tipi di SIPO con
latch di uscita e relativo enable. |
Il progetto per MPLAB è scaricabile
qui.
Nel sorgente vengono impiegate le risorse già viste negli esercizi
precedenti.
Possiamo notare che, utilizzando il driver e le routine di tempo già viste,
il sorgente è sempre estremamente semplice.
E, in effetti, una delle cose che si vogliono far comprendere con questi
esercizi è che la programmazione, in qualsiasi linguaggio, è un fatto tanto
più semplice quanto più si seguono questi principi:
- suddividere in unità logiche il lavoro in modo da affrontare un
problema alla volta
- evitare, quindi, di iniziare a scrivere linee e linee di istruzioni senza
struttura: saranno un lavoro poco efficace, difficile da manutenere e molto
difficile da riutilizzare.
- Invece, realizzare per ogni problema un algoritmo adeguato, da
utilizzare come black box in questa e in altre applicazioni, ovvero strutturare
il lavoro in modo tale da ottenere listati semplici da leggere e da gestire.
Di questo fa parte anche la troppo trascurata abitudine di stendere diagrammi
a blocchi (flowchart) dell' algoritmo, cosa che semplifica enormemente
sia la comprensione dell' algoritmo stesso, sia la stesura delle istruzioni
per eseguirlo.
- E, sopra ogni cosa, lavorare in modo ordinato e documentato.
Questo rende evidente che l' Assembly NON è un linguaggio complesso
per le applicazioni di I/O, ma, anzi, il più adeguato ed efficiente. E non è
neppure difficile da utilizzare; basta semplicemente attenersi alle regole
appena accennate.
Regole per altro indispensabili qualsiasi sia il linguaggio utilizzato.
Anche questo programma, una volta esaurito il debug, potrà essere caricato nella
memoria programma del chip ed eseguito separatamente dal debugger e dall'
ambiente di sviluppo, come già visto in precedenti esercizi.
Volendo ottenere un oggetto adatto ad essere scritto nella memoria programma
del PIC, si dovrà aggiungere nel sorgente la modifica per un CONFIG adeguato all'
esecuzione stand alone, come visto nell' esercizio precedente.
Si possono consigliare anche ulteriori variazioni, come quella di ottenere altri
effetti con i LED, cambiando i dati da trasmettere allo shift register.
|