Esercitazioni ASM - PIC18

 


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.


 

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