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

[ATMega128][C] Ciągle występujące przerwanie

mbank 26 Mar 2010 20:50 1468 15
REKLAMA
  • #1 7883781
    mbank
    Poziom 10  
    Mam przerwanie na INT1, ustawiam je tak:

    Cytat:
    EICRA = _BV(ISC11) | _BV(ISC10);
    EIMSK = _BV(INT1);


    Jest ono wyzwalane na rosnące zbocze. I działa, jak podaje na pin 5V to przerwanie występuje, ale występuje cały czas. Tzn nie raz przy narastającym zboczu, a cały czas, kiedy występuje 5V na pinie. Przerwanie wykonuje się non stop od początku, dlaczego? Przecież nie jest na stan wysoki, tylko na narastające zbocze, które podczas trwania 5V narasta tylko raz, na początku.
  • REKLAMA
  • #2 7884089
    _Robak_
    Poziom 33  
    Włącz sobie pull up na tym pinie i pewnie wszystkie czary znikną;)
  • #3 7884167
    mbank
    Poziom 10  
    Jest włączony i występuje tam cały czas 5V. I wtedy cały czas występuje przerwanie.
  • #4 7884382
    michalko12
    Specjalista - Mikrokontrolery
    M103C wykasowany?
  • #5 7884588
    mbank
    Poziom 10  
    Tak, fuse dobrze ustawione.
    Ogólnie, to powinien zareagować tylko na zbocze sygnału, wykonując przerwanie tylko raz?
  • REKLAMA
  • #6 7884990
    _Robak_
    Poziom 33  
    Wiesz, to że na pinie jest 5V nie znaczy że zakłócenia nie mają wpływu. Jeśli z jakichś przyczyn będziesz miał dzwonienie na masie, to może być taka sytuacja, że wyzwoli Ci się przerwanie. Załóżmy, że potencjał na masie wzrośnie do 2V, wtedy tak jak byś miał 3V na pinie interrupt, gdy napięcie na masie spadnie to, na pinie, widziane jest jako zbocze rosnące. Taka sytuacja może mieć miejsce jak masz większą ilość układów CMOS, szczególnie AC.
  • REKLAMA
  • #7 7886757
    mbank
    Poziom 10  
    Dałem pull-up przez rezystor do zasilania, połączyłem nogę kondensatorem z masą i dalej to samo. Bez sensu. mam na zasilaniu jeden przetwornik AC, jest sztywne 5V z kondensatorami. To nie może być przyczyną, że występują jakieś szpilki.
  • #8 7886922
    michalko12
    Specjalista - Mikrokontrolery
    mbank napisał:
    Dałem pull-up przez rezystor do zasilania, połączyłem nogę kondensatorem z masą i dalej to samo. Bez sensu. mam na zasilaniu jeden przetwornik AC, jest sztywne 5V z kondensatorami. To nie może być przyczyną, że występują jakieś szpilki.


    Pokaż cały kod, bo w przeciwnym wypadku to można sobie tylko teoretyzować.
  • #9 7886964
    mbank
    Poziom 10  
    Reszta programu jest nieistotna, program jest za duży, żeby go wklejać. Ogólnie przerwanie wygląda tak:

    volatile u08 licznik;
    
    ISR(INT1_vect)
    {	
    	licznik++;
    }
    
    void Init(void)
    {
    	DDRD &= ~_BV(1); //
    	PORTD |= _BV(1);
    
    	//init dla przerwania zewnetrznego
    	EICRA = _BV(ISC11) | _BV(ISC10);		//Zbocze narastajace
    	EIMSK = _BV(INT1);			//Wlacz Przerw zewn
    }
    
    
    int main(void)
    {	
    Init();
    	sei();
    	while(1)   
    	{}		
      }
      return(0);	  
    }


    Ogólnie złącze jest w stanie niskim, podciągnięte przez procesor (sprawdzałem też z rezystorem) do 4V. Po odłączeniu go od masy pojawia się przerwanie, które występuje cały czas, bo zmienna licznik zmienia się non stop (cały czas rośnie do 255, zeruje się i od nowa to samo). I tak aż do czasu, jak znów podam masę na pin.
  • #10 7887240
    michalko12
    Specjalista - Mikrokontrolery
    Podaj wartość fusebitów w hexie jakimi programujesz procesor i zrzut ekranu programatora z opcjami tych fusebitów.
  • #11 7887306
    mbank
    Poziom 10  
    Fuse programuje w AVRStudio przez JTaga.
    Zaznaczone OCDEN, JTAGEN, SPIEN, EESAVE, CKPOT i ustawiny rezonator na zewnętrzny 64ms +16k, boot na 4096. Wszystki lock odblokowane.
    Wartości to:
    EXTENDED: 0xFF
    HIGH: 0x01
    LOW 0XFF
  • #12 7887476
    __Grzegorz__
    Poziom 30  
    Proponuję poczytać o EIFR...

    I proszę zastanowić się, czy warto (i dlaczego) kasować flagi przerwań w procedurze jego obsługi...
  • #13 7889401
    _Robak_
    Poziom 33  
    Kolego __Grzegorz__, proponuję zapoznać się z datasheetem;)
    Cytat:


    When an edge or logic change on the INT7:0 pin triggers an interrupt request, INTF7:0
    becomes set (one). If the I-bit in SREG and the corresponding interrupt enable bit,
    INT7:0 in EIMSK, are set (one), the MCU will jump to the interrupt vector. The flag is cleared when the interrupt routine is executed.

    Zabawy z flagą w EIFR mają sens wtedy, jeśli włączymy wyzwalanie zboczem, czyli ustawimy bity w rejestrze np. EICRA, ale nie zezwolimy na przerwanie, wtedy flaga się załącza ale przerwanie wywołuje dopiero wtedy gdy włączony będzie bit w rej. EIMSK, ale to inny temat;)
  • #14 7889878
    __Grzegorz__
    Poziom 30  
    Skoro tak, to po co jest to zdanie, które wytłuściłem:
    Cytat:

    When an edge or logic change on the INT7:0 pin triggers an interrupt request, INTF7:0 becomes
    set (one). If the I-bit in SREG and the corresponding interrupt enable bit, INT7:0 in EIMSK, are
    set (one), the MCU will jump to the interrupt vector. The flag is cleared when the interrupt routine
    is executed. Alternatively, the flag can be cleared by writing a logical one to it. These flags are
    always cleared when INT7:0 are configured as level interrupt.

  • #15 7892556
    _Robak_
    Poziom 33  
    Widzę że kolega wyznaje zasadę, nie ważne do czego, ważne żeby się przyczepić. Proponuję w takim razie krótką, zabawę symulatorem.
    W każdym razie, nie wiem do końca jakie było przesłanie autorów, jeśli bit I w SREG, będzie ustawiony, to fakt tak czy inaczej flaga INTF zostanie skasowana, przez wywołanie przerwania bądź pseudo "reset" procesora. Z tą flagą jest to przetestowane przeze mnie na "żywo";) Troszkę zagwozdkę miałem z tym:)
  • REKLAMA
  • #16 7892741
    michalko12
    Specjalista - Mikrokontrolery
    __Grzegorz__ napisał:
    Skoro tak, to po co jest to zdanie, które wytłuściłem:
    Cytat:

    These flags are always cleared when INT7:0 are configured as level interrupt.


    Flagi są odzwierciedleniem przerzutnika rejestrującego zdarzenie i mają tylko charakter informacyjny. Zapis "1" powoduje wykasowanie przerzutnika i tym samym wyłączenie flagi. W przypadku przerwania wywoływanego poziomem, przerzutnik jest pomijany i sygnał z wejścia trafia bezpośrednio na linię wywołującą przerwanie, wtedy flagą jest stan źródła przerwania. Mimo, że przerwanie może być zablokowane, przerzutnik dalej może rejestrować zdarzenia (jeśli źródło generujące przerwanie jest włączone) i bezpośrednio po odblokowaniu przerwania nastąpi wywołanie funkcji obsługującej przerwanie. Po to jest możliwość kasowania flagi, aby zapobiec temu.
REKLAMA