# Calculando los retardos



## gtec (Abr 19, 2008)

Para los que no quieren estar calculando los retardos, les dejo una libreria con retardos programados de (4-5-10-20-50-100-200-500)micro segundos, otras de (4-5-10-20-50-100-200-500)mili segundos  y de (1-2-5-10-20) segundos.
Para ultilizarlos solo hay que incluir la libreria en el programa (INCLUDE <RETARDOS.INC>) y cada vez que necesitemos por ejemplo un retardo de 200 milisegundos basta con poner por ejemplo: 

call   Retardos_200ms
call   Retardos_100ms
.
.
y asi formar el tiempo que deseen. Espero les sirva.


----------



## asherar (Abr 19, 2008)

gtec dijo:
			
		

> Para los que no quieren estar calculando los retardos, les dejo una libreria con retardos programados de (4-5-10-20-50-100-200-500)micro segundos, otras de (4-5-10-20-50-100-200-500)mili segundos  y de (1-2-5-10-20) segundos.
> ...



Che, la idea está muy buena, pero no veo el el archivo por ningún lado.    
Te olvidaste de postearlo ... o te lo habrán quemado junto con los pastos?    

Saludos!


----------



## gtec (Abr 19, 2008)

Estoy teniendo problemas, no puedo subir ningun archivo por el momento, no me di cuenta pues pense que lo subio, muchas gracias Alejandro por avisarme. Bien, por eso ahora lo que subo es el bloque de codigos, entonces lo que tienen que hacer es pegarlo tal cual esta en el editor del MPLAB y guardarlo en C:\Archivos de programa\MPLAB IDE\MCHIP_Tools bajo el nombre RETARDOS.INC (es muy importante lo guarden con la extensión *.INC) Aclaro que no lo escribi yo, lo saque del libro MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS. Aquí va el código:

CBLOCK
	R_ContA				; Contadores para los retardos.
	R_ContB
	R_ContC
	ENDC

Retardo_10micros				; La llamada "call" aporta 2 ciclos máquina.
	nop				; Aporta 1 ciclo máquina.
	nop				; Aporta 1 ciclo máquina.
	nop				; Aporta 1 ciclo máquina.
	nop				; Aporta 1 ciclo máquina.
	nop				; Aporta 1 ciclo máquina.
Retardo_5micros				; La llamada "call" aporta 2 ciclos máquina.
	nop				; Aporta 1 ciclo máquina.
Retardo_4micros				; La llamada "call" aporta 2 ciclos máquina.
	return				; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros				; La llamada "call" aporta 2 ciclos máquina.
	nop				; Aporta 1 ciclo máquina.
	movlw	d'164'			; Aporta 1 ciclo máquina. Este es el valor de "K".
	goto	RetardoMicros		; Aporta 2 ciclos máquina.
Retardo_200micros				; La llamada "call" aporta 2 ciclos máquina.
	nop				; Aporta 1 ciclo máquina.
	movlw	d'64'			; Aporta 1 ciclo máquina. Este es el valor de "K".
	goto	RetardoMicros		; Aporta 2 ciclos máquina.
Retardo_100micros				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'31'			; Aporta 1 ciclo máquina. Este es el valor de "K".
	goto	RetardoMicros		; Aporta 2 ciclos máquina.
Retardo_50micros				; La llamada "call" aporta 2 ciclos máquina.
	nop				; Aporta 1 ciclo máquina.
	movlw	d'14'			; Aporta 1 ciclo máquina. Este es el valor de "K".
	goto	RetardoMicros		; Aporta 2 ciclos máquina.
Retardo_20micros				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'5'			; Aporta 1 ciclo máquina. Este es el valor de "K".
;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.
;
RetardoMicros
	movwf	R_ContA			; Aporta 1 ciclo máquina.
Rmicros_Bucle
	decfsz	R_ContA,F		; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	Rmicros_Bucle		; Aporta (K-1)x2 ciclos máquina.
	return				; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros:	2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).
