subrutina de retardo de un segundo

#1
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
 
#2
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?
 
#3
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
 
#4
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.
 
#5
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
 
#7
; 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
 
#8
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.
 
#10
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.
 

Temas similares


Arriba