
Ritardo software
br>
br>
br>
Come funziona la macro DELAY usata negli esempi del corso
br>
br>
br>
;********************************************************************** ; Clock frequency related constant (4 MHz) ;********************************************************************** BIT_DELAY equ 23 ;Bit delay a 9600 bps ;********************************************************************** ; MACRO - Delay subroutine with watch dog timer clearing ; ; Macro parameters: ; ; VALUE: Delay obtained = ((VALUE-1)*4+5)*(1/(Fosc/4)) ; ;********************************************************************** DELAY MACRO VALUE LOCAL REDO movlw VALUE movwf TmpRegister REDO clrwdt ;Clear watch dog timer decfsz TmpRegister,F goto REDO ENDM
La formula è quella indicata nel sorgente della macro DELAY:
Ritardo ottenuto = (VALUE-1)*4+5) * (1/(Fosc/4)
Sostituendo a VALUE il valore di BIT_DELAY e a Fosc la frequenza del quarzo otteniamo
Ritardo ottenuto = (23-1)*4+5) * (1/(4.000.000/4) = 93 microsecondi
La seconda parte della formula (1/(4.000.000/4) serve a calcolare il tempo di esecuzione di una singola istruzione:
- 4.000.000 è la frequenza del quarzo. In questo caso un 4Mhz
- 4.000.000 / 4 + la frequenza di clock interna del PICmicro = 1Mhz. Questa e' la frequenza di esecuzione reale delle istruzioni. Essendo i PICmicro basati su una CPU di tipo RISC ogni istruzione viene eseguita in un solo ciclo macchina. La durata di un ciclo macchina si calcola facendo l'inverso della frequenza, in questo caso 1/1.000.000 = 1 microsecondo. In un secondo il PICmicro esegue un milione di istruzioni.
Nel caso venga effettuato un salto da una istruzione all'altra il PICmicro impiega 2 cicli macchina. Le istruzioni che effettuano salti sono ad esempio la GOTO, la CALL e la RETURN.
La DECFSZ invece impiega 1 solo ciclo se la condizione non e' soddisfatta, altrimenti 2 cicli se la condizione è soddisfatta per cui deve essere effettuato lo skip dell'istruzione successiva.
Nella prima parte della formula:
(VALUE-1)*4+5)
- VALUE è il numero di loop che deve effettuare la macro prima di ridare il controllo al resto del programma.
- Le costanti rimanenti sono i cicli macchina "consumati" dalle istruzioni presenti nel loop
movlw 23 ;1 ciclo movwf TmpRegister ;1 ciclo REDO clrwdt ;1 ciclo decfsz TmpRegister,F ;2 cicli a fine conteggio altrimenti 1 ciclo goto REDO ;2 cicli
Se mettiamo VALUE a 1 (un solo ciclo di ritardo) otteniamo questa sequenza di istruzioni:
movlw 1 ;1 ciclo movwf TmpRegister ;1 ciclo clrwdt ;1 ciclo decfsz TmpRegister,F ;2 cicli
In totale 5 cicli pari a (1-1)*4+5 = 0*4+5 = 0*5 = 5.
Se mettiamo VALUE a 2 (due cicli di ritardo) otteniamo questa sequenza di istruzioni:
movlw 1 ;1 ciclo
movwf TmpRegister ;1 ciclo
clrwdt ;1 ciclo
decfsz TmpRegister,F ;1 ciclo
goto REDO ;2 cicli
clrwdt ;1 ciclo
decfsz TmpRegister,F ;2 ciclo
In totale 9 cicli pari a (2-1)*4+5 = 1*4+5 = 4 + 5 = 9
Con VALUE = 23 otteniamo: (23-1)*4+5 = 22*4+5 = 88+5 = 93 microsecondi di ritardo
Nel sorgente d'esempio http://www.tanzilli.com/articles/00218/rs232io.asm, dove viene utilizzata la macro, questo ritardo serve a generare una pausa di lunghezza pari alla durata di trasmissione in un bit a 9600 bits, pari a:
1/ 9600 = 104 microsecondi circa
Il ritardo inserito è in difetto di 104-93 = 11 microsecondi per compensare il ritardo in più dovuto al tempo di esecuzione delle istruzioni precedenti e successive alla chiamata della macro.
