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

[ATtiny2313][AvrStudio] Problem z przerwaniem

ryjek_ 29 Gru 2008 23:48 1199 2
  • #1 5921748
    ryjek_
    Poziom 10  
    Piszę program na ATtiny2313 w AvrStudio. Mam najnowszą wersję kompilatora, podobnie jak WinAvr'a. Kod będzie "mrygał" zestawem diód. Na porcie przerwania jest przycisk, którym będzie można zwiększać wartość opóźnienia, z jakim mają się zapalać diody.

    Program reaguje na samo przerwanie [wrzuciłam tam w celu testowania mryganie diodami i mrygały bez problemu], nie reaguje jednak na zmianę wartości zmiennej opoznienie. Zdaję sobie sprawę z tego, że zmienna ta powinna być zadeklarowana jako volatile, jednak kiedy ja tak deklaruję, przy kompilacji wyskakuje błąd "gcc plug-in: Error: Object file not found on expected location D:\Sterownik_Diody\CAFE_Diody\default\CAFE_Diody.elf".

    Sprawdziłam na wszystkich poziomach optymalizacji (na 00 też).

    Czy ktoś może mnie wesprzeć radą?


    
    #include <avr/io.h>
    #define F_CPU 1000000UL
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    
    volatile int opoznienie;
    
    
    int main (void)
    {
    
    	TCCR1B = _BV(ICNC1)|_BV(ICES1)|_BV(CS11)|_BV(CS12);
    	GIMSK = _BV(INT1); 
    	MCUCR=~_BV(ISC11)|~_BV(ISC10); 
      	sei();
    
    	
    	DDRB = 0xFF;           
    	DDRD = 0x70;
    	DDRA = 0x00;
    
    	PORTB=0xFF;
    	
    	opoznienie = 1000;
    	int i;
    
    	while(1){
    		
    		sei();
    		PORTB = 0xFE;
    		_delay_ms(opoznienie);
    		PORTB = 0xFC;
    		_delay_ms(opoznienie);
    		PORTB = 0xF8;
    		_delay_ms(opoznienie);
    		PORTB = 0xF0;
    		_delay_ms(opoznienie);
    
    		PORTB = 0xFF;
    		_delay_ms(opoznienie);
    
    		sei();
    
    		
    		for(i=0; i<3; i++){
    		
    			PORTB = 0x00;
    			_delay_ms(opoznienie);
    				
    			PORTB = 0xFF;
    			_delay_ms(opoznienie);
    		}
    		sei();
    	
    	}
    
    
    	return 0;
    }
    
    
    SIGNAL (SIG_INTERRUPT1) 
    { 
    	cli(); 
    	_delay_ms(300);
    	opoznienie = opoznienie + 1000;
    }
    
    
  • #2 5922214
    skynet_2
    Poziom 26  
    Po 1: _delay_ms służy do wstawienia opóźnienia o stałej wartości, jeżeli potrzebujesz zmienne opóźnienia używasz funkcji np.
    void _delay_s(int x)//lepiej dać uint8_t
    {
     while(x--) _delay_ms(1000);
    }//odwołujesz się przez _delay_s(opoznienie);

    Po 2: nie wiem po co dajesz cli(); w przerwaniu ? i tyle sei(); ? wystarczy jedno na początku main.

    twój program mi się również nie kompiluje dla attiny2313 na WinAVR-20081205.

    prawdopodobny bład to _delay_ms(opoznienie);
    po zastosowaniu funkcji podanej powyżej[_delay_s] program się ładnie skompilował, jak i zmniejszyła się jego objętość

    lepiej używaj int8_t, uint8_t, int16_t, uint16_t zamiast int.
    http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html

    i oczywiście polecam przeczytać
    http://avr.elektroda.eu/?q=node/8
    http://www.nongnu.org/avr-libc/user-manual/modules.html
    szczególnie http://pl.wikibooks.org/wiki/C

    Pozdrawiam skynet_2
  • #3 5922724
    ryjek_
    Poziom 10  
    Dzięki za rady. Rzeczywiście pomogło zmniejszyć znacznie kod.

    
    AVR Memory Usage
    Device: attiny2313
    
    Program:     362 bytes (17.7% Full)
    (.text + .data + .bootloader)
    
    Data:          1 bytes (0.8% Full)
    (.data + .bss + .noinit)
    



    Mogę zadeklarować już zmienną opoznienie jako volatile (nie ma błędu kompilacji), ale dostaję za to takiego kwiatka:


    
    AVR Memory Usage
    Device: attiny2313
    
    Program:    4398 bytes (214.7% Full)
    (.text + .data + .bootloader)
    
    Data:        265 bytes (207.0% Full)
    (.data + .bss + .noinit)
    


    Skąd taki nagły przyrost? W jaki sposób zdefiniować zmienną opoznienie żeby całość działała zgodnie z oczekiwaniami?

    Dodano po 55 [minuty]:

    Dobra już wszystko działa. W jednym miejscu zamiast _delay_s miałam _delay_ms...

    Temat uważam za zamknięty ;]
REKLAMA