Autor Tema: retraso de 2 seg  (Leído 2432 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nacha4

  • PIC16
  • ***
  • Mensajes: 113
retraso de 2 seg
« 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

Desconectado PAOLA09

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 332
Re: retraso de 2 seg
« Respuesta #1 en: 25 de Abril de 2006, 19:23:46 »
Hola
nacha4 puedes decirnos en que lenguaje deseas hacer dicho retraso?

Desconectado Toph

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 84
Re: retraso de 2 seg
« Respuesta #2 en: 25 de Abril de 2006, 19:25:19 »
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: 

Código: [Seleccionar]
;-------------------------------------------------------------
; 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/  el programa es calcular_retardos

tambien podrias utilizar un temporizador

saludos, espero te sirva  :)
« Última modificación: 25 de Abril de 2006, 19:36:27 por Tania_D »

El tiempo perdido es dificil de recuperar, trata de no desperdiciarlo
atrevete de vez en cuando a hacer algo nuevo
¿Sera este el año que tanto he deseado?

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: retraso de 2 seg
« Respuesta #3 en: 25 de Abril de 2006, 23:26:52 »
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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado nacha4

  • PIC16
  • ***
  • Mensajes: 113
Re: retraso de 2 seg
« Respuesta #4 en: 25 de Abril de 2006, 23:54:45 »
gracias a todos ya solucione mi problema son una gran ayuda
Nacha4


 

anything