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 } }
}