PICmicro Cult – Ritardo software

Ritardo software



Come funziona la macro DELAY usata negli esempi del corso



;**********************************************************************
; 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.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend