# subrutina de retardo de un segundo



## Ivan Alejandro Godoy (Jul 6, 2006)

necesito que alguien me pase una buena subrutina de una demora de un segundo exacto, para un proyecto escolar de un semáforo. usé uno del picdel y no se si es tan real o no. y si es real que alguien me lo confirme. muchisima gracias. IVAN


----------



## maunix (Jul 14, 2006)

Ivan Alejandro Godoy dijo:
			
		

> necesito que alguien me pase una buena subrrutina de una demora de un segundo exacto, para un proyecto escolar de un semáforo. usé uno del picdel y no se si es tan real o no. y si es real que alguien me lo confirme. muchisima gracias. IVAN



¿A qué llamas 1 segundo exacto?

¿Para que microcontroaldor lo quieres hacer?


----------



## Ivan Alejandro Godoy (Jul 21, 2006)

Gracias por responder. Yo necesito la duración de un segundo que tiene cualquier reloj. Lo quiero usar en un pic 16f84 y en un pic 16f877a. Se que tienen distinta frecuencia de trabajo, pero rengo ese dilema con el retardo.
las demoras del programa PICDEL son buenas?. Gracias. Ivan


----------



## mario18560 (Jul 21, 2006)

Hola:

1- Si lo que necesitas es una subrutina de temprorizacion y ya, utiliza con confianza el PICDEL.  

2- Si quieres hacerla "casera", te explico como.

Para hacer una rutina de 1 segundo exacto, tendras que  repetir un multiplo de veces una temporizacion mas pequeña basada en la cuenta del timer del PIC. Por ejemplo, si quieres 1 segundo, tendras que repetir 100 veces una tempo mas pequeña, de 10 ms por ejemplo (100 por 10ms = 1 segundo).
Para dicha tempo tienes que usar la formula:

Tempo de 10ms = 4 . Tclk . valor de cuenta de timer . prescaler

Ten en cuenta que los valores a setear en el timer dependeran de la frecuencia del oscilador con que el PIC trabaje, es decir Tclk = 1 / fclk, donde fclk es la frecuencia del cristal u oscilador que utilices.

Luego puedes cargar un registro auxiliar CONTA con el valor d'100' e irlo decrementando hasta 0. Cada vez que decrementes, deberas ejecutar tu tempo de 10ms. 
Si lo que quieres es 1 segundo muy exacto -el caso de un reloj-, tendras que seguir muy de cerca la cantidad de instrucciones que realizas luego de temporizar, calcular las diferencias que estas introducen en tu tempo, y compensarlas. 

Espero haberte sido util.

Un cordial saludo.


----------



## maunix (Jul 21, 2006)

Ivan Alejandro Godoy dijo:
			
		

> Gracias por responder. Yo necesito la duración de un segundo que tiene cualquier reloj. Lo quiero usar en un pic 16f84 y en un pic 16f877a. Se que tienen distinta frecuencia de trabajo, pero rengo ese dilema con el retardo.
> las demoras del programa PICDEL son buenas?. Gracias. Ivan



A lo que iba con el 'tiempo exacto' es que es 100% dependiente de la precisión del cristal que uses y del corrimiento que tenga en definitiva el circuito oscilador que va conectado al PIC.

Un corrimiento de un 0,01% hará que no obtengas 1.000000000000000000 segundos, sino algo 'similar' . 

Si quieres hacer un reloj, entonces tendrás problemas a la hora de hacer 'varios en serie', a eso apuntaba la pregunta.

Si quieres medir 1 segundo con una precisión de un reloj comun y solo lo usarás para medir ese segundo , como te dice mario está ok.

Ahora bien, si quieres hacer 'un reloj', te aseguro que tendrás grandes dolores de cabeza a la hora de ponerlo a punto.

Saludos


----------



## Ivan Alejandro Godoy (Ago 9, 2006)

Muchísimas gracias maunix y Mario por la ayuda, cuando tenga el proyecto terminado les cuento como me fue. hasta la próxima pregunta!!


----------



## ben99 (Ago 14, 2006)

; Code generated by PDEL  ver 1.0  on 14/08/2006 at 05:54:45 p.m.
; Description: Waits 1000000 cycles
;-------------------------------------------------------------
PDelay  movlw     .14       ; 1 set number of repetitions (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set number of repetitions (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set number of repetitions (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 cycles delay
PDelL2  clrwdt              ; 1 cycle delay
        return              ; 2+2 Done


----------



## ilpancho (Sep 23, 2006)

mario18560 dijo:
			
		

> Tempo de 10ms = 4 . Tclk . valor de cuenta de timer . prescaler




Buenas,  quisiera saber que estoy haciendo mal.  Trato de usar esa ecuación con y pic 16f877 a 20 mhz busco conseguir un retardo de un segundo.

me quedo  asi,   

4*(1/20*106)=200nseg

tiempo =  200nseg* 256*256 =13  10mseg

La deberia repetir  1seg/13mseg= 76 veces para lograr el segundo,  pero cuando lo hago correr no tarda un segundo sino practicamente medio segundo.  No entiendo por que, reseteo el tmr0 antes de empezar y limpio la bandera del mismo,  si alguien puede darme una mano, gracias.


----------



## natrix (Sep 24, 2006)

Normalmente la velocidad del cristal es el doble de la CPU multiplica por 2. He programado los ST7 y ese mismo efecto ocurre con el timer.


----------



## maunix (Sep 25, 2006)

natrix dijo:
			
		

> Normalmente la velocidad del cristal es el doble de la CPU multiplica por 2. He programado los ST7 y ese mismo efecto ocurre con el timer.



natrix, creo que estas errado.  Fíjate, está hablando de un PIC.  En los PIC la relación entre ciclo de instrucción y ciclo de clock es 1:4  .

Para un cristal de 20Mhz, el PIC procesará 5MIPs.


----------

