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

[Attiny2313][C/AVR Studio 4]Przerwanie w debbugerze

hrabia86 01 Lut 2010 10:53 2224 14
REKLAMA
  • #1 7625642
    hrabia86
    Poziom 11  
    Napisałem krótki i prosty program do tego aby podczas debbugowania krokowego sprawdzić jak zachowuje się uC. Przerwanie pochodzi z zewnątrz (INT0). I teraz jest tak : przerwanie jest wykryte, ale zamiast skoczyć do funkcji obsługującej to przerwanie program skacze na początek funkcji main (). Co jest nie tak ?? Próbowałem już przy pomocy SIGNAL(), INTERRUPT(), z róznymi wektorami i nic :/

    Ponizej umieszczam kod :

    // pliki nagłówkowe

    #include <avr/io.h>
    #include <avr/interrupt.h>




    int start(void)
    {
    // Port B jako wyjście
    DDRB = 0xFF; // wyświetlacz
    PORTB = 0xFF;
    // Port D jako wejście
    DDRD = 0x00; //konfiguracja portu D
    PORTD = 0x00;
    MCUCR = 0x01; // INT0 - każda zmiana wywołuje przerwanie
    GIMSK = 0x40; // odblokowanie przerwań od INT0
    return 0;
    }


    ISR(INT0_vect)
    {
    PORTB != PORTB;
    return 0;
    }

    int main(void)
    {
    // konfiguracja
    start();
    sei(); // pozwolenie na przerwania
    PORTB = 0x00;
    PORTD = 0x00;
    while(1)
    asm("nop");
    return 0;

    }
  • REKLAMA
  • #2 7625698
    Konto nie istnieje
    Konto nie istnieje  
  • #3 7625754
    Balu
    Poziom 38  
    technics...
    Po jakiego ma usunąć return? po jakiego mu nawiasy za whilem?
    Toć to jego kod jest w 100% poprawny a return na końcu main'a to naleciałość z PC. Też piszę i nie mam z tym problemów...

    Dodano po 1 [minuty]:

    No chyba, że o return w przerwaniu Ci chodzi:)
  • #4 7625789
    Konto nie istnieje
    Konto nie istnieje  
  • #5 7625870
    hrabia86
    Poziom 11  
    Wywaliłem ten "return 0". Nadal jest tak samo. Zastanawia mnie to bardzo, dlaczego to nie działa. Kiedyś napisałem program z obsługą przerwania od Timera, też na Attiny2313 i wszystko działało bez problemu. Pamiętam ze tam użyłem SIGNAL() do obsługi przerwania.
    Teraz z tym INT0 chodzić to w AVR Studio nie chce.

    Panowie macie rację z tym resetowaniem uC po przerwaniu, nie zwróciłem na to uwagi. Ale nadal nie mam pomysłu na to jak to rozwiązać.

    Z góry dzięki za pomoc i czekam na kolejne propozycje...
  • REKLAMA
  • #6 7625882
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #7 7625916
    rodzio
    Poziom 12  
    Zmień
    Cytat:
    while(1)
    asm("nop");


    na
    Cytat:
    while(1);


    Avr-gcc czasem dziwnie zachowuje się przy pętlach bez {}
  • #8 7625989
    hrabia86
    Poziom 11  
    Podczas debbugowania mam dostęp do rejestrów portu D, i za pomocą rejestru PIND zmieniam wartość pola PIND.2. W taki sposób wywołuję przerwanie. Nie wiem czy poprawnie ale nie znalazłem innego sposobu.


    Metodę bez "nop" też wypróbowałem i bez rezultatu niestety.
  • #9 7626036
    rodzio
    Poziom 12  
    Zmieniłem procek, zasymulowałem i działa, więc problem nie leży w składni. Nie za bardzo znam się na Attiny ale może są tam jakieś dodatkowe rejestry do ustawienia. Przeglądnąłem bibliotekę io.h, wektor dla INT0 jest prawidłowy.


    Dobra działa, coś jest powalone zmień INT0_vect na INT1_vect.
  • #10 7626106
    hrabia86
    Poziom 11  
    Dobrze.
    Napisz jeszcze co konkretnie na co zmieniłeś ok.
    Bo nie wiem czy mam zmienić w rejestrach konfiguracyjnych ustawienia pod INT1 czy tylko wektor w funkcji ISR().
    Na jaki dokładnie uC zmieniłeś ??
  • REKLAMA
  • #11 7626118
    rodzio
    Poziom 12  
    Procesor zostaw jak jest. A w programie zamień tylko ISR(INT0_vect) na ISR(INT1_vect) i nic więcej. Musi być jakiś błąd w bibliotece i wskazuje na zły wektor.
  • #12 7626154
    hrabia86
    Poziom 11  
    OK
    Zmieniłem i nic :/
    No nie wiem może złego WinAVR używam bo wiem ze tam pomiędzy wersjami też są różnice.
    Ja korzystam z :
    -AVR studio 4.16
    - WinAVR 20040720

    A Pan ??
    Z nowszą wersją AVR studio miałem problemy aby uruchomić debbuger.
  • Pomocny post
    #13 7626184
    rodzio
    Poziom 12  
    WinAVR 20090313, widocznie starszej wersji co innego doskwiera:)

    Proponuje uaktualnić WinAVR Link.

    Widzę, że jest już nowa wersja z 2010, może tam to będzie działać jak należy, a jeśli nie to tak jak pisałem wyżej pewnie zamiana INT0 na INT1 pomoże.
  • #14 7626197
    hrabia86
    Poziom 11  
    Zaraz przeinstaluję... no to faktycznie moja wersja to już staruszek.
    Zauważyłem też ze przy wystąpieniu przerwania w rejestrze flag EIFR flaga INTF0 w ogóle nie jest ustawiana.
    Zobaczymy co wyniknie po zmianie WINAVR

    Dodano po 19 [minuty]:

    Na reszcie działa !!!
    Przedstawiam kod który działa prawidłowo. Zmieniłem WinAVR na wersję którą proponował kolega w poście powyżej. A poniżej kod :

    // pliki nagłówkowe

    #include <avr/io.h>
    #include <avr/interrupt.h>

    int start(void)
    {
    // Port B jako wyjście
    DDRB = 0xFF; // wyświetlacz
    PORTB = 0xFF;
    // Port D jako wejście
    DDRD = 0x00; //konfiguracja portu D
    PORTD = 0x00;
    MCUCR = 0x02; // INT0 - każda zmiana wywołuje przerwanie
    GIMSK = 0x40; // odblokowanie przerwań od INT0
    return 0;
    }


    ISR(INT0_vect)
    {
    PORTB =~PORTB ;
    return 0;
    }

    void main(void)
    {
    // konfiguracja
    start();
    sei(); // pozwolenie na przerwania

    while(1)
    asm("nop");


    }

    Dziękuję Koledze za pomoc.
REKLAMA