Autor Tema: No lee el cambio de valor de entrada durante interrupcion por timer  (Leído 1766 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado diego3602

  • PIC10
  • *
  • Mensajes: 10
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
}
« Última modificación: 25 de Agosto de 2020, 12:51:32 por diego3602 »

Desconectado diego3602

  • PIC10
  • *
  • Mensajes: 10
Re:No lee el cambio de valor de entrada durante interrupcion por timer
« Respuesta #1 en: 25 de Agosto de 2020, 12:50:40 »
Psum es float
sig es int

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:No lee el cambio de valor de entrada durante interrupcion por timer
« Respuesta #2 en: 30 de Agosto de 2020, 16:29:52 »
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.


 

anything