Pues ya limpié la bandera de interrupción en RB1, pero aún cuando desborda el TMR0 atiende dos veces la rutina de interrupción y no se por que...es decir, no regresa a esperar el valor, y vuelve a atender la rutina de interrupción...¿Alguna Idea?
#include<p18f452.h>
#include<portb.h>
#include<timers.h>
#pragma config WDT = OFF
int temp, t1, t2, d;
void RAI(void);
void main(void)
{
TRISC = 0; // Puerto C salida
TRISB = 255; // Puerto B entrada
OpenRB0INT(PORTB_CHANGE_INT_ON & PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_ON);
OpenRB1INT(PORTB_CHANGE_INT_ON & PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_ON);
OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_1);
INTCONbits.GIEH = 1; // Activa la GIH
//INTCONbits.TMR0IE = 1; // Permite la interrupción por desborde de TMR0
while(1)
{
}
}
# pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh(void)
{
_asm
goto RAI
_endasm
}
# pragma code
# pragma interrupt RAI
void RAI(void)
{
if(INTCONbits.INT0IF == 1) // Si hay un flanco en RBO
{
temp = (unsigned char) ReadTimer0(); // Lee TMR0 de 8 bits
WriteTimer0( 0 ); // Reseteamos el TMR0
t2 = temp + (d*256);
d = 0;
INTCONbits.INT0IF = 0; // Limpiamos la bandera de interrupción
}
if(INTCONbits.TMR0IF == 1) // Si se desbordó el TMR0
{
d = d + 1; // Cuenta los desbordamientos
INTCONbits.TMR0IF = 0; // Limpiamos la bandera de interrupción
}
else
{
temp = (unsigned char) ReadTimer0(); // Lee TMR0 de 8 bits
t1 = temp + (d*256);
INTCONbits.INT0IF = 1; // Decimos que hay una interrupción
INTCON3bits.INT1IF = 1; // Se limpia la bandera de interrupción de en RB1
}
}
Gracias...