Pienso que tu profesor deberia facilitarles la vida y usar el compilador actual. Menos problema para ustedes y mas soporte para los nuevos micros.
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.
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.