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

[Atmega32][c] problem z komparatorem i przerwaniami zewn.

smolar758 14 Kwi 2010 23:57 1287 9
  • #1 7962677
    smolar758
    Poziom 10  
    Qurcze,
    walczę z softem, gdzie muszę korzystać z komparatora (obsługuje go na przerwaniu) i dwóch przerwań zewnętrznych INT0 i INT1. Niestety coś tu mi nie działa i program się sam resetuje wracając do początku funkcji "main" :cry:
    
    int main()
    {
    //wlaczenie przerwan zewnetrznych INT0 i INT1
     GICR |= (1<<INT0); // INT0
     GICR |= (1<<INT1); // INT1
    //konfiguracja komparatora		
     cbi(SFIOR, ACME);  
     cbi(ACSR, ACIS1);  
     cbi(ACSR, ACIS0);  
     cbi(ACSR, ACD);    
    
     sei();
    //aktywacja przerwania od komparatora
     sbi(ACSR, ACIE); 
     while (1) ;
    }
    

    w symulatorze tez się krzaczy. Jak wyłączę obsługę INT0 i INT1 wszystko działa. Ale nie rozumiem dla czego. Zależy mi na tych przerwaniach.
    Siedzę już drugi wieczór nad tym problemem i nie rozumiem gdzie przysłowiowy sęk.
    Proszę o pomoc
  • #2 7963068
    MichalKl
    Poziom 16  
    Nie chce mi się patrzyć do noty aby sprawdzić rejestry...

    Objaw ten już znam: masz dobrze napisane wektory przerywań?
    Oraz czy przypadkiem nie włączyłeś jakiegoś przerywania i zostawiłeś je bez obsługi?
  • #3 7963100
    elektronik12z
    Poziom 13  
    Witam

    Sprawdź czy masz funkcje obsługujące przerwania mogą być nawet puste, np:

    dla Atmegi 8:

    
    ISR(INT0_vect)
    {
     //coś
    }
    ...
    ISR(INT1_vect)
    {
     //coś
    }
    
    
    



    jeśli masz to zaremuj ciało tych funkcji, być może masz jakieś delay (za długo je obsługujesz). Problemem mogą być to też zmienne, które powinny być zadeklarowane jako volatile itp...

    Przyczyn może być po prostu wiele.
    Pozdrawiam
  • #4 7963120
    smolar758
    Poziom 10  
    Mam wpisaną obsługę przerwań wektorów INT0_vect i INT0_vect, żadne przerwanie nie jest "puste" aby było ciekawiej to kod który podałem jest bardzo prosty i po dołączeniu bibliotek i funkcji obsługujących te wektory przerwań (nawet z "nop" tez tak się zachowuje.
    Nie mam więcej pomysłów stąd moje wołanie o pomoc:cry:
  • #5 7963169
    kemot55
    Poziom 31  
    Poczytaj może na temat stosu.
  • #6 7963193
    MichalKl
    Poziom 16  
    I przerywanie od komparatora również napisane?

    W nowym projekcie tnij program do oporu. Będziesz miał pojęcie gdzie jest błąd.
    Rozumiem, że już sam kod z przerywaniami (bez reszty programu) testowałeś i działa.
    Jeżeli tak to chyba pozostaje stos.

    Zawsze możesz wrzucić kod (ten mocno okrojony) i go przetestujemy.
  • #7 7963434
    elonica
    Poziom 12  
    1. Czy nie powinieneś ustawić pinów przerwań jako wejśc (ja dla pewności tak robię)

    2. Ustaw w rejestrze MCUCR jaki ma mieć charakter (na stan lub na zmianę stanu).

    3. Sprawdź, czy przewód z pinu przewania nie "wisi" w powietrzu. Obsługa przerwań działa znakomicie i łapie wszelkie stany z powietrza.

    4. Jak już ogarniesz to pewnie będziesz musiał zrobić debounca - filtr dolnoprzepustowy.

    5. Nie wiem jak się zachowuje program w którym uruchomisz przerwanie, ale nie napiszesz funkcji obsługi. może skakać do reset.

    6. No i oczywiście watchdog, ale tego nie podejrzewam jeśli nie uruchamiałeś.
  • #8 7963451
    MichalKl
    Poziom 16  
    elonica - program krzaczy się nawet w symulatorze
  • #9 7963502
    smolar758
    Poziom 10  
    Temat opanowany i zamykam:) Dzięki wszystkim za uwagi i wskazówki.
    Ponieważ szukanie przyczyny mogłoby mi zająć trochę więcej czasu niż napisanie
    kodu od początku postanowiłem skorzystać z sugestii MichalKl a w dodatku jeszcze raz przeinstalowałem WinAVR bowiem miałem z nim kiedyś inne problemy i ... wszystko hula jak należy. Jak będę miał wolną chwilkę (w co wątpię) to poszukam jeszcze tego buga.
    Jeszcze raz 100xthnx
  • #10 7963505
    elonica
    Poziom 12  
    Rzeczywiście,

    ale nie do końca wiadomo co oznacza:
    "w symulatorze tez się krzaczy"

    jeśli krzaczyłoby się to samo co na bordzie to problem można łatwo namierzyć debuggerem i symulacją krokową ?

    po prostu staram się pomóc :-)
REKLAMA