TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: nacha4 en 25 de Abril de 2006, 18:34:31
-
hola necesito hacer un retraso de 2 segundos que mientras no se cumpla ese plaso haga algo distinto y no puedo usar las interrupciones como lo pocre hacer
Nacha
-
Hola
nacha4 puedes decirnos en que lenguaje deseas hacer dicho retraso?
-
pues puedes hacerlo usando instrucciones comunes, puedes utilizar el programa para calcular retardos, tu le indicas cuantos milisegundos quieres (en tu caso 2000) y la frecuencia del cristal que usaras, yo lo hice metiendole los siguientes datos: 4MHZ y 2000ms o sea 2 seg y obtuve:
;-------------------------------------------------------------
; Generado con PDEL ver SP r 1.0 el 24/04/2006 Hs 16:58:59
; Descripcion: Delay 2000000 ciclos
;-------------------------------------------------------------
DEMORA movlw .167 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .41 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .72 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
Requerimientos
-----------------
- Declaracion de PDel0 (registro)
- Declaracion oe PDel1 (registro)
- Declaracion de PDel2 (registro)
- 1 nivel Stack
Ejemplo de uso
--------------
call DEMORA ; Delay 2000000 ciclos (incluyen call+return)
este programa lo puedes descargar aqui http://www.todopic.com.ar/utiles/ (http://www.todopic.com.ar/utiles/) el programa es calcular_retardos
tambien podrias utilizar un temporizador
saludos, espero te sirva :)
-
hola necesito hacer un retraso de 2 segundos que mientras no se cumpla ese plaso haga algo distinto y no puedo usar las interrupciones como lo pocre hacer
Nacha
Para hacer un retardo tan largo y que encima estes 'haciendo otras cosas' te puedo tirar una sugerencia (que no la he visto aquí) por eso la posteo.
No has especificado que pic usas, pero cualquiera tiene un timer. Entonces, podrias configurar un retardo de por ejemplo 10mseg. Al llegar a esa cuenta (si usas un timer en realidad debes setear el valor máximo que puede tomar el timer - el delay deseado ) . Por eso te pido que especifiques para que pic es así te puedo tirar alguna sugerencia más precisa.
Volviendo al tema, al terminar la cuenta de 10mseg se activará el flag del timer. T0IF, TMR1IF, TMR2IF, TMR3IF, depende del pic que uses y del timer que hayas elegido.
En tu rutina, tienes 10mseg para hacer cosas. Al final de hacer esas cosas, verificas si está encendida la bandera del timer, si no lo está.... vuelves a hacer las cosas. Así hasta que la bandera esté encendida.
Al estar encendida, vas a la rutina de manejo del tiempo.
Borras la bandera, incrementas un contador en 1 y te fijas si es igual a 200. Si es diferente vuelves a ejecutar el bloque principal del programa, si es igual a 200 sales!. El numero 200 es porque 200 x 10mseg = 2 segundos.
En bloques quedaría algo asi
1) Inicializacion Timer y configuracion del pic. Variable TIEMPO=0
2) Bloque principal de programa
3) ¿Esta el flag encendido? Si es NO, vuelve a 2) , si es SI va a 4)
4) Borra Flag, Reconfigura Timer para retardo de 10mseg, incrementa contador de TIEMPO en 1.
5) TIEMPO = 200? NO, vuelve a 2) SI va a 6)
6) Fin de la rutina
Como ves, siempre se ejecuta el bloque principal, la precisión.... y dependerá de cuan largo sea el bloque principal de programa. Al no contar con la posibilidad de interrupciones se pierde precisión. Si el bloque principal es muy extenso y lo más importante es la temporizacion, entonces te sugiero que verifiques la bandera del timer varias veces dentro del código principal.
Espero haber sido claro, si posteas algo más de detalle del micro y el timer elejido por ahi te podamos ayudar con el código.
Saludos
-
gracias a todos ya solucione mi problema son una gran ayuda
Nacha4