subrutina de retardo de un segundo

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
 
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?
 
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
 
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.
 
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
 
; 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
 
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 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.
 
Atrás
Arriba