Buenas a todos!!
Estoy programando en MLAB XC32 V2.35
El problema es que no lee el cambio de una entrada digital en el interior de la ISR por timer cada 500ms. esto me tiene desconcertado, estoy leyendo en Teoría el valor del pin del puerto y no del latch.
La entrada se pone a 1 algunas veces durante el desarrollo de la interrupción.Esto esta chequeado con el osciloscopio, a alguien le ha pasado?
pongo un fragmento del código acá abajo: en negrita la parte con problemas en el caso lo que hice fue escribirle el valor de 36000 si llegase entrar al if. A estos valores los estoy sacando por la UART y leyendolo en la PC, esto funciona todo bien.
Alguna sugerencia?
void __ISR(_TIMER_3_VECTOR, IPL2) ISR_Timer3(void)
{
T500ms=T500ms+1;
Vsum = 0.0;
Isum = 0.0;
Psum= 0.0;
n=0;
adc1_aux=1023;
int min_reach=0;
for (m = 0.0; m < 18000.0; m++)
{
adc0 = ADC1BUF0;
adc1 = ADC1BUF1;
Delay10us(1.2);
if ((adc1<adc1_aux) && (min_reach==0))
{
adc1_aux=adc1;
}
else
{min_reach=1;}
Isum = (adc0 * adc0) + Isum;
Vsum = (adc1 * adc1) + Vsum;
sig = PORTReadBits(IOPORT_D,BIT_9);
if(sig==1)
{ Psum=36000.0;}
else
{ signo=1.0;}
n++;
}
contV = contV+1.0;
aux0 = (sqrtf(Isum/n)); //Valor rms de corriente
aux1 = (sqrtf(Vsum/n)); //Valor rms de tension
aux3= (Psum/n); //Valor de potencia activa
//Ief = aux0;
//Vsump = aux1 + Vsump; //editado 21/8/2020
//Vef=aux1; //=((Vsump) / contV); //Promedio de valor rms de tension
polyI=(aux0*0.0444180888); //Valor real de corriente eficaz
polyV=((0.0000002315028*aux1*aux1*aux1)-(aux1*aux1*0.00004815483)+(0.15030825*aux1)-0.17969562)+50; //Valor real de tension eficaz
polyP=aux3;
polyS=polyI*polyV;
pact_int=polyP;
sapa_int=polyS;
Ief=polyI*1000;
Vef_int=polyV;
cosp=(polyP/polyS)*1000; //multiplico el factor de potencia por mil
IFS0bits.T3IF = 0; //Limpia la bandera de interrupcion
}