Uso de interrupciones para iluminar un LED

1

Principiante aquí, simplemente jugando con un devboard usando un PIC micro. Estoy intentando iluminar un LED usando una interrupción, he creado la siguiente función dentro de isr.c, INTOSC se ejecuta a 4MHz, TMR0 a 1MHz con un prescaler de 1: 128. Las variables segundo y mSecond se definen como 100 en mi función de inicialización; ledOnTime y ledOffTime se inicializan en 0 en la misma función; GP2 y GP4 son los pines atados a mis LED como se puede ver en mis comentarios.

En primer lugar, ajusté el tiempo de mi interrupción en función de mis lecturas de alcance, los cálculos que hice de antemano hicieron que sucediera con demasiada frecuencia, así que disminuí la velocidad hasta donde mis pulsos coincidían con lo que estaba buscando. Hice los cálculos al revés, y todavía no se acumulan en mi mente. Tal vez alguien me puede dar una pista de por qué.

Otra cosa que no puedo entender es por qué cuando incremento una de las variables (segundo o mSegundos) aumenta el tiempo en que mis LED permanecen apagados. Lo que estoy tratando de aumentar es el tiempo que permanecen. Pensaría que de acuerdo con la forma en que lo escribí, mSecond debería hacer eso, pero a partir de mis resultados en la programación del micro no lo hace, y me ha desconcertado. ¿Puede alguien explicar lo que está pasando aquí?

if (TMR0IF){
    TMR0 += 162;                       // overflow 93 (at approx every 10 millisecs)
    TMR0IF = 0;                        // reset overflow flag

    if (ledOffTime == second){         // every second
        ledOffTime = 0;
        GP2 = 1;                       // turn lights on
        GP4 = 0;                       // bicolor led on
        if(ledOnTime == mSecond){      // every 100 millisecs
            ledOnTime = 0;             // reset on time count
            GP2 = 0;                   // turn lights off
            GP4 = 1;                   // bicolor led off
        }
        else{
            ledOnTime++;               // keep LEDs ON
        }
    }
    else{
        ledOffTime++;                  // keep LEDs OFF
    }
    system_ok = 1;
}

Se encontró una solución, algunas variables y registros de configuración cambiaron:

  • prescaler TMR0 1:64
  • SEGUNDO = 440
  • MSECOND = 40

    if (TMR0IF){
    TMR0 += 217;                         // approx 2.5 msecs
    TMR0IF = 0;                          //reset overflow flag
    
    if (++ledOffTime >= SECOND){         // Every second 
        ledOffTime = 0;                  // Clear off time count
        ledsOn = true;                   // LEDs are on
        GP4 = 0;                         // Bicolor LED
        GP2 = 0;                         // Turn LEDs on
    }
    if(ledsOn == true){                  
        if(++ledOnTime > MSECOND){   
            ledOnTime = 0;              // Reset on time count
            ledsOn = false;             // LEDs are off
            GP4 = 1;                    // Bicolor LED
            GP2 = 1;                    // LEDs are off
        }
    }    
    

    }

pregunta wanderbread

1 respuesta

1

Se encontró una solución, algunas variables y registros de configuración cambiaron:

prescaler TMR0 1:64 SEGUNDO = 440 MSECOND = 40

if (TMR0IF){
TMR0 += 217;                         // approx 2.5 msecs
TMR0IF = 0;                          //reset overflow flag

    if (++ledOffTime >= SECOND){         // Every second 
        ledOffTime = 0;                  // Clear off time count
        ledsOn = true;                   // LEDs are on
        GP4 = 0;                         // Bicolor LED
        GP2 = 0;                         // Turn LEDs on
    }
    if(ledsOn == true){                  
        if(++ledOnTime > MSECOND){   
            ledOnTime = 0;              // Reset on time count
            ledsOn = false;             // LEDs are off
            GP4 = 1;                    // Bicolor LED
            GP2 = 1;                    // LEDs are off
        }
    }    
}
    
respondido por el wanderbread

Lea otras preguntas en las etiquetas