; - Retardo_200micros:	2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).
; - Retardo_100micros:	2     + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).
; - Retardo_50micros :	2 + 1 + 1 + 2 + (2 + 3K) =  50 cm =  50 µs. (para K= 14 y 4 MHz).
; - Retardo_20micros :	2     + 1     + (2 + 3K) =  20 cm =  20 µs. (para K=  5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------
;
Retardo_200ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'200'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_100ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'100'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_50ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'50'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_20ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'20'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_10ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'10'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_5ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'5'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_2ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'2'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_1ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'1'			; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
	movwf	R_ContB			; Aporta 1 ciclo máquina.
R1ms_BucleExterno
	movlw	d'249'			; Aporta Mx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA			; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
	nop				; Aporta KxMx1 ciclos máquina.
	decfsz	R_ContA,F		; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
	goto	R1ms_BucleInterno		; Aporta (K-1)xMx2 ciclos máquina.
	decfsz	R_ContB,F		; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1ms_BucleExterno 	; Aporta (M-1)x2 ciclos máquina.
	return				; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms:	2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:	2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms :	2 + 1 + 2 + (2 + 4M + 4KM) =  50007 cm =  50 ms. (M= 50 y K=249).
; - Retardo_20ms :	2 + 1 + 2 + (2 + 4M + 4KM) =  20007 cm =  20 ms. (M= 20 y K=249).
; - Retardo_10ms :	2 + 1 + 2 + (2 + 4M + 4KM) =  10007 cm =  10 ms. (M= 10 y K=249).
; - Retardo_5ms  :	2 + 1 + 2 + (2 + 4M + 4KM) =   5007 cm =   5 ms. (M=  5 y K=249).
; - Retardo_2ms  :	2 + 1 + 2 + (2 + 4M + 4KM) =   2007 cm =   2 ms. (M=  2 y K=249).
; - Retardo_1ms  :	2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------
;
Retardo_20s				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'200'			; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_10s				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'100'			; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_5s				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'50'			; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_2s				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'20'			; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_1s				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'10'			; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_500ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'5'			; Aporta 1 ciclo máquina. Este es el valor de "N".
;
; El próximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
;   + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011
; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.
;
Retardo_1Decima
	movwf	R_ContC			; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
	movlw	d'100'			; Aporta Nx1 ciclos máquina. Este es el valor de "M".
	movwf	R_ContB			; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
	movlw	d'249'			; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA			; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno          
	nop				; Aporta KxMxNx1 ciclos máquina.
	decfsz	R_ContA,F		; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
	goto	R1Decima_BucleInterno	; Aporta (K-1)xMxNx2 ciclos máquina.
	decfsz	R_ContB,F		; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
	goto	R1Decima_BucleExterno	; Aporta (M-1)xNx2 ciclos máquina.
	decfsz	R_ContC,F		; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1Decima_BucleExterno2	; Aporta (N-1)x2 ciclos máquina.
	return				; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s:	2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
;			(N=200, M=100 y K=249).
; - Retardo_10s:	2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.
;			(N=100, M=100 y K=249).
; - Retardo_5s:		2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  5000207 cm =  5 s.
;			(N= 50, M=100 y K=249).
; - Retardo_2s:		2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  2000087 cm =  2 s.
;			(N= 20, M=100 y K=249).
; - Retardo_1s:		2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  1000047 cm =  1 s.
;			(N= 10, M=100 y K=249).
; - Retardo_500ms:	2 + 1     + (2 + 4N + 4MN + 4KMN) =   500025 cm = 0,5 s.
;			(N=  5, M=100 y K=249).


----------



## Power (Abr 19, 2008)

Hola veo que estan utilizando retardos aca les adjunto un programa q baje   hace un tiempo de internet, el cual genera el codigo assembler del retardo que uno desea
saludos


----------



## asherar (Abr 19, 2008)

gtec dijo:
			
		

> ...  lo saque del libro MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS



Será mucho pedir que me pases el autor y la editorial.
Lo siento, soy de los que fichan todo!
Editado: 
Dejá, ya lo encontré en Google! Editorial RA-MA.
Listo

Gracias


----------



## zoomg80 (Ago 7, 2008)

Si alguien mas necesita n retardo en ensamblador,  Lo he susado en pic16F84a y 873a.
Aproximadamente es de un segundo, cambiando los valores de variabl1 y 2 tendran menos tiempo. Recuerda que el valor maximo es de 255

saludos

Retardo movlw D'254'
              movwf variable1
LOOP4 movlw D'254'
           movwf variable2
LOOP5 decfsz variable2,F
            goto LOOP5
            decfsz variable1,F
            goto LOOP4
            return

Si necesitan mas tiempo pueden llamar la rutina anterior n veces los segundo que necesitan.

diezseg movlw D'10'
             movwf variable3
sunret   call Retardo                  ----> llamamos nuestro retardo de arriba
             decfsz variable3
             goto subret
             return

listo a probarlo .. saludos cordiales.


----------



## asherar (Ago 7, 2008)

zoomg80 dijo:
			
		

> Si alguien mas necesita n retardo en ensamblador,  Lo he susado en pic16F84a y 873a.
> Aproximadamente es de un segundo, cambiando los valores de variabl1 y 2 tendran menos tiempo. Recuerda que el valor maximo es de 255
> 
> saludos
> ...



Así te queda más monono... Me lo enseñó "el jefe".

Saludos !


----------



## seba666 (Oct 30, 2009)

alejandro sherar dijo:


> así te queda más monono... Me lo enseñó "el jefe".
> 
> Saludos !



me decis para que crystal es valido este retardo?


----------



## Chyryes (Oct 30, 2009)

Power dijo:


> Hola veo que estan utilizando retardos aca les adjunto un programa q baje   hace un tiempo de internet, el cual genera el codigo assembler del retardo que uno desea
> saludos



El programa me ha parecido bárbaro. Tiene muy buena pinta. Gracias por compartirlo


----------



## XIMENARANJA (Feb 16, 2010)

Muchas gracias por el programa! me sirvio bastante y me ahorro mucho trabajo


----------



## yonacho (Ago 17, 2010)

la libreria posteada es la del libro microcontroladores desarrollo de proyectos y es para usar con oscilador de 4Mhz, habra una para 20M?


----------



## sbjcm (Ago 18, 2010)

La libreria es buena, pero lo malo de los codigos en ensamblador es que incluso si solo se utiliza una rutina se ensamblará toda la libreria, ocupando lugar en la memoria. Es mejor utilizar un generador como el programa ese citado por alguien, pero hay uno que lo supera de lejos. Funciona on-line y lo pueden encontrar en: http://www.piclist.com/cgi-bin/delay.exe 
Por ejemplo, para generar un delay de 100 segundos con un XTAL de 20 MHz nos brinda lo siguiente:
; Delay = 100 seconds
; Clock frequency = 20 MHz

; Actual delay = 100 seconds = 500000000 cycles
; Error = 0 %

	cblock
	d1
	d2
	d3
	d4
	endc

			;499999993 cycles
	movlw	0xE2
	movwf	d1
	movlw	0xB6
	movwf	d2
	movlw	0x50
	movwf	d3
	movlw	0x04
	movwf	d4
Delay_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	$+2
	decfsz	d4, f
	goto	Delay_0

			;7 cycles
	goto	$+1
	goto	$+1
	goto	$+1
	nop
Si intentan hacer eso (delay de 100 grandes) con otros programitas, verán que se cuelgan.
Hay algo deinformacion extra sobre delays en http://www.cursomicros.com\mod1\c05_16_delays.html 
Saludos. bye.


----------



## mariano22 (Ago 18, 2010)

pregunto.. estos retardos funcionan en Visual basic 5?

un saludo!


----------



## flako32 (Abr 15, 2013)

Respetados,

Tengo problemas al generar mas de un retardo en el mismo programa con el primero funciona cuando llamo el segundo (que tendrá un tiempo diferente)el programa se ejecuta pero nada que ver con la programación .

El ejercicio es prender ocho leds en ocho secuencias diferentes pero no he podido usar mas de un retardo alguna sugerencia.

Saludos 

Flako32


----------



## Scooter (Abr 15, 2013)

Usad timers los retardos sólo para tiempos muy muy cortos.


----------



## flako32 (Abr 15, 2013)

Que buen foro es el primero que me responden gracias!!!

Bueno acá les dejo el Programa al final tengo do retardos pero cuando llamo el segundo falla y si llamo el tercero peor de loco se vuelve esto.

gracias,

Flako32

La simulacion de proteus no la puedo subir tengo como comprimirlo.





Scooter dijo:


> Usad timers los retardos sólo para tiempos muy muy cortos.




Disculpa cuando dices timers te refieres a relojes externos como el 555 ??? 
Precisamente eso no quiero usar pues me complico y ademas de este proyecto debo haer una calculadora con display y ya estoy proximo a entregar los trabajos pero he avanzado poco.

Gracias por tan pronta respuesta en lo que les pueda colaborar en software de XDCAM o equipos de vídeo me dicen.



flako32


----------



## Scooter (Abr 16, 2013)

Timer es un timer, dentro del micro hay varios y están para algo.
Bucles vacíos de mas de 1ms no gracias. De 1ms ya me parece una barbaridad mas que nada porque en ese tiempo un micro hace miles de operaciones y tirar por la ventana miles de algo nunca me gustó, si te compras un micro de chorromil MHz y luego lo paras...muy coherente no es, no.


----------



## flako32 (Abr 16, 2013)

Ok lo investigare espero me alcance el tiempo. Pues esta materia me esta volviendo loco.


----------

