Tengo que detectar una señal por un cierto tiempo que viene de otro pic y yo quiero hacer una interrupción por Rb0 para leer esa señal el tema es que esa señal tiene un principio y un fin mi consulta es si dentro de la interrupción puedo poner un tmr0 y controlar 2 tiempos o 2 interrupciones una con nada tiempo una por flaco de subida y otro por flanco de bajada.
Pienso que tu profesor deberia facilitarles la vida y usar el compilador actual. Menos problema para ustedes y mas soporte para los nuevos micros.hola. gracias por contestarme el tema es asi:CitarTengo que detectar una señal por un cierto tiempo que viene de otro pic y yo quiero hacer una interrupción por Rb0 para leer esa señal el tema es que esa señal tiene un principio y un fin mi consulta es si dentro de la interrupción puedo poner un tmr0 y controlar 2 tiempos o 2 interrupciones una con nada tiempo una por flaco de subida y otro por flanco de bajada.
Si lo que deseas es saber cuanto tiempo estuvo en 1 la señal, o en 0. Los PICs (dependiendo de cual sea) trae un modulo que se llama CCP, Capture-Compare-PWM, en el cual te seria ideal, donde tendrias una interrupcion cada ves que detecte algun flanco y te guardaria el valor del Timer, usualmente el Timer 1. De esa forma solo te queda hacer una resta.
Esto lo podes hacer con el RB0, si necestas detectar el pulso en alto, lo que haces es configurar el RB0 en flanco ascendente. Cuando entra la interrupcion, pones a 0 el timer que sea, activas la interrupcion del timer y finalmente cambias el disparo de RB0 a flanco descendente. Cuando entre de nuevo guardas el valor del timer, desactivas la interrupcion del timer, cambias a flanco ascendente de nuevo ( para el proximo ), y ahora si calculas el valor.
¿Por que activar la interrupcion del timer?
El TMR0 es de 8 bits, suponete que lo configuras como vos deseas, pero un pulso excede la cuenta de esos 8 bits, suponete que al comenzar lo tenes en 0, pero al volver luego de 260 cuentas del TMR0 lees y te vas a encontrar con el numero 4, lo cual si haces la resta 4 - 0, no es correcto. ya que estuvo 260 ciclos.
Si en la interrupcion del TMR0 sumas en algun otro registro cuantas veces paso de 255 a 0, y lo guardas suponete que en una variable. Solo te resta hacer:
variable * 256 + resta_del_timer
Esto es muy absurdo ya que multiplicar por 256 es lo mismo que correr el byte ese 8 lugares.
variable << 8 + resta_del_timer
O directamente si queres usar 1 sola variable para todo, crea una de 16bits, cuando entre a la interrupciones del timer le sumas 256, y cuando entre a la de RB0 calculas la resta y se lo sumas.
De esa forma vas a tener la cantidad exacta de ciclos.
Todo esto si los pulsos que llegan por el TMR0 son mas grandes que lo que puede almacenar.
---------------------------------
Por otro lado, este representa un error, Cuando se esta en una interrupcion, el mismo microcontrolador desactiva todas interrupciones. Y las vuelve activar por si solo al salir.
El error se puede presentar que si esta atendiendo la interrupcion del TMR0, puede haber algunos ciclos mas hasta que salga de la interrupcion, y vuelva a entrar a causa del RB0.
Es decir si se produce una interrupcion, la otra interrupcion deberia esperar a que termine la anterior para ejecutarse, a no ser que tengas suerte y ocurra en algun punto exacto del codigo.
Espero que te saque las dudas esto.
Otra forma de hacerlo lo había pensado por una interrupción por rb0 por flanco de subida y con el timer1 comparar 2 variables y restarlas y si estoy dentro de los valores permitidos me habilite una bandera y comiénce un contador por timer0 que cuente durante 5 segundos. Y si no está en los márgenes adecuados me apague la salida.//////////////
cuando detecta una señal cuadrada de 4ms de periodo durante mas de 5 segundos, activa una señal H para habilitar el motor.
1. como hago para tomar el valor del timer0? osea yo tengo que tomar algun valor de la interrupcion del timer?
2. yo tengo 2 interrupciones no? pero en la de rb0 adentro tengo un timer0 como temporizador? (que me lee el bit INTDEG o tengo solo una rb0 que me ve el flanco y la del timer como contador?
3. no me queda claro como se relacionan cada una...Ya lo vas a ver cuando ponga el codigo. Si aun asi te quedan dudas las resolvemos. Pero un resumen seria:
4.para usar el timer0 como contador necesito usar TOCS=1 y un flanco usando TOSE (ya sea 0a1 o 0a1)por RA4 no? osea tengo que usar esa opcion si o si?El Timer en si es un contador.. nomas que cuando se le llama "Temporizador" lo unico que hace es contar los pulsos del reloj interno. Mientras que se le llama "Contador" cuando cuenta pulsos externos. Aca no necesitamos ningun pulso externo, debemos usar los pulsos del mismo oscilador, ya que sabemos con certeza cuanto tarda cada uno.
5. hay 2 banderas? o yo entendi mal y la bandera que me habilita si esta en 1 en la comparacion es el TOIF para entrar a la interrupcion por TIMER0?