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

[AVR-GCC] Zasięg zmiennych ?

gothye 07 Sie 2009 22:31 1560 6
  • #1 6868463
    gothye
    Poziom 33  
    Witam
    Nie mogę sobie poradzić z pewnym problemem o tuż , mam utworzoną komunikacje miedzy dwoma uC na TWI problem jest tylko po jednej stronie : SLAVE'a i wygląda tak :

    skrócony program :


    unsigned char status ;
    
    /* przerwania TWI */
    SIGNAL (SIG_2WIRE_SERIAL) 
    { 	
                cli();
    	// reszte kodu usunołem
    	/*
    		JEsli jest tak jak teraz ,master odbiera 10
    		send(10);
    		lecz kiedy zmienie na :
    	*/
    	
    	send(status);
    	// master odbiera wartosc 0 zmiennej ,po mimo tego że na nie może w tym programie przyjąć takej wartosci 
                sbi();
    }
    	
    
    int main()
    
    	while(1)
    	{
    		if(odczyt_z_adc > 100)
    		{
    			status = 100 ;
    		}else{
    			status = 10		
    		}
    	}
    }


    dlaczego tak sie dzieje że nie mam dostępu do wartości zmiennej ?
  • #2 6868495
    sokmarcin
    Poziom 20  
    Napisz może jeszcze gdzie masz zadeklarowaną tą zmienną i w jaki sposób. Może w funkcji trzeba zadeklarować jako extern?
  • #3 6868531
    gothye
    Poziom 33  
    zmienna zadklarowana jest jako char zaraz na początku programu zaraz po załączeniu potrzebnych bibliotek

    deklaracja funkcji jako extern void send(char data) nic nie wniosła :(
  • Pomocny post
    #4 6868535
    BoskiDialer
    Poziom 34  
    Nie masz dostępu do zmiennej, czy po prostu odczyt zawsze zwraca tą samą wartość (efekt braku volatile przy deklarowaniu zmiennej używanej przez przerwanie)? Bez "volatile" kompilator zoptymalizuje odwołania do zmiennej "status" w funkcji main - zmienna nie jest nigdy odczytywana (kompilator nie uwzględnia tego, że może przyjść przerwanie - widzi tylko aktualną funkcję oraz wywołania funkcji), a więc zapis zmiennej nie wystąpi, będzie tam cały czas wartość 0. Po komentarzu można wnioskować, że właśnie to jest problemem - "master odbiera wartość 0".

    ps. usuń z przerwania cli() oraz sei().
  • #5 6868585
    gothye
    Poziom 33  
    faktycznie to było to ;)volatile .Dzieki :!:
  • #6 6869328
    Freddie Chopin
    Specjalista - Mikrokontrolery
    No prosze, w życiu nie widziałem informacji o tym volatile na elektrodzie, w internecie czy w dowolnym kursie... ciekawe czemu to taka tajemnica...

    <sarkazm off>

    Czy ktokolwiek poza mną szuka czegokolwiek sam ZANIM założy temat?

    4\/3!!
  • #7 6869424
    Demoman
    Poziom 17  
    <offtop on>
    ja szukam xD
REKLAMA