TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: AcoranTf en 04 de Octubre de 2011, 18:25:44
-
Hola, necesito realizar un temporizador de 30 minutos, pero si durante ese tiempo se produce un cambio en una señal externa, debe resetearse el conteo y empezar de nuevo. Resumiendo es algo similar a como funciona el Wachdog de los micros, pero con un tiempo muchisimo mayor.
Tengo escrito el temporizador, sacado y adaptado de un codigo que encontre por internet. Consiste simplemente en una espera de 1.800.000 ms. Y la idea es agregarle una interrupcion de modo que la active la señal esterna, pero no se exactamente como volver al principio del while(true), en el retorno de la interrupcion, para empezar el ciclo de nuevo.
Se que este sistema no es el mas optimo y tambien he pensado en poner varios temporizadores parciales anidados, de modo que sea mas versatil, pero no se por cual decidirme.
Mis dudas son:
Si lo hago con un "delay_ms(1800000)":
¿tendre problemas con el tratamiento de las interrupciones?.
¿como regreso al punto anterior al while(true), para empezar el ciclo de nuevo?
Si lo hago con temporizadores parciales anidados, basicamente las dudas son las mismas.
Espero que alguien me pueda achar una mano.
Saludos.
-
No puedes poner ese valor dentro del delay_ms, pues solo admite valores de 16 bits. Es decir, el maximo que puedes poner es 65535, que valdrian a ser un minuto con 5 seg aprox.
De esta forma, tendrias que hacer un contador de segundos con el timer0. Es mas conveniente hacerlo asi, existe muchos ejemplos de como hacer contadores en el foro, buscalos.
-
Gracias por responder jeremylf, como aun no lo probe en la practica y ademas estoy empezando con la programacion de PIC, no sabia eso, pero me confie poruq el compilador de CCS no me dio ningun error al compilar.
En ese caso solo me queda la segunda opcion, o sea anidar varios temporizadores hasta sumar el total, pero aun me queda la duda de como retornar a la entrada del programa principal desde la interrupcion, o sea justo antes del while(true).
Saludos.
-
No te da error porque al sobrepasar 0xFFFF (65535) se pone de nuevo a 0 y asi sucesivamente.
Por lo otro, si quieres practicamente volver al principio del main, puedes usar el reset_cpu().
-
Tiene que poner una variable que se llame por ejemplo "interrupcion" y que se active si hay una interrupcion y que si se da dentro del while resetee el conteo del timer.
-
Gracias soymoe, el problema es que en CCS no tengo manera de hacer eso una vez arranque la espera delay_ms(XXXX), al menos yo no lo veo. Una vez llegue a ese punto y cuando regrese de la interrupcion, creo que seguira por donde iba con los contadores.
Y respecto a utilizar el reset_cpu, podria ser una solucion, pero que representa otro problema, ya que en el momento del reset, la salida del pic quedara desactivada hasta que el programa vuelva a activarla unos milisegundos despues, con lo que se interrumpira la alimentacion al circuito controlado, cosa que no puede ocurrir.
Saludos.
-
Efectivamente no podes interrumpir la función delay :? .
Hay que buscar otra forma... se me ocurre que tal vez podrías hacer un ciclo do-while en el cual vayas incrementando un contador cada vez que se desborda el timer0 -dicho contador sería el que te daría los 30 minutos-. Dentro del ciclo sí podrías evaluar si se activo la interrupción externa y si ocurrió sólo basta con resetear el contador y el timer0 y así te aseguras que la cuenta comenzará nuevamente desde 0.
-
Que curioso, abri este hilo cuando empezaba con el lenguaje C y como no le vi una solucion facil, lo hice con un 555 y me olvide de este hilo. Tampoco sabia como buscar mis comentarios en este foro. Pues como decia me olvide del hilo y ahora buscando info y ejemplos del PIC12F675, lo volvi a encontrar.
Gracias AngelGris por tu aporte, aunque con un "poco" de retraso. :D ;-)
Por cierto ahora que se un poquito mas de C, voy a ver si acabo este proyectito.
Saludos.