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

Problem z obsługą przerwania

yorek 02 Paź 2009 10:03 1284 6
  • #1 7081613
    yorek
    Poziom 12  
    Witam.
    Próbuję uczyć się C na Atmedze 8 i mam problem z obsługą przerwania. Kod wygląda następująco (z resztą pisany na podstawie kursu z EdW):

    
    #include <c:\WinAVR-20090313\avr\include\avr\io.h>
    #include <c:\WinAVR-20090313\avr\include\avr\interrupt.h>
    #define F_CPU = 1000000
    
    int volatile wyjscia;
    int indeks;
    
    int main (void) {
    
    // koniguracja i definicje
    // włączenie  przerwań
    sei();
    
    // ustawienie pinów 0-3 portu B jako wyjścia
    DDRB=(1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3);
    
    // konfiguracja licznika
    TCCR0 = 1<<CS01|1<<CS00;
    TIMSK = 1<<TOIE0;
    
    wyjscia = 1;
    PORTB =wyjscia;
    indeks = 1;
    
    // koniec inicjacji 
    
    for(;;) {}
    
    return 0;
    }
    signal(SIG_OVERFLOW0)
    	{
    	wyjscia = 7;
    	PORTB = wyjscia;
    	}
    


    To co jest wpisane w obsłudze przerwania od timera0 nie ma większego sensu ale powinno zmieniać coś na porcie B a nie zmienia.
    Symulowałem program w AVR Studio. Program ustawia wyjścia i czeka, timer liczy, przepełnia się, wystawia flagę, program skacze pod adres tam gdzie zgodnie z dokumentacją jest wektor obsługi przerwania ale dalej nic się nie dzieje. Czemu wykonanie funkcji nie przynosi rezultatu? Z góry dzięki za podpowiedź
  • #2 7081752
    pubus
    Poziom 30  
    No i się wcale nie dziwię...
    Na początku przed pętlą główną odpalasz timer i ustawiasz PORTB = 1...
    Po czym po ~260ms wyzwalane jest przerwanie które już w kółko wstawia pod PORTB = 7...
    Co tu ma się zmieniać...??
    Zamień to co masz w obsłudze przerwania na PORTB ^= (1 << PB0)...
  • #3 7081864
    yorek
    Poziom 12  
    pubus napisał:

    Po czym po ~260ms wyzwalane jest przerwanie które już w kółko wstawia pod PORTB = 7...


    no właśnie w tym problem, że nie ustawia. niby program wykonuje skok do obsługi przerwania ale to wcale nie powoduje zmiany stanu wyjść.
  • #4 7081903
    BoskiDialer
    Poziom 34  
    No to prawdopodobnie kompilujesz kod nakazując kompilatorowi utworzenia kodu dla innego procesora - w przeciwnym przypadku w tablicy wektorów skok był by w odpowiednim miejscu i wszystko by działało.
  • #5 7082036
    yorek
    Poziom 12  
    nie no, atmeg8 i w makefile i w avrstudio
  • Pomocny post
    #6 7082149
    BoskiDialer
    Poziom 34  
    Skompilowałem to u siebie i od razu widać błąd: makro do przerwań pisze się z dużych liter: SIGNAL(...) - w takim przypadku uzyskałem poprawny kod. Przy "signal" z małych liter powstała funkcja o nazwie "signal" (zwracany typ domyślnie int, przez co kompilator wyrzucał jeden warning). C jest językiem case-sensitive.

    Co do reszty kodu: zmień dołączenie nagłówków na:
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    Oraz popraw definicję F_CPU na:
    #define F_CPU 1000000
    lub przesuń to do makefile. Dodatkowo zamiast SIGNAL możesz dać ISR co jest zalecane.
  • #7 7084616
    yorek
    Poziom 12  
    BoskiDialer napisał:
    Skompilowałem to u siebie i od razu widać błąd: makro do przerwań pisze się z dużych liter: SIGNAL(...) - w takim przypadku uzyskałem poprawny kod. Przy "signal" z małych liter powstała funkcja o nazwie "signal" (zwracany typ domyślnie int, przez co kompilator wyrzucał jeden warning).


    wielkie dzięki, działa :spoko:
REKLAMA