Sentencia IF en AVR Studio y WinAVR no funciona

Que tal comunidad.

Espero alguien me pueda ayudar, he programado con AVRStudio en ASM sin problemas, pero empece a programar en C untilizando WinAVR, y todo iba bien hasta que empeze a utilizar sentencias IF, ya que no me funcionaron, entraba al IF aun cuando no correspondia el valor de la variable a la pregunta del IF, o no entra cuando si corresponde el valor.
Utilizo las ultimas versiones de ambos programas, y nose que hacer.

Un ejemplo: En este programa la variable MODE le asigno el valor 0 por defaul, y cuando ocurre la interrupcion del Timer0 se cambia su valor, pero el IF no le hace caso y sigue sin entrar en if (MODE==1), como si el valor no hubiese cambiado, este programa no tiene ningun propocito, solo mostrar lo que no funciona con el IF, gracias.


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned int MODE;
int main(void)
{
MODE=0;
DDRB = 0xff;
TCCR0=0x01;
TIMSK=0x01;
TCNT0=0xF5;
sei();
while(1)
{
if (MODE==1) {
PORTB=0x00;
}
if(MODE==0){
PORTB=0xFF;
}
}
}
ISR(TIMER0_OVF_vect) {
MODE=1;
}
 
Algunas veces el WinAVR como que optimiza demasiado, si detecta que una variable no es usada dentro de una rutina simplemente la elimina sin preguntar nada.... para evitarlo tienes 2 opciones... declarar la variable como volatile (volatile unsigned int MODE;) o en las opciones del compilador cambiar el nivel de optimizacion por algo menos drastico.... solo que el programa va a pesar un poco mas...

En tu caso como usas interrupciones creo que seria mejor declararla como Volatile, pero eso si... trata de no abusar del nivel de optimizacion o del volatile por que el programa se puede volver muy grande muy rapidamente....
 
Muchisimas gracias tu consejo soluciono mi problema, declarando la variable como volatile, ya es respetada por el IF.

Gracias por la respuesta.
 
yo utilizo el if tb en avr studio 5 y me pasa lo mismo, no funciona, pero hago lo siguiente a ver si pueden orientarme y saber cual es el error:

#include <avr/io.h>
int main(void)
{ DDRD=0b00000000; //PUERTO C COMO ENTRADA
PORTD=0X00;
DDRB=0b00000001; //PINB0 COMO SALIDA PINB1-7 COMO ENTRADA
PORTB=0X00;

while(1)
{
if (PIND0==0)
{
PORTB|=(1<<PINB0);
}
else
{
PORTB&=~(1<<PINB0);
}

}
}
 
Atrás
Arriba