TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Lagser en 18 de Julio de 2017, 12:24:42
-
Buenos días, tengo una duda sobre si el Timer1 del 16f877A me sirve para crear una interrupción que se active cada 10 minutos, la interrupción solo sería para recibir un valor por los puertos analógicos del pic. Lo que me tiene confundido es sobre si la carga del timer que debo hallar mediante la fórmula deben ser de esos 10 minutos o si debo hallar otro tiempo para que el ciclo principal se repita varias veces antes de que vuelva a la interrupción y lea el estado actual de voltaje que esta entrando por la entrada analógica, gracias de antemano.
-
El timer1 como todo Timer en realidad es un contador. Si contas la cantidad de pulsos que le llegan desde algun reloj podes saber el tiempo que paso.
En un microcontrolador se usan frecuencias siempre de 4Mhz o mas para alimentar el oscilador principal, esto quiere decir que el Timer va a contar de a 1 cada 1us ( 4/4Mhz ) lo cual es muy poco si te pones a pensar que el maximo que puede contar es de 65536, es decir 65.5ms aproximadamente. En 10 minutos es mucho.
En tu caso existe 2 formas de realizarlo.
-La primera opcion es usar otro cristal externo que sea de 32768Hz ( 32K ) ya que el Timer1 posee su propio oscilador para estos casos. De alli, podrias usar el preescaler de 1:8 asi solo entra una frecuencia de 4096, o que es lo mismo que cuente 1 cada 24.41ms, lo bueno es que al contar 4096 paso 1 segundo. Y suponete cada 40960 cuentas son 10 segundos.
Cuando entre a la interrupcion (10m * 60s/m)/10s = 60 veces, pasaron 10min
- La segunda opcion es usar el mismo oscilador que alimenta al nucleo, supongamos 8Mhz para dar un valor masomenos conocido.
Tendrias una cuenta cada 0.5us, si usas preescaler 1:8, seria lo mismo que contar cada 4us ( 0.5us * 8). Ahora habria que cargar el Timer con un valor.
Si quisiera tener un interrupcion cada 250ms por ejemplo, deberia contar 250ms/4us = 62500
Asi que si cargas el valor de 62499 tendrias una interrupcion cada 250ms. Y por supuesto, deberias contar cuantas veces entra en la interrupcion, para 10min es decir 600s. tendrias que contar unas 600s / 250ms = 2400 veces.
Las 2 formas son viables.
La segunda opcion puede que no te sea tan exacta, la primera va a tener menos error, la forma de solucionarla para que cualquiera de ambas situaciones no tengan tanto error es que uses el modulo CCP en modo Compare ( que te resetea solo el Timer1 ) y uses la interrupcion del CCP en ves de la del Timer. Y tambien usar un cristal, ya que el oscilador interno no es demasiado preciso.
-
hola en que lenguaje programas, yo lo hago en c y te puedo pasar unas lineas que si las entendes vas a lograr maravillas con el timer, saludos
-
Saludos, gracias por sus respuestas, voy a ponerme a trabajar para ver si entendí las explicaciones de KILLERJC, mi circuito esta funcionando con un cristal externo de 20Mhz debido a que estoy usando las salidas de pwm del pic para disparar un mosfet de potencia, pero me diste una idea genial para el problema de los 10 minutos, solo tendré en cuenta el tiempo que demore en entrar en la interrupción y dentro de la misma interrupción usaré un condicional que se accione a los 10 minutos y luego resetee las variables, ya contaré como resulta todo.
Con respecto a w3-sistemas, si ando trabajando en C, sería genial si pudieras pasar esas líneas, serían de gran ayuda, gracias de antemano.
-
adjunte un timer, en c leelo y si no lo entendes trato de explicartelo, ahi tenes desde 1 segundo hasta 1 minuto, como el maximo es 255, tendria 255 segundos maximo a 255 minutos maximo
-
Ya pude resolver mi problema, muchas gracias a ambos, tanto el código de ejemplo como los consejos me fueron de mucha ayuda.