Sentencia IF en AVR Studio y WinAVR no funciona

#1
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;
}
 
#2
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....
 
#3
Muchisimas gracias tu consejo soluciono mi problema, declarando la variable como volatile, ya es respetada por el IF.

Gracias por la respuesta.
 
#4
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);
}

}
}
 

Temas similares

Arriba