Calculando los retardos

Estado
Cerrado para nuevas respuestas.
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.
 
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? :D

Saludos!
 
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).
 
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
 

Adjuntos

  • calcular_retardos_101.zip
    90.2 KB · Visitas: 997
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
 
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.
 
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

Código:
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.

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

Saludos !
 
la libreria posteada es la del libro microcontroladores desarrollo de proyectos y es para usar con oscilador de 4Mhz, habra una para 20M?
 
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.
 
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
 
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.



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
 

Adjuntos

  • FALLA AL LLAMAR EL SEGUNDO.txt
    7.4 KB · Visitas: 19
Última edición:
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.
 
Última edición:
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba