Witam, mam taki problem, że w kodzie zmienna globalna jest tj nie widziana przez program, podam przykład i wytłumacze:
Na początku programu, gdy nie ma przerwania Timera, wartość flag = 0, więc instrukcja if wchodzi w else i wywołuje RED_LED_OFF, natomiast po przerwaniu wartość flag=1 i instrukcja if powinna uruchomić funkcję RED_LED_ON, a tak nie jest, cały czas pozostaje w pozycji RED_LED_OFF czyli tak, jakby flaga nadal była 0. W atmedze 32 nie było takich problemów, więc albo ja czegoś nie rozumię albo coś nie tak z kompilatorem?? proszę o sugestie. To tylko fragment zamierzonego programu.
#include <avr/io.h>
#include <avr/interrupt.h>
#define GREEN_LED_ON PORTB |= 0x1;
#define GREEN_LED_OFF PORTB &= 0xFE;
#define RED_LED_ON PORTB |= 0x2;
#define RED_LED_OFF PORTB &= 0xFD;
#define RELAY_ON PORTB |= 0x10;
#define RELAY_OFF PORTB &= 0x2F;
/*ZMIENNE GLOBALNE*/
int flag;
ISR(TIM0_COMPA_vect)
{
flag=1;
}
void init()
{
DDRB = 0b010011;
PORTB |= 0x8;
TCCR0A |= 0x2;
TCCR0B |= 0x1; /*Ustawienie timera*/
TIMSK0 |= 0b00000100;
OCR0A = 94;
}
int main()
{
init();
sei();
while(1)
{
if (flag)
{
RED_LED_ON;
}
else
{
RED_LED_OFF;
}
}
return 0;
}
Na początku programu, gdy nie ma przerwania Timera, wartość flag = 0, więc instrukcja if wchodzi w else i wywołuje RED_LED_OFF, natomiast po przerwaniu wartość flag=1 i instrukcja if powinna uruchomić funkcję RED_LED_ON, a tak nie jest, cały czas pozostaje w pozycji RED_LED_OFF czyli tak, jakby flaga nadal była 0. W atmedze 32 nie było takich problemów, więc albo ja czegoś nie rozumię albo coś nie tak z kompilatorem?? proszę o sugestie. To tylko fragment zamierzonego programu.
