TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: diego3602 en 25 de Agosto de 2020, 12:49:12
-
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
}
-
Psum es float
sig es int
-
Prueba al desactivar las interrupciones a la entrada en el handler. Es posible que esté reentrando sucesivamente y no le dé tiempo ni a leer el puerto.