;-------------------------------------------------------------------------------- ; Servicos de Delay 15/06/2015 ; ; Este servico fornece as funcoes 'delay-ms' para retardos em milisegundos e ; 'delay_us' para retardos em microsegundos. ; ; Entrada: W deve conter o tempo (max 255) ; Saida : nao ha ; ; Definir no programa os simbolos e registradores abaixo: ; delay_temp res 1 ; CLOCK equ N ; N em hertz (1000000, 4000000, 8000000, etc) ; ; Exemplo: ; movlw .30 ; call delay_ms ; delay 30 milisegundos ; ; movlw .80 ; call delay_us ; delay 80 microsegundos ; ;-------------------------------------------------------------------------------- ; ;-------------------------------------------------------------------------------- ; DELAY DE MILISEGUNDOS ;-------------------------------------------------------------------------------- IF CLOCK==1000000 ;; Timing analysis (at 1 MHz clock) ;; Load and call = 3 = 3 ;; Static overhead = A = 11 + 4 * 59 = 247 ;; Outer loop = B = 10 * (delay-1) = - 10 + 10 * delay ;; Inner loop = C = 4 * 60 * (delay-1) = -240 + 240 * delay ;; Total = 250 * delay delay_ms goto delayms#v(1) ; 2 ins (A) delayms#v(1) movwf delay_temp ; 1 ins (A) movlw 60 ; 1 ins (A) delay_ms_loop addlw -1 ; 1 ins (A,B,C) btfss STATUS,Z ; 1 ins (C) / 2 ins (A,B) goto delay_ms_loop ; 2 ins (C) decf delay_temp,F ; 1 ins (A,B) btfsc STATUS,Z ; 2 ins (B) / 1 ins (A) return ; 2 ins (A) nop ; 1 ins (B) movlw 61 ; 1 ins (B) goto delay_ms_loop ; 2 ins (B) ENDIF ; CLOCK==1000000 ;;-------------------------------------------------------------------------------- IF CLOCK==2000000 ;; Timing analysis (at 2 MHz clock) ;; Load and call = 3 = 3 ;; Static overhead = A = 9 + 4 * 122 = 497 ;; Outer loop = B = 12 * (delay-1) = - 12 + 12 * delay ;; Inner loop = C = 4 * 122 * (delay-1) = -488 + 488 * delay ;; Total = 500 * delay delay_ms movwf delay_temp ; 1 ins (A) movlw 123 ; 1 ins (A) delay_ms_loop addlw -1 ; 1 ins (A,B,C) btfss STATUS,Z ; 1 ins (C) / 2 ins (A,B) goto delay_ms_loop ; 2 ins (C) decf delay_temp,F ; 1 ins (A,B) btfsc STATUS,Z ; 2 ins (B) / 1 ins (A) return ; 2 ins (A) goto delayms#v(2) ; 2 ins (B) delayms#v(2) nop ; 1 ins (B) movlw 123 ; 1 ins (B) goto delay_ms_loop ; 2 ins (B) ENDIF ; CLOCK==2000000 ;;-------------------------------------------------------------------------------- IF CLOCK==4000000 ;; Timing analysis (at 4 MHz clock) ;; Load and call = 3 = 3 ;; Static overhead = A = 9 + 4 * 247 = 997 ;; Outer loop = B = 12 * (delay-1) = - 12 + 12 * delay ;; Inner loop = C = 4 * 247 * (delay-1) = -988 + 988 * delay ;; Total = 1000 * delay delay_ms movwf delay_temp ; 1 ins (A) movlw .248 ; 1 ins (A) delay_ms_loop addlw -1 ; 1 ins (A,B,C) btfss STATUS,Z ; 1 ins (C) / 2 ins (A,B) goto delay_ms_loop ; 2 ins (C) decf delay_temp,F ; 1 ins (A,B) btfsc STATUS,Z ; 2 ins (B) / 1 ins (A) return ; 2 ins (A) goto delayms#v(3) ; 2 ins (B) delayms#v(3) nop ; 1 ins (B) movlw .248 ; 1 ins (B) goto delay_ms_loop ; 2 ins (B) ENDIF ; CLOCK==4000000 ;;-------------------------------------------------------------------------------- IF CLOCK==8000000 ;; Timing analysis (at 8 MHz clock) ;; Load and call = 3 = 3 ;; Static overhead = A = 13 + 8 * 248 = 1997 ;; Outer loop = B = 16 * (delay-1) = - 16 + 16 * delay ;; Inner loop = C = 8 * 248 * (delay-1) = -1984 + 1984 * delay ;; Total = 2000 * delay delay_ms movwf delay_temp ; 1 ins (A) movlw .249 ; 1 ins (A) delay_ms_loop goto delayms#v(4) ; 2 ins (A,B,C) delayms#v(4) goto delayms#v(5) ; 2 ins (A,B,C) delayms#v(5) addlw -1 ; 1 ins (A,B,C) btfss STATUS,Z ; 1 ins (C) / 2 ins (A,B) goto delay_ms_loop ; 2 ins (C) decf delay_temp,F ; 1 ins (A,B) btfsc STATUS,Z ; 2 ins (B) / 1 ins (A) return ; 2 ins (A) goto delayms#v(6) ; 2 ins (B) delayms#v(6) nop ; 1 ins (B) movlw .249 ; 1 ins (B) goto delay_ms_loop ; 2 ins (B) ENDIF ; CLOCK==8000000 ;;-------------------------------------------------------------------------------- IF CLOCK==16000000 ;; Timing analysis (at 16 MHz clock) ;; Load and call = 3 = 3 ;; Static overhead = A = 13 + 16 * 249 = 3997 ;; Outer loop = B = 16 * (delay-1) = - 16 + 16 * delay ;; Inner loop = C = 16 * 249 * (delay-1) = -3984 + 3984 * delay ;; Total = 4000 * delay delay_ms movwf delay_temp ; 1 ins (A) movlw .250 ; 1 ins (A) goto delay_ms_entry_A; 2 ins (A) delay_ms_loop goto delayms#v(7) ; 2 ins (C) delayms#v(7) goto delayms#v(8) ; 2 ins (C) delayms#v(8) goto delayms#v(9) ; 2 ins (C) delayms#v(9) delay_ms_entry_B goto delayms#v(10) ; 2 ins (B,C) delayms#v(10) goto delayms#v(11) ; 2 ins (B,C) delayms#v(11) delay_ms_entry_A goto delayms#v(12) ; 2 ins (A,B,C) delayms#v(12) addlw -1 ; 1 ins (A,B,C) btfss STATUS,Z ; 1 ins (C) / 2 ins (A,B) goto delay_ms_loop ; 2 ins (C) decf delay_temp,F ; 1 ins (A,B) btfsc STATUS,Z ; 2 ins (B) / 1 ins (A) return ; 2 ins (A) nop ; 1 ins (B) movlw .250 ; 1 ins (B) goto delay_ms_entry_B; 2 ins (B) ENDIF ; CLOCK==16000000 ;;-------------------------------------------------------------------------------- IF CLOCK==20000000 ;; Timing analysis (at 20 MHz clock) ;; Load and call = 3 = 3 ;; Static overhead = A = 17 + 20 * 249 = 4997 ;; Outer loop = B = 20 * (delay-1) = - 20 + 20 * delay ;; Inner loop = C = 20 * 249 * (delay-1) = -4980 + 4980 * delay ;; Total = 5000 * delay delay_ms movwf delay_temp ; 1 ins (A) movlw .250 ; 1 ins (A) goto delay_ms_entry_A; 2 ins (A) delay_ms_loop goto delayms#v(13) ; 2 ins (C) delayms#v(13) goto delayms#v(14) ; 2 ins (C) delayms#v(14) goto delayms#v(15) ; 2 ins (C) delayms#v(15) delay_ms_entry_B goto delayms#v(16) ; 2 ins (B,C) delayms#v(16) goto delayms#v(17) ; 2 ins (B,C) delayms#v(17) delay_ms_entry_A goto delayms#v(18) ; 2 ins (A,B,C) delayms#v(18) goto delayms#v(19) ; 2 ins (A,B,C) delayms#v(19) goto delayms#v(20) ; 2 ins (A,B,C) delayms#v(20) addlw -1 ; 1 ins (A,B,C) btfss STATUS,Z ; 1 ins (C) / 2 ins (A,B) goto delay_ms_loop ; 2 ins (C) decf delay_temp,F ; 1 ins (A,B) btfsc STATUS,Z ; 2 ins (B) / 1 ins (A) return ; 2 ins (A) nop ; 1 ins (B) movlw .250 ; 1 ins (B) goto delay_ms_entry_B; 2 ins (B) ENDIF ; CLOCK==20000000 ;;-------------------------------------------------------------------------------- IF CLOCK==24000000 ;; Timing analysis (at 24 MHz clock) ;; Load and call = 3 = 3 ;; Static overhead = A = 13 + 8 * 248 = 1997 ;; Outer loop = B = 16 * (delay-1) = - 16 + 16 * delay ;; Inner loop = C = 8 * 248 * (delay-1) = -1984 + 1984 * delay ;; Total = 2000 * delay delay_ms movwf delay_wrk1 movlw 3 movwf delay_wrk2 delay_macms1 movf delay_wrk1,w movwf delay_temp ; 1 ins (A) movlw .249 ; 1 ins (A) delay_ms_loop goto delayms#v(4) ; 2 ins (A,B,C) delayms#v(4) goto delayms#v(5) ; 2 ins (A,B,C) delayms#v(5) addlw -1 ; 1 ins (A,B,C) btfss STATUS,Z ; 1 ins (C) / 2 ins (A,B) goto delay_ms_loop ; 2 ins (C) decf delay_temp,F ; 1 ins (A,B) btfss STATUS,Z ; 2 ins (B) / 1 ins (A) goto delaymc#v(7) decfsz delay_wrk2,f goto delay_macms1 return ; 2 ins (A) delaymc#v(7) goto delayms#v(6) ; 2 ins (B) delayms#v(6) nop ; 1 ins (B) movlw .249 ; 1 ins (B) goto delay_ms_loop ; 2 ins (B) ENDIF ; CLOCK==24000000 ;;-------------------------------------------------------------------------------- IF CLOCK==48000000 ; 12000000 ciclos por segundo (1 ciclo=83,333nS) ; ROTINA ESPCIFICA PARA FAMILIA 18F ; DEFINIR REGISTRADORES: ; delay_temp ; delay_wrk1 ; delay_wrk2 ; ; ROTINA GERADA POR: ; http://www.piclist.com/cgi-bin/delay.exe?Delay=0.001&Type=seconds&Regs=d1+d2+d3+d4&clock=48&name=Delay&CPU=PIC ; delay_ms movwf delay_temp delay_ms0 movlw 0x5F movwf delay_wrk1 movlw 0x0A movwf delay_wrk2 delay_ms1 decfsz delay_wrk1, f goto delay_ms2 decfsz delay_wrk2, f delay_ms2 goto delay_ms1 decfsz delay_temp,f goto delay_ms0 return ENDIF ; ;-------------------------------------------------------------------------------- ; DELAY DE MICROSEGUNDOS ;-------------------------------------------------------------------------------- IF CLOCK==4000000 ;; Timing analysis (at 4 MHz clock) ;; Minimum delay = 25 us ;; Total = delay (including load and call overhead) delay_us ; [0mod4 1mod4 2mod4 3mod4] movwf delay_temp ; 1 ins 1 1 1 1 movlw b'00000011' ; 1 ins 2 2 2 2 andwf delay_temp,W ; 1 ins 3 3 3 3 btfsc STATUS,Z ; 1 ins / 2 ins 4 5 5 5 goto delay_us_0mod4 ; 2 ins 6 addlw -1 ; 1 ins 6 6 6 btfsc STATUS,Z ; 1 ins / 2 ins 7 8 8 goto delay_us_1mod4 ; 2 ins 9 addlw -1 ; 1 ins 9 9 btfsc STATUS,Z ; 1 ins / 2 ins 10 11 goto delay_us_2mod4 ; 2 ins 12 delay_us_3mod4 delay_us_1mod4 nop ; 1 ins 10 12 movlw 5 ; 1 ins 11 13 goto delay_4us ; 2 ins 13 15 delay_us_0mod4 goto delayms#v(1) ; 2 ins 8 delayms#v(1) goto delayms#v(2) ; 2 ins 10 delayms#v(2) delay_us_2mod4 nop ; 1 ins 11 13 movlw 5 ; 1 ins 12 14 delay_4us ; static delay 4 ins = 4us IF __FAMILIA == 18 rrcf delay_temp,F ; 1 ins rrcf delay_temp,F ; 1 ins ENDIF IF __FAMILIA <= 16 rrf delay_temp,F ; 1 ins rrf delay_temp,F ; 1 ins ENDIF subwf delay_temp,W ; 1 ins andlw b'00111111' ; 1 ins delay_4us_loop ; static delay 5+3 ins = 8us addlw -1 ; 1 ins (static,loop) btfss STATUS,Z ; 1 ins (loop) / 2 ins (static) goto delay_4us_loop ; 2 ins (loop) return ; 2 ins (static) ENDIF ; CLOCK==4000000 ;;-------------------------------------------------------------------------------- IF CLOCK==8000000 ;; Timing analysis (at 8 MHz clock) ;; Minimum delay = 7 us ;; Total = delay (including load and call overhead) delay_us ; [0mod2 1mod2] movwf delay_temp ; 1 ins 1 1 btfsc delay_temp,0 ; 1 ins / 2 ins 3 2 goto delay_2us ; 2 ins 4 delay_2us ; static delay 5 ins = 2.5us nop ; 1 ins IF __FAMILIA <= 16 rrf delay_temp,F ; 1 ins ENDIF IF __FAMILIA == 18 rrcf delay_temp,F ; 1 ins ENDIF movlw 3 ; 1 ins subwf delay_temp,W ; 1 ins andlw b'01111111' ; 1 ins delay_2us_loop ; static delay 5+3 ins = 4us addlw -1 ; 1 ins (static,loop) btfss STATUS,Z ; 1 ins (loop) / 2 ins (static) goto delay_2us_loop ; 2 ins (loop) return ; 2 ins (static) ENDIF ; CLOCK==8000000 ;;-------------------------------------------------------------------------------- IF CLOCK==16000000 ;; Timing analysis (at 16 MHz clock) ;; Minimum delay = 3 us ;; Total = delay (including load and call overhead) delay_us delay_1us ; static delay 4 ins = 1us goto delayms#v(3) ; 2 ins delayms#v(3) nop ; 1 ins addlw -2 ; 1 ins delay_1us_loop ; static delay 5+3 ins = 2us addlw -1 ; 1 ins (static,loop) btfss STATUS,Z ; 1 ins (loop) / 2 ins (static) goto delay_1us_loop ; 2 ins (loop) return ; 2 ins (static) ENDIF ; CLOCK==16000000 ;;-------------------------------------------------------------------------------- IF CLOCK==20000000 ;; Timing analysis (at 20 MHz clock) ;; Minimum delay = 2 us ;; Total = delay (including load and call overhead) delay_us delay_1us ; static delay 3 ins = 0.6us goto delayms#v(4) ; 2 ins delayms#v(4) addlw -1 ; 1 ins delay_1us_loop ; static delay 4+3 ins = 1.4us addlw -1 ; 1 ins (static,loop) btfsc STATUS,Z ; 1 ins (static) / 2 ins (loop) return ; 2 ins (static) goto delay_1us_loop ; 2 ins (loop) ENDIF ; CLOCK==20000000 ;;-------------------------------------------------------------------------------- IF CLOCK==24000000 ;; Timing analysis (at 24 MHz clock) ;; Minimum delay = 7 us ;; Total = delay (including load and call overhead) delay_us ; [0mod2 1mod2] movwf delay_wrk2 movlw 3 movwf delay_wrk1 delay_macus1 movf delay_wrk2,w movwf delay_temp ; 1 ins 1 1 btfsc delay_temp,0 ; 1 ins / 2 ins 3 2 goto delay_2us ; 2 ins 4 delay_2us ; static delay 5 ins = 2.5us nop ; 1 ins rrcf delay_temp,F ; 1 ins movlw 3 ; 1 ins subwf delay_temp,W ; 1 ins andlw b'01111111' ; 1 ins delay_2us_loop ; static delay 5+3 ins = 4us addlw -1 ; 1 ins (static,loop) btfss STATUS,Z ; 1 ins (loop) / 2 ins (static) goto delay_2us_loop ; 2 ins (loop) decfsz delay_wrk1,f goto delay_macus1 return ; 2 ins (static) ENDIF ; CLOCK==24000000 ;;-------------------------------------------------------------------------------- IF CLOCK==48000000 ;; Timing analysis (at 48 MHz clock) ;; Minimum delay = 3 us ;; Total = delay (including load and call overhead) delay_us movwf delay_temp delay_1us ; static delay 4 ins = 1us movlw 3 movwf delay_wrk1 addlw -3 ; 1 ins movf delay_temp,w delay_1us_loop ; static delay 5+3 ins = 2us addlw -1 ; 1 ins (static,loop) btfss STATUS,Z ; 1 ins (loop) / 2 ins (static) goto delay_1us_loop ; 2 ins (loop) decfsz delay_wrk1,f goto delay_mus return ; 2 ins (static) delay_mus movf delay_temp,w addlw -3 goto delay_1us_loop ENDIF ; CLOCK==48000000