Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATMEGA8][C] Reset zamiast przerwania

mkkomp 28 Dec 2010 23:24 5655 54
  • Helpful post
    #31
    LordBlick
    VIP Meritorious for electroda.pl
    1. Na poczatku użyłeś obecnie obowiązująca formę w odniesieniu do przerwania INT1 :
    ISR(INT1_vect)
    a teraz starszą w odniesieniu do przerwania INT0
    SIGNAL(SIG_INTERRUPT0)
    Czy zainstalowałeś starszą wersję WinAVR ?
    2. O co chodzi z :
        asm volatile ("WDR"::); 
    i jak to się ma do
       _delay_ms();
    skoro w programie nie widzę konfiguracji watchdoga ?
    #define WDP_16K		0									// ~16ms
    #define WDP_32K								(1<<WDP0)	// ~32ms
    #define WDP_64K				(1<<WDP1)					// ~64ms
    #define WDP_128K			(	(1<<WDP1)|	(1<<WDP0))	// ~0,13s
    #define WDP_256K	(1<<WDP2)							// ~0,26s
    #define WDP_512K	((1<<WDP2)|				(1<<WDP0))	// ~0,5s
    #define WDP_1M		((1<<WDP2)|	(1<<WDP1))				// ~1s
    #define WDP_2M 		((1<<WDP2)|	(1<<WDP1)|	(1<<WDP0))	// ~2s
    WDTCR=(1<<WDCE | 1<<WDE);
    WDTCR=(WDP_128K | 1<<WDE);
  • #32
    Fredy
    Level 27  
    Czy biblioteka Delay nie powinna mieć zadeklarowanego Fcpu ?
    Skąd ma kompilator wiedzieć jak długo ma trwać delay ?
  • #33
    dondu
    Moderator on vacation ...
    Fredy wrote:
    Czy biblioteka Delay nie powinna mieć zadeklarowanego Fcpu ?
    Skąd ma kompilator wiedzieć jak długo ma trwać delay ?


    Faktycznie deklaracja powinna być, chociaż:
    -w AVR Studio jest w opcjach
    -a bibliotece jest zabezpieczenie w postaci:
    #ifndef F_CPU
    /* prevent compiler error by supplying a default */
    # warning "F_CPU not defined for <util/delay.h>"
    # define F_CPU 12000000UL
    #endif

    ... chyba, że ktoś zmienił.

    Dodano po 5 [minuty]:

    Z ciekawości zrobię zaraz ten układ i sprawdzę kod.
  • #35
    dondu
    Moderator on vacation ...
    Fredy wrote:
    Nie wiemy jaki kwarc jest użyty.

    Tak, ale pisze, że jakieś mrugnięcia są więc coś tam działa :)

    Dodano po 47 [minuty]:

    Przetestowałem na płytce jednego z moich projektów (nie mam stykówki) i miałem wolne PB1 i PB0 oraz PD2.
    - PB1 LED czerwony (przez rezystor do Vcc)
    - PB0 LED zielony (przez rezystor do Vcc)
    - PD2 przycisk NO do masy

    Taki kod działa bez żadnych zastrzeżeń:
    #define F_CPU 12000000UL
    
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    #include <util/delay.h>    
    
    
    
    //LED czerwony na PB1, zielony na PB0
    #define LED_red_on	PORTB	&= ~(1<<PB1);
    #define LED_red_off	PORTB	|= (1<<PB1);
    #define LED_green_on	PORTB	&= ~(1<<PB0);
    #define LED_green_off	PORTB	|= (1<<PB0);
    
    
    
    volatile int przerwanie=0; 
    
    //-----------------------------------------------------------------
    
    ISR(INT0_vect) 
    { 
       przerwanie=1; 
    } 
    
    
    //-----------------------------------------------------------------
    
    
    
    int main(void){
    		
    
    	//ustaw port LED sygnalizacyjnego
    	DDRB |= (1<<PB1) | (1<<PB0);	//ustaw piny LED-ów jako wyjścia
    
    	// dla pewności gaszę oba	
    	LED_green_off;
    	LED_red_off;
    
    	//wejście przycisku	
        DDRD &=~ (1 << PD2);  // pin PD2 jako wejście 
        PORTD |= (1 << PD2);  // wewnętrzny pull-up 
    
    
    	//na początek mrugamy LED-ami
    	LED_green_on;
    	_delay_ms(500);
    	LED_red_on;
    	_delay_ms(500);
    	//gasimy
    	LED_green_off;
    	_delay_ms(500);
    	LED_red_off;
    
    
        //MCUCR |= (1<<ISC01)|(0<<ISC00);      // Wyzwolenie przerwania zboczem opadającym 
    	MCUCR |= ~((1<<ISC01)|(1<<ISC00));      // Wyzwolenie przerwania niskim poziomem
       	GICR |= (1<<INT0); //Załączenie przerwania na INT0 
    
    	sei();
    
    	
    
    	while(1){
    
    
    	   if(przerwanie==1) 
    	   { 
    		   LED_red_on; 
    		   _delay_ms(2000); 
    		   LED_red_off; 
    		   przerwanie=0; 
    	   }
    
    	}
    
    }
    


    Niezależnie czy ustawiam INT na zbocze czy poziom działa poprawnie, tzn. po naciśnięciu przycisku LED czerwony zapala się na 2sek.

    Teraz możesz sprawdzić czy twoja mega8 działa tak samo, jeżeli masz inny kwarc to zmień wartość F_CPU.

    Oczywiście stosuj ISR zamiast SIGNAL.

    Na przycisku nie dawałem kondensatora (na razie).

    Jeżeli będziesz testował rób to na tych pinach to będę mógł Ci łatwiej pomóc.
  • #36
    mkkomp
    Level 10  
    Kwarcu zewnętrznego nie używam, tylko standardowe ustawienia atmegi (1MHz). Próbowałem różnych (ISR i SIGNAL) bo już nie wiedziałem gdzie szukać błędu. Ogólnie używam starszej wersji WINavr. Fcpu widziałem zadeklarowane w delay.h, dlatego drugi raz tego nie robiłem. Co do
    asm volatile ("WDR"::);
    łapiąc się wszystkiego co się da, zasugerowałem się "kursem" http://www.patron.ehost.pl/patron/artykuly/vinavr/AVR_tutorial.htm , w którym tego używano do resetowania watchdog'a w pętlach oczekujących na przerwanie, a poza tym o żadnych dodatkowych konfiguracjach wd mowy tam nie było.. Jutro wrzucę ten kod na uC. Dzięki :)
  • #37
    mkkomp
    Level 10  
    Niestety mam tylko jedną diodkę, więc musiałem się ograniczyć do mrugania jedną sztuką. To mnie zmyliło, już byłem w euforii, że działa.. ale to była przedwczesna radość. Zmodyfikowałem Twój program do obsługi jednej diodki (drugą wyrzuciłem z kodu) + zmiana Fcpu na 1MHz. Mruga 3 razy na wejściu, potem jak nacisnę przycisk znów mruga 3 razy, zarówno na zboczu opadającym jak i na niskim poziomie. Oto cały kod po modyfikacji (diodkę podpiąłem zgodnie z Twoim programem):

    #define F_CPU 1000000UL
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>   
    
    
    
    //LED zielony na PB0
    #define LED_green_on   PORTB   &= ~(1<<PB0);
    #define LED_green_off   PORTB   |= (1<<PB0);
    
    
    
    volatile int przerwanie=0;
    
    //-----------------------------------------------------------------
    
    ISR(INT0_vect)
    {
       przerwanie=1;
    }
    
    
    //-----------------------------------------------------------------
    
    
    
    int main(void){
          
    
       //ustaw port LED sygnalizacyjnego
       DDRB |= (1<<PB1) | (1<<PB0);   //ustaw piny LED-ów jako wyjścia
    
       // dla pewności gaszę diodę   
       LED_green_off;
    
       //wejście przycisku   
        DDRD &=~ (1 << PD2);  // pin PD2 jako wejście
        PORTD |= (1 << PD2);  // wewnętrzny pull-up
    
       //na początek mrugamy diodą LED 3 razy
       LED_green_on;
       _delay_ms(200);
       LED_green_off;
       _delay_ms(200);
       LED_green_on;
       _delay_ms(200);
       LED_green_off;
       _delay_ms(200);
       LED_green_on;
       _delay_ms(200);
       LED_green_off;
    
        //MCUCR |= (1<<ISC01)|(0<<ISC00);      // Wyzwolenie przerwania zboczem opadającym
       MCUCR |= ~((1<<ISC01)|(1<<ISC00));      // Wyzwolenie przerwania niskim poziomem
          GICR |= (1<<INT0); //Załączenie przerwania na INT0
    
       sei();
    
       
    
       while(1){
    
    
          if(przerwanie==1)
          {
             LED_green_on;
             _delay_ms(2000);
             LED_green_off;
             przerwanie=0;
          }
    
       }
    
    } 
    
  • #38
    Circuit Chaos
    Level 13  
    MCUCR |= ~((1<<ISC01)|(1<<ISC00));      // Wyzwolenie przerwania niskim poziomem

    Ten kod nie robi tego co jest w komentarzu - zamiast |= powinno być &=.
  • #39
    mkkomp
    Level 10  
    Okazało się, że program zaczyna się wykonywać od nowa także przy przerwaniach od timera...:/
    
    #include <avr/interrupt.h>
    #include <string.h>
    
    #include "delay.h"
    #include "lcd.h"
    
    volatile int przerwanie=0;
    
    int main(void)
    {
    LCD_init();
    LCD_putstr_P(PSTR("Witaj"));
    delayms(500);
    LCD_putstr_P(PSTR("Hello!"));
    TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
         OCR1A = 62500;
         TCCR1B |= ((1 << CS10) | (1 << CS12))&~(1 << CS11); // Ustawia timer z preskalerem 1024 (częstotliwość zegara 8MHz)
         TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
         sei(); // Zezwolenie globalne na przerwania
     while(1){};
    }
    
    ISR(TIMER1_COMPA_vect)
    {
    LCD_clear();
    LCD_putstr_P(PSTR("przerwanie"));
    delayms(500);
     } 
     } 
  • #40
    Circuit Chaos
    Level 13  
    Pokaż flagi kompilacji i linkowania i/lub wrzuć gdzieś wynikową binarkę, to się zdeasembluje i może wtedy coś wyjdzie (np. zły model procka masz ustawiony albo coś takiego).
  • #41
    mkkomp
    Level 10  
    Moja atmega to model 8A-PU, niby jakiś nowszy typ. Wrzuciłem tu plik main.hex.

    A co do reszty...czy to to? :)

    
    -------- begin --------
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/conv/bcd2bin.lst -I../../lib -Os ../../lib/conv/bcd2bin.c -o ../../lib/conv/bcd2bin.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/conv/bin2bcd.lst -I../../lib -Os ../../lib/conv/bin2bcd.c -o ../../lib/conv/bin2bcd.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/conv/byte2dec.lst -I../../lib -Os ../../lib/conv/byte2dec.c -o ../../lib/conv/byte2dec.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/conv/byte2hex.lst -I../../lib -Os ../../lib/conv/byte2hex.c -o ../../lib/conv/byte2hex.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/conv/nibble2hex.lst -I../../lib -Os ../../lib/conv/nibble2hex.c -o ../../lib/conv/nibble2hex.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/conv/word2hex.lst -I../../lib -Os ../../lib/conv/word2hex.c -o ../../lib/conv/word2hex.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/delay/delay10us.lst -I../../lib -Os ../../lib/delay/delay10us.c -o ../../lib/delay/delay10us.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/delay/delay20us.lst -I../../lib -Os ../../lib/delay/delay20us.c -o ../../lib/delay/delay20us.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/delay/delay.lst -I../../lib -Os ../../lib/delay/delay.c -o ../../lib/delay/delay.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/clear.lst -I../../lib -Os ../../lib/lcd/clear.c -o ../../lib/lcd/clear.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/clock.lst -I../../lib -Os ../../lib/lcd/clock.c -o ../../lib/lcd/clock.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/defchars_P.lst -I../../lib -Os ../../lib/lcd/defchars_P.c -o ../../lib/lcd/defchars_P.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/init.lst -I../../lib -Os ../../lib/lcd/init.c -o ../../lib/lcd/init.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/PL_chars_init.lst -I../../lib -Os ../../lib/lcd/PL_chars_init.c -o ../../lib/lcd/PL_chars_init.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/progressbar.lst -I../../lib -Os ../../lib/lcd/progressbar.c -o ../../lib/lcd/progressbar.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/progressbar_init.lst -I../../lib -Os ../../lib/lcd/progressbar_init.c -o ../../lib/lcd/progressbar_init.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/putchar.lst -I../../lib -Os ../../lib/lcd/putchar.c -o ../../lib/lcd/putchar.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/putcharxy.lst -I../../lib -Os ../../lib/lcd/putcharxy.c -o ../../lib/lcd/putcharxy.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/putint.lst -I../../lib -Os ../../lib/lcd/putint.c -o ../../lib/lcd/putint.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/putstr.lst -I../../lib -Os ../../lib/lcd/putstr.c -o ../../lib/lcd/putstr.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/putstr_E.lst -I../../lib -Os ../../lib/lcd/putstr_E.c -o ../../lib/lcd/putstr_E.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/putstr_P.lst -I../../lib -Os ../../lib/lcd/putstr_P.c -o ../../lib/lcd/putstr_P.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/putstrxy.lst -I../../lib -Os ../../lib/lcd/putstrxy.c -o ../../lib/lcd/putstrxy.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/putU08.lst -I../../lib -Os ../../lib/lcd/putU08.c -o ../../lib/lcd/putU08.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/puthexU08.lst -I../../lib -Os ../../lib/lcd/puthexU08.c -o ../../lib/lcd/puthexU08.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/puthexU16.lst -I../../lib -Os ../../lib/lcd/puthexU16.c -o ../../lib/lcd/puthexU16.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/send.lst -I../../lib -Os ../../lib/lcd/send.c -o ../../lib/lcd/send.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/send_0.lst -I../../lib -Os ../../lib/lcd/send_0.c -o ../../lib/lcd/send_0.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/send_1.lst -I../../lib -Os ../../lib/lcd/send_1.c -o ../../lib/lcd/send_1.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/lcd/xy.lst -I../../lib -Os ../../lib/lcd/xy.c -o ../../lib/lcd/xy.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/getchar.lst -I../../lib -Os ../../lib/uart/getchar.c -o ../../lib/uart/getchar.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/getstr.lst -I../../lib -Os ../../lib/uart/getstr.c -o ../../lib/uart/getstr.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/init.lst -I../../lib -Os ../../lib/uart/init.c -o ../../lib/uart/init.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/putchar.lst -I../../lib -Os ../../lib/uart/putchar.c -o ../../lib/uart/putchar.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/putU08.lst -I../../lib -Os ../../lib/uart/putU08.c -o ../../lib/uart/putU08.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/puthexU08.lst -I../../lib -Os ../../lib/uart/puthexU08.c -o ../../lib/uart/puthexU08.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/puthexU16.lst -I../../lib -Os ../../lib/uart/puthexU16.c -o ../../lib/uart/puthexU16.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/putint.lst -I../../lib -Os ../../lib/uart/putint.c -o ../../lib/uart/putint.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/putstr.lst -I../../lib -Os ../../lib/uart/putstr.c -o ../../lib/uart/putstr.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/putstr_E.lst -I../../lib -Os ../../lib/uart/putstr_E.c -o ../../lib/uart/putstr_E.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/putstr_P.lst -I../../lib -Os ../../lib/uart/putstr_P.c -o ../../lib/uart/putstr_P.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/uart/rxlen.lst -I../../lib -Os ../../lib/uart/rxlen.c -o ../../lib/uart/rxlen.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/bit_io.lst -I../../lib -Os ../../lib/onewire/bit_io.c -o ../../lib/onewire/bit_io.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/byte_rd.lst -I../../lib -Os ../../lib/onewire/byte_rd.c -o ../../lib/onewire/byte_rd.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/byte_wr.lst -I../../lib -Os ../../lib/onewire/byte_wr.c -o ../../lib/onewire/byte_wr.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/command.lst -I../../lib -Os ../../lib/onewire/command.c -o ../../lib/onewire/command.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/crc8.lst -I../../lib -Os ../../lib/onewire/crc8.c -o ../../lib/onewire/crc8.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/input_pin_state.lst -I../../lib -Os ../../lib/onewire/input_pin_state.c -o ../../lib/onewire/input_pin_state.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/parasite_disable.lst -I../../lib -Os ../../lib/onewire/parasite_disable.c -o ../../lib/onewire/parasite_disable.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/parasite_enable.lst -I../../lib -Os ../../lib/onewire/parasite_enable.c -o ../../lib/onewire/parasite_enable.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/reset.lst -I../../lib -Os ../../lib/onewire/reset.c -o ../../lib/onewire/reset.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/rom_search.lst -I../../lib -Os ../../lib/onewire/rom_search.c -o ../../lib/onewire/rom_search.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/onewire/set_bus.lst -I../../lib -Os ../../lib/onewire/set_bus.c -o ../../lib/onewire/set_bus.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/copy_scratchpad.lst -I../../lib -Os ../../lib/ds18x20/copy_scratchpad.c -o ../../lib/ds18x20/copy_scratchpad.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/find_sensor.lst -I../../lib -Os ../../lib/ds18x20/find_sensor.c -o ../../lib/ds18x20/find_sensor.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/get_power_status.lst -I../../lib -Os ../../lib/ds18x20/get_power_status.c -o ../../lib/ds18x20/get_power_status.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/meas_to_cel.lst -I../../lib -Os ../../lib/ds18x20/meas_to_cel.c -o ../../lib/ds18x20/meas_to_cel.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/read_meas.lst -I../../lib -Os ../../lib/ds18x20/read_meas.c -o ../../lib/ds18x20/read_meas.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/read_meas_single.lst -I../../lib -Os ../../lib/ds18x20/read_meas_single.c -o ../../lib/ds18x20/read_meas_single.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/read_scratchpad.lst -I../../lib -Os ../../lib/ds18x20/read_scratchpad.c -o ../../lib/ds18x20/read_scratchpad.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/recall_E2.lst -I../../lib -Os ../../lib/ds18x20/recall_E2.c -o ../../lib/ds18x20/recall_E2.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/start_meas.lst -I../../lib -Os ../../lib/ds18x20/start_meas.c -o ../../lib/ds18x20/start_meas.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/temp_cmp.lst -I../../lib -Os ../../lib/ds18x20/temp_cmp.c -o ../../lib/ds18x20/temp_cmp.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/temp_to_decicel.lst -I../../lib -Os ../../lib/ds18x20/temp_to_decicel.c -o ../../lib/ds18x20/temp_to_decicel.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=../../lib/ds18x20/write_scratchpad.lst -I../../lib -Os ../../lib/ds18x20/write_scratchpad.c -o ../../lib/ds18x20/write_scratchpad.o
    avr-ar rc main.a ../../lib/conv/bcd2bin.o ../../lib/conv/bin2bcd.o ../../lib/conv/byte2dec.o ../../lib/conv/byte2hex.o ../../lib/conv/nibble2hex.o ../../lib/conv/word2hex.o ../../lib/delay/delay10us.o ../../lib/delay/delay20us.o ../../lib/delay/delay.o ../../lib/lcd/clear.o ../../lib/lcd/clock.o ../../lib/lcd/defchars_P.o ../../lib/lcd/init.o ../../lib/lcd/PL_chars_init.o ../../lib/lcd/progressbar.o ../../lib/lcd/progressbar_init.o ../../lib/lcd/putchar.o ../../lib/lcd/putcharxy.o ../../lib/lcd/putint.o ../../lib/lcd/putstr.o ../../lib/lcd/putstr_E.o ../../lib/lcd/putstr_P.o ../../lib/lcd/putstrxy.o ../../lib/lcd/putU08.o ../../lib/lcd/puthexU08.o ../../lib/lcd/puthexU16.o ../../lib/lcd/send.o ../../lib/lcd/send_0.o ../../lib/lcd/send_1.o ../../lib/lcd/xy.o ../../lib/uart/getchar.o ../../lib/uart/getstr.o ../../lib/uart/init.o ../../lib/uart/putchar.o ../../lib/uart/putU08.o ../../lib/uart/puthexU08.o ../../lib/uart/puthexU16.o ../../lib/uart/putint.o ../../lib/uart/putstr.o ../../lib/uart/putstr_E.o ../../lib/uart/putstr_P.o ../../lib/uart/rxlen.o ../../lib/onewire/bit_io.o ../../lib/onewire/byte_rd.o ../../lib/onewire/byte_wr.o ../../lib/onewire/command.o ../../lib/onewire/crc8.o ../../lib/onewire/input_pin_state.o ../../lib/onewire/parasite_disable.o ../../lib/onewire/parasite_enable.o ../../lib/onewire/reset.o ../../lib/onewire/rom_search.o ../../lib/onewire/set_bus.o ../../lib/ds18x20/copy_scratchpad.o ../../lib/ds18x20/find_sensor.o ../../lib/ds18x20/get_power_status.o ../../lib/ds18x20/meas_to_cel.o ../../lib/ds18x20/read_meas.o ../../lib/ds18x20/read_meas_single.o ../../lib/ds18x20/read_scratchpad.o ../../lib/ds18x20/recall_E2.o ../../lib/ds18x20/start_meas.o ../../lib/ds18x20/temp_cmp.o ../../lib/ds18x20/temp_to_decicel.o ../../lib/ds18x20/write_scratchpad.o
    avr-gcc -c -mmcu=atmega8 -I. -g -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=main.lst -I../../lib -Os main.c -o main.o
    main.c:31: warning: return type defaults to `int'
    main.c:31: warning: function declaration isn't a prototype
    main.c:35:4: warning: no newline at end of file
    main.c: In function `ISR':
    main.c:35: warning: control reaches end of non-void function
    avr-gcc -mmcu=atmega8 main.o   main.a  -Wl,-Map=main.map,--cref --output main.elf
    avr-objdump -h -S main.elf > main.lss
    avr-objcopy -O ihex -R .eeprom main.elf main.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O  ihex main.elf main.eep
    avr-objcopy --debugging --change-section-address .data-0x800000 --change-section-address .bss-0x800000 --change-section-address .noinit-0x800000 --change-section-address .eeprom-0x810000  -O coff-ext-avr main.elf main.cof
    Size after:
       text	   data	    bss	    dec	    hex	filename
        656	      0	      3	    659	    293	main.elf
    Errors: none
    -------- end --------
    rm ../../lib/lcd/progressbar.o ../../lib/uart/init.o ../../lib/onewire/byte_wr.o ../../lib/onewire/reset.o ../../lib/uart/putchar.o ../../lib/lcd/putU08.o ../../lib/uart/getstr.o ../../lib/uart/putstr_E.o ../../lib/uart/putU08.o ../../lib/lcd/defchars_P.o ../../lib/ds18x20/copy_scratchpad.o ../../lib/lcd/init.o ../../lib/uart/puthexU08.o ../../lib/conv/byte2hex.o ../../lib/ds18x20/meas_to_cel.o ../../lib/lcd/send.o ../../lib/ds18x20/recall_E2.o ../../lib/lcd/putcharxy.o ../../lib/lcd/send_0.o ../../lib/lcd/PL_chars_init.o ../../lib/ds18x20/read_meas_single.o ../../lib/delay/delay.o ../../lib/delay/delay10us.o ../../lib/uart/putstr_P.o ../../lib/ds18x20/write_scratchpad.o ../../lib/onewire/bit_io.o ../../lib/lcd/puthexU08.o ../../lib/delay/delay20us.o ../../lib/lcd/putstr_E.o ../../lib/lcd/progressbar_init.o ../../lib/lcd/putstr.o ../../lib/ds18x20/get_power_status.o ../../lib/conv/bin2bcd.o ../../lib/uart/putstr.o ../../lib/ds18x20/temp_cmp.o ../../lib/conv/word2hex.o ../../lib/lcd/xy.o ../../lib/ds18x20/find_sensor.o ../../lib/onewire/rom_search.o ../../lib/onewire/crc8.o ../../lib/onewire/parasite_enable.o ../../lib/onewire/byte_rd.o ../../lib/lcd/clock.o ../../lib/onewire/set_bus.o ../../lib/conv/bcd2bin.o ../../lib/lcd/clear.o ../../lib/uart/getchar.o ../../lib/lcd/putstrxy.o ../../lib/ds18x20/read_scratchpad.o ../../lib/lcd/putint.o ../../lib/lcd/putchar.o ../../lib/lcd/puthexU16.o ../../lib/uart/rxlen.o ../../lib/lcd/putstr_P.o ../../lib/onewire/input_pin_state.o ../../lib/uart/putint.o ../../lib/onewire/parasite_disable.o ../../lib/lcd/send_1.o ../../lib/ds18x20/start_meas.o ../../lib/ds18x20/read_meas.o ../../lib/conv/byte2dec.o ../../lib/onewire/command.o ../../lib/conv/nibble2hex.o ../../lib/ds18x20/temp_to_decicel.o ../../lib/uart/puthexU16.o
    
    > Process Exit Code: 0
    > Time Taken: 00:02
    
  • #42
    Freddie Chopin
    MCUs specialist
    mkkomp wrote:
    main.c:31: warning: return type defaults to `int'
    main.c:31: warning: function declaration isn't a prototype
    main.c:35:4: warning: no newline at end of file
    main.c: In function `ISR':
    main.c:35: warning: control reaches end of non-void function


    Ja coś czuję, że nie dodałeś nagłówka interrupt.h i jakimś cudem się to skompilowało...

    4\/3!!
  • #43
    mkkomp
    Level 10  
    Mam #include <avr/interrupt.h>. Już wstawiłem cały kod programu dwa posty wyżej.
  • #44
    Freddie Chopin
    MCUs specialist
    No a jednak po tych warningach wydaje mi się, że kompilator jakoś tego nie widzi i traktuje ISR jako nazwę funkcji, więc jak wystąpi przerwanie to układ zostaje programowo zresetowany (wykonywane są instrukcje od samego początku), bo brak jest funkcji odpowiedzialnej za przerwanie...

    Jaka wersja kompilatora? Jeśli stara, to zainstaluj nową.

    4\/3!!
  • #45
    Circuit Chaos
    Level 13  
    Na to wskazuje także tablica wektorów z początku pliku hex:

    :10 0000 00 1EC0 37C0 36C0 35C0 34C0 33C0 32C0 31C0 66

    Widać najpierw wektor resetu skaczący pod adres 0x3E (0x1E * 2 + 2) a potem ciągłe skoki pod ten sam adres (0x72 - np. 0x37 * 2 + 4, 0x36 * 2 + 6 itd) - normalnie jest to __bad_interrupt, skaczący na początek (do wektora resetu).

    Wektor TIMER1_COMPA też skacze pod ten sam adres (fragment 32C0 wyżej), z czego wniosek że ISR nie jest rozpoznane jako deklaracja przerwania.
  • #46
    mkkomp
    Level 10  
    Mam dwie wersje winavra 20040720 i 20100110. Na jednej i na drugiej jest to samo.
  • #47
    Circuit Chaos
    Level 13  
    Pokaż zawartość swojego pliku avr/interrupt.h z winavra.
  • Helpful post
    #48
    sulfur
    Level 24  
    Uruchom wiersz poleceń i wpisz "avr-gcc -v". Nie wiem czy posiadanie dwóch wersji jest możliwe, bo może się okazać, że wszystko kompiluje Ci ten sam, starszy kompilator.
  • #49
    mkkomp
    Level 10  
    W cmd to polecenie nie chce pójść.. nazwa nie jest rozpoznawana
  • #50
    kazkowicz
    Level 14  
    Głupi może pomysł, bo ja tylko asm, ale może to?

    #include <avr/io.h>
  • #52
    mkkomp
    Level 10  
    Mam dwa foldery, każdy od innej wersji avr i w każdym jest inny interrupt.h. Da się jakoś sprawdzić, który avr używa podczas kompilacji?

    /* Copyright (c) 2002, Marek Michalkiewicz
       All rights reserved.
    
       Redistribution and use in source and binary forms, with or without
       modification, are permitted provided that the following conditions are met:
    
       * Redistributions of source code must retain the above copyright
         notice, this list of conditions and the following disclaimer.
       * Redistributions in binary form must reproduce the above copyright
         notice, this list of conditions and the following disclaimer in
         the documentation and/or other materials provided with the
         distribution.
    
      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
      LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
      CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
      SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
      INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
      POSSIBILITY OF SUCH DAMAGE. */
    
    /* $Id: interrupt.h,v 1.8.2.2 2004/02/13 22:07:56 joerg_wunsch Exp $ */
    
    #ifndef _AVR_INTERRUPT_H_
    #define _AVR_INTERRUPT_H_
    
    #include <avr/io.h>
    
    /** \name Global manipulation of the interrupt flag
    
        The global interrupt flag is maintained in the I bit of the status
        register (SREG). */
    
    /*@{*/
    
    /** \def sei()
        \ingroup avr_interrupts
    
        \code#include <avr/interrupt.h>\endcode
    
        Enables interrupts by clearing the global interrupt mask. This function
        actually compiles into a single line of assembly, so there is no function
        call overhead. */
    
    #define sei()  __asm__ __volatile__ ("sei" ::)
    
    /** \def cli()
        \ingroup avr_interrupts
    
        \code#include <avr/interrupt.h>\endcode
    
        Disables all interrupts by clearing the global interrupt mask. This function
        actually compiles into a single line of assembly, so there is no function
        call overhead. */
    
    #define cli()  __asm__ __volatile__ ("cli" ::)
    
    /*@}*/
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    /** \name Allowing specific system-wide interrupts
    
        In addition to globally enabling interrupts, each device's particular
        interrupt needs to be enabled separately if interrupts for this device are
        desired.  While some devices maintain their interrupt enable bit inside
        the device's register set, external and timer interrupts have system-wide
        configuration registers. 
    
        Example:
    
        \code
        // Enable timer 1 overflow interrupts.
        timer_enable_int(_BV(TOIE1));
    
        // Do some work...
    
        // Disable all timer interrupts.
        timer_enable_int(0);
        \endcode
    
        \note Be careful when you use these functions. If you already have a
        different interrupt enabled, you could inadvertantly disable it by
        enabling another intterupt. */
    
    /*@{*/
    
    /** \ingroup avr_interrupts
        \def enable_external_int(mask)
        \code#include <avr/interrupt.h>\endcode
    
        This macro gives access to the \c GIMSK register (or \c EIMSK register
        if using an AVR Mega device or \c GICR register for others). Although this
        macro is essentially the same as assigning to the register, it does
        adapt slightly to the type of device being used. This macro is 
        unavailable if none of the registers listed above are defined. */
    
    /* Define common register definition if available. */
    #if defined(EIMSK)
    #define __EICR  EIMSK
    #endif
    #if defined(GIMSK)
    #define __EICR  GIMSK
    #endif
    #if defined(GICR)
    #define __EICR  GICR
    #endif
    
    /* If common register defined, define macro. */
    #if defined(__EICR)
    #define enable_external_int(mask)               (__EICR = mask)
    #endif
    
    
    
    /** \ingroup avr_interrupts
    
        \code#include <avr/interrupt.h>\endcode
    
    	This function modifies the \c timsk register.
    	The value you pass via \c ints is device specific. */
    
    static __inline__ void timer_enable_int (unsigned char ints)
    {
    #ifdef TIMSK
        TIMSK = ints;
    #endif
    }
    
    /*@}*/
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    






    /* Copyright (c) 2002,2005,2007 Marek Michalkiewicz
       Copyright (c) 2007, Dean Camera
    
       All rights reserved.
    
       Redistribution and use in source and binary forms, with or without
       modification, are permitted provided that the following conditions are met:
    
       * Redistributions of source code must retain the above copyright
         notice, this list of conditions and the following disclaimer.
    
       * Redistributions in binary form must reproduce the above copyright
         notice, this list of conditions and the following disclaimer in
         the documentation and/or other materials provided with the
         distribution.
    
       * Neither the name of the copyright holders nor the names of
         contributors may be used to endorse or promote products derived
         from this software without specific prior written permission.
    
      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
      LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
      CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
      SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
      INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
      POSSIBILITY OF SUCH DAMAGE. */
    
    /* $Id: interrupt.h,v 1.25.2.1 2008/01/05 06:33:11 dmix Exp $ */
    
    #ifndef _AVR_INTERRUPT_H_
    #define _AVR_INTERRUPT_H_
    
    #include <avr/io.h>
    
    #if !defined(__DOXYGEN__) && !defined(__STRINGIFY)
    /* Auxiliary macro for ISR_ALIAS(). */
    #define __STRINGIFY(x) #x
    #endif /* !defined(__DOXYGEN__) */
    
    /** 
    \file 
    \@{ 
    */
    
    
    /** \name Global manipulation of the interrupt flag
    
        The global interrupt flag is maintained in the I bit of the status
        register (SREG). 
    */
    
    #if defined(__DOXYGEN__)
    /** \def sei()
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        Enables interrupts by setting the global interrupt mask. This function
        actually compiles into a single line of assembly, so there is no function
        call overhead. */
    #define sei()
    #else  /* !DOXYGEN */
    # define sei()  __asm__ __volatile__ ("sei" ::)
    #endif /* DOXYGEN */
    
    #if defined(__DOXYGEN__)
    /** \def cli()
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        Disables all interrupts by clearing the global interrupt mask. This function
        actually compiles into a single line of assembly, so there is no function
        call overhead. */
    #define cli()
    #else  /* !DOXYGEN */
    # define cli()  __asm__ __volatile__ ("cli" ::)
    #endif /* DOXYGEN */
    
    
    /** \name Macros for writing interrupt handler functions */
    
    
    #if defined(__DOXYGEN__)
    /** \def ISR(vector [, attributes])
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        Introduces an interrupt handler function (interrupt service
        routine) that runs with global interrupts initially disabled
        by default with no attributes specified.
    
        The attributes are optional and alter the behaviour and resultant
        generated code of the interrupt routine. Multiple attributes may
        be used for a single function, with a space seperating each
        attribute.
    
        Valid attributes are ISR_BLOCK, ISR_NOBLOCK, ISR_NAKED and
        ISR_ALIASOF(vect).
    
        \c vector must be one of the interrupt vector names that are
        valid for the particular MCU type.
    */
    #  define ISR(vector, [attributes])
    #else  /* real code */
    
    #if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
    #  define __INTR_ATTRS used, externally_visible
    #else /* GCC < 4.1 */
    #  define __INTR_ATTRS used
    #endif
    
    #ifdef __cplusplus
    #  define ISR(vector, ...)            \
        extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
        void vector (void)
    #else
    #  define ISR(vector, ...)            \
        void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \
        void vector (void)
    #endif
    
    #endif /* DOXYGEN */
    
    #if defined(__DOXYGEN__)
    /** \def SIGNAL(vector)
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        Introduces an interrupt handler function that runs with global interrupts
        initially disabled.
    
        This is the same as the ISR macro without optional attributes.
        \deprecated Do not use SIGNAL() in new code. Use ISR() instead.
    */
    #  define SIGNAL(vector)
    #else  /* real code */
    
    #ifdef __cplusplus
    #  define SIGNAL(vector)					\
        extern "C" void vector(void) __attribute__ ((signal, __INTR_ATTRS));	\
        void vector (void)
    #else
    #  define SIGNAL(vector)					\
        void vector (void) __attribute__ ((signal, __INTR_ATTRS));		\
        void vector (void)
    #endif
    
    #endif /* DOXYGEN */
    
    #if defined(__DOXYGEN__)
    /** \def EMPTY_INTERRUPT(vector)
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        Defines an empty interrupt handler function. This will not generate
        any prolog or epilog code and will only return from the ISR. Do not
        define a function body as this will define it for you.
        Example:
        \code EMPTY_INTERRUPT(ADC_vect);\endcode */
    #  define EMPTY_INTERRUPT(vector)
    #else  /* real code */
    
    #ifdef __cplusplus
    #  define EMPTY_INTERRUPT(vector)                \
        extern "C" void vector(void) __attribute__ ((signal,naked,__INTR_ATTRS));    \
        void vector (void) {  __asm__ __volatile__ ("reti" ::); }
    #else
    #  define EMPTY_INTERRUPT(vector)                \
        void vector (void) __attribute__ ((signal,naked,__INTR_ATTRS));    \
        void vector (void) { __asm__ __volatile__ ("reti" ::); }
    #endif
    
    #endif /* DOXYGEN */
    
    #if defined(__DOXYGEN__)
    /** \def ISR_ALIAS(vector, target_vector)
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        Aliases a given vector to another one in the same manner as the
        ISR_ALIASOF attribute for the ISR() macro. Unlike the ISR_ALIASOF
        attribute macro however, this is compatible for all versions of
        GCC rather than just GCC version 4.2 onwards.
    
        \note This macro creates a trampoline function for the aliased
        macro.  This will result in a two cycle penalty for the aliased
        vector compared to the ISR the vector is aliased to, due to the
        JMP/RJMP opcode used.
    
        \deprecated
        For new code, the use of ISR(..., ISR_ALIASOF(...))  is
        recommended.
    
        Example:
        \code
        ISR(INT0_vect)
        {
            PORTB = 42;
        }
    
        ISR_ALIAS(INT1_vect, INT0_vect);
        \endcode 
    */
    #  define ISR_ALIAS(vector, target_vector)
    #else /* real code */
    
    #ifdef __cplusplus
    #  if defined(__AVR_MEGA__) && __AVR_MEGA__
    #    define ISR_ALIAS(vector, tgt) extern "C" void vector (void) \
    	__attribute__((signal, naked, __INTR_ATTRS)); \
    	void vector (void) { asm volatile ("jmp " __STRINGIFY(tgt) ::); }
    #  else /* !__AVR_MEGA */
    #    define ISR_ALIAS(vector, tgt) extern "C" void vector (void) \
    	__attribute__((signal, naked, __INTR_ATTRS)); \
    	void vector (void) { asm volatile ("rjmp " __STRINGIFY(tgt) ::); }
    #  endif  /* __AVR_MEGA__ */
    #else	  /* !__cplusplus */
    #  if defined(__AVR_MEGA__) && __AVR_MEGA__
    #  define ISR_ALIAS(vector, tgt) void vector (void) \
    	__attribute__((signal, naked, __INTR_ATTRS)); \
    	void vector (void) { asm volatile ("jmp " __STRINGIFY(tgt) ::); }
    #  else /* !__AVR_MEGA */
    #  define ISR_ALIAS(vector, tgt) void vector (void) \
    	__attribute__((signal, naked, __INTR_ATTRS)); \
    	void vector (void) { asm volatile ("rjmp " __STRINGIFY(tgt) ::); }
    #  endif  /* __AVR_MEGA__ */
    #endif	/* __cplusplus */
    
    #endif /* DOXYGEN */
    
    #if defined(__DOXYGEN__)
    /** \def reti()
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        Returns from an interrupt routine, enabling global interrupts. This should
        be the last command executed before leaving an ISR defined with the ISR_NAKED
        attribute.
    
        This macro actually compiles into a single line of assembly, so there is
        no function call overhead.
    */
    #  define reti()
    #else  /* !DOXYGEN */
    #  define reti()  __asm__ __volatile__ ("reti" ::)
    #endif /* DOXYGEN */
    
    #if defined(__DOXYGEN__)
    /** \def BADISR_vect
        \ingroup avr_interrupts
    
        \code #include <avr/interrupt.h> \endcode
    
        This is a vector which is aliased to __vector_default, the vector
        executed when an ISR fires with no accompanying ISR handler. This
        may be used along with the ISR() macro to create a catch-all for
        undefined but used ISRs for debugging purposes.
    */
    #  define BADISR_vect
    #else  /* !DOXYGEN */
    #  define BADISR_vect __vector_default
    #endif /* DOXYGEN */
    
    /** \name ISR attributes */
    
    #if defined(__DOXYGEN__)
    /** \def ISR_BLOCK
        \ingroup avr_interrupts
    
        \code# include <avr/interrupt.h> \endcode
    
        Identical to an ISR with no attributes specified. Global
        interrupts are initially disabled by the AVR hardware when
        entering the ISR, without the compiler modifying this state.
    
        Use this attribute in the attributes parameter of the ISR macro.
    */
    #  define ISR_BLOCK
    
    /** \def ISR_NOBLOCK
        \ingroup avr_interrupts
    
        \code# include <avr/interrupt.h> \endcode
    
        ISR runs with global interrupts initially enabled.  The interrupt
        enable flag is activated by the compiler as early as possible
        within the ISR to ensure minimal processing delay for nested
        interrupts.
    
        This may be used to create nested ISRs, however care should be
        taken to avoid stack overflows, or to avoid infinitely entering
        the ISR for those cases where the AVR hardware does not clear the
        respective interrupt flag before entering the ISR.
    
        Use this attribute in the attributes parameter of the ISR macro.
    */
    #  define ISR_NOBLOCK
    
    /** \def ISR_NAKED
        \ingroup avr_interrupts
    
        \code# include <avr/interrupt.h> \endcode
    
        ISR is created with no prologue or epilogue code. The user code is
        responsible for preservation of the machine state including the
        SREG register, as well as placing a reti() at the end of the
        interrupt routine.
    
        Use this attribute in the attributes parameter of the ISR macro.
    */
    #  define ISR_NAKED
    
    /** \def ISR_ALIASOF(target_vector)
        \ingroup avr_interrupts
    
        \code#include <avr/interrupt.h>\endcode
    
        The ISR is linked to another ISR, specified by the vect parameter.
        This is compatible with GCC 4.2 and greater only.
    
        Use this attribute in the attributes parameter of the ISR macro.
    */
    #  define ISR_ALIASOF(target_vector)
    #else  /* !DOXYGEN */
    #  define ISR_BLOCK
    #  define ISR_NOBLOCK    __attribute__((interrupt))
    #  define ISR_NAKED      __attribute__((naked))
    #  define ISR_ALIASOF(v) __attribute__((alias(__STRINGIFY(v))))
    #endif /* DOXYGEN */
    
    /* \@} */
    
    #endif
    
  • Helpful post
    #54
    Circuit Chaos
    Level 13  
    kazkowicz wrote:
    Głupi może pomysł, bo ja tylko asm, ale może to?

    #include <avr/io.h>

    avr/interrupt.h inkluduje go.

    Freddie Chopin wrote:
    Ja od razu mówię Ci, że używa tego starego skoro Ci nie działa. Naprawdę go wywal i będzie po problemie... Po co Ci tak stary kompilator?

    4\/3!!

    Też tak myślę - interfejs przerwań się zmienił jakiś (spory) czas temu a tutaj ewidentnie ISR() nie jest rozpoznawane jako deklaracja wektora przerwania (wskazuje na to warning o braku returna i analiza tablicy wektorów w hex-ie).
  • #55
    mkkomp
    Level 10  
    Uczyłem się z tego tutoriala i tam autor napisał, że ów 20040720 jest lepszy od nowszych wersji, bo ma jakieś ułatwienia... no to go zainstalowałem. Nowy też oczywiście miałem....
    No i po problemie, wreszcie :):):) Kilka dni walki z programem, szukania błędów, prób, a tu się okazało, że wystarczyło wywalić wszystko i zainstalować jeszcze raz najnowszą wersję.. Można się pochlastać ;) Dzięki wielkie za pomoc! :)