logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Attiny13, zmienne globalne.

djmdp 25 Lis 2009 11:00 1535 5
  • #1 7306117
    djmdp
    Poziom 16  
    Witam, mam taki problem, że w kodzie zmienna globalna jest tj nie widziana przez program, podam przykład i wytłumacze:

    
    #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.
  • #2 7306123
    snow
    Poziom 31  
    Zdefiniuj jako volatile int
  • #3 7306134
    mirekk36
    Poziom 42  
    djmdp napisał:
    ... więc albo ja czegoś nie rozumię albo coś nie tak z kompilatorem?? .


    na 100% ty czegoś nie rozumiesz i proponuję ci abyś na długo długo odpuścił sobie domniemania, że coś nie tak jest z kompilatorem. Szukaj zawsze u siebie błędu

    i poczytaj o nudnym już na elektrodzie - volatile

    Nudnym - bo typ zmiennej volatile a w zasadzie ten problem występuje już co w drugim poście, niedługo będzie w każdym chyba ;)
  • #4 7306145
    djmdp
    Poziom 16  
    a, dzięki dzięki, już się za to zabieram, a dlaczego na atm32 ten sposób działa?

    Faktycznie, z volatile działa bez problemu na attiny. Dziękuję za podpowiedź.:)
  • #5 7306158
    mirekk36
    Poziom 42  
    to volatile nie odnosi się do jakiegoś tam procka więc nie wiąż tego z tym, że na tiny ci działa a na atmega32 działa bez volatile.

    na atmega32 mogłeś mieć inaczej napisany kod

    poczytaj właśnie dokładniej o volatile to zrozumiesz kiedy i dlaczego trzeba używać tegoż mechanimu ;)
  • #6 7306170
    djmdp
    Poziom 16  
    Wielkie dzięki, to własnie moja ostatnia zmora, bo nie mogłem dojść dlaczego tak się dzieje:) już czytam:) temat out.
    Właśnie znalazłem "Volatile" w moich materiałach dydaktycznych:
    "Główne zastosowanie tego mechanizmu to zabezpieczanie zmiennych używanych w przerwaniach (wartość zmiennej może być w każdej chwili uaktualniona przez czynnik zewnętrzny - przerwanie - i nie można w związku z tym pominąć żadnej związanej z nią operacji w GŁÓWNEJ PĘTLI PROGRAMU) "
REKLAMA