Come generare dei ritardi precisi nei microcontrollori grazie all'utilizzo dei cicli macchina NOP e delle istruzioni CALL e GOTO.
Generare ritardi precisi con delle semplici istruzioni assembler
Nel caso in cui sia necessario generare dei brevi ritardi, è possibile utilizzare una sequenza di istruzioni NOP ciascuna delle quali introduce un ritardo di 1 ciclo istruzione (per i PIC 1 ciclo istruzione corrisponde a 4 cicli di clock). Ecco alcuni accorgimenti per ottimizzare al massimo le dimensioni del codice.
Per introdurre un ritardo di due cicli è possibile utilizzare due istruzioni NOP, ma lo stesso risultato è ottenibile impiegando una sola istruzione goto $+1. “$” indica il valore corrente del program counter per cui l’istruzione goto $+1 non fa altro che saltare all’istruzione successiva. Il vantaggio è che l’istruzione goto viene eseguita in due cicli istruzione per cui l’effetto è lo stesso delle due istruzioni NOP risparmiando però una locazione della memoria programma.
Se il ritardo deve essere di quattro cicli istruzione è possibile sfruttare una qualsiasi istruzione return già presente nel codice (alla fine di qualche subroutine).
La tecnica consiste nell’etichettare l’istruzione return, quindi eseguire una call verso l’etichetta così impostata. L’esecuzione della call impiega due cicli e provoca un salto all’istruzione return la quale viene eseguita anch’essa in due cicli ritornando all’istruzione successiva alla call. Poiché la return era già presente nel codice, con questo accorgimento si genera un ritardo di quattro cicli con una sola istruzione call.
NOP NOP ;2 istruzioni, 2 cicli ;************************************** Goto $+1 ;1 istruzione, 2 cicli ;************************************** Call etichetta ;1 istruzione, 4 cicli … etichetta return ;**************************************

Ottimo esempio descrittivo per gestire i ritardi che sono fondamentali all’interno di un sistema di comunicazione dati, vedi seriale.
Il NOP viene spesso ignorato, ma è fondamentale per due motivi:
1) permette di misurare il ciclo macchina e di gestire i tempi con precisione assoluta.
2) permette al progettista di avere pieno controllo del microcontrollore. Quello che il progettista decide, avviene.
Per questo amo l’assembler 🙂
Con tutti questi articoli di programmazione in ASM mi stai facendo venir voglia di rigiocare un po con i PIC; accantonati, già da un po, in un cassetto a prendere della polvere. Per facilitare la creazione delle routine di ritardo utilizzavo questo ottimo generatore
http://www.golovchenko.org/cgi-bin/delay