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

[ATmega32][GCC] Złe wychwytywanie przerwań

loczi 31 Maj 2010 17:08 1446 14
REKLAMA
  • #1 8138070
    loczi
    Poziom 13  
    Witam,
    Mam taki program Link

    Problem jest tym:
    * gdy nacisnę raz INT0 to uruchamia się procedura od INT0
    * gdy przytrzymam INT0 to uruchamia się procedura od INT0 w kółko(tak powinno być) lecz po jakimś czasie w kółko uruchamia się procedura od INT1.
    * gdy przytrzymam INT2 to uruchamia się procedura od INT2, ale tylko raz.

    PS. Ostatnio zmieniałem fuse bity. ;/

    EDIT. Chodzi mi tylko o pogrubiony przypadek,czemu tak jest. Jakie są domyślne fusebity dla ATmega32?
  • REKLAMA
  • Pomocny post
    #2 8138232
    m.bartczak
    Poziom 16  
    Na szybko:

    W kodzie przerwań masz _delay_ms(). Zmień kod tak aby w przerwaniach tylko przechwytywać zaistnienie zdarzenia i całą obsługę zrób w głównej pętli.

    Jeśli masz tak równe odcinki czasu (50ms i 500ms), to zamiast głównej pętli możesz też zrobić przerwanie timera.

    Ogólnie: Przerwania to nie procesy :)

    Update:

    Jeśli chodzi o Twoje pytanie: jak masz skonfigurowane przerwania? Tylko to co w kodzie? Jak masz podpięte piny? Bo domyślna konfiguracja AVR'a jest "Reaguj na pin w stanie niskim". Dotyczy to INT1 i INT0. INT2 reaguje tylko na zbocza sygnałów, stąd moje pytanie :)
  • #3 8138434
    loczi
    Poziom 13  
    Kod jest tylko taki jak umieszczony. Piny są podpięte INT0 - PD2 INT1 - PD3 INT2 - PB2(zgodnie z dokumentacją).

    Chodzi mi jakie fusebity bym musiał ustawić żeby było domyślnie. (mam DF E1)
  • REKLAMA
  • #4 8138499
    m.bartczak
    Poziom 16  
    Chodziło mi o to co jest do nich podpięte, jakiś mały schemat.
  • #6 8138761
    m.bartczak
    Poziom 16  
    Ale w jaki sposób? Czy przyciski 'nie naciśnięte' wiszą w powietrzu tak jak to jest na schemacie?

    To może być odpowiedź na Twoje pytanie...

    Hint: Spróbuj ustawić pull-upy dla DDRD, czyli dodaj linię:

    PORTD=0xFF;
  • REKLAMA
  • #7 8138790
    loczi
    Poziom 13  
    piny sa na płytce już, ale na 100% to nie problem pinów. Teraz jak piszę inny program. Mam tak za INT0 jest na D1 ;/
  • #8 8138814
    m.bartczak
    Poziom 16  
    Tak jak napisałem - w AVR'kach masz wbudowane pull-upy, tylko trzeba je włączyć.

    Ogólnie - jeśli pin jest wejściowy nigdy nie zostawiaj go wiszącego.

    Zgodnie z dokumentacją:

    "This also means however, that input pins with nothing connected to them, or with wires connected to them that are not connected to other circuits, will report seemingly random changes in pin state, picking up electrical noise from the environment, or capacitively coupling the state of a nearby pin."

    Czyli masz dokładnie zachowanie z punktu 2 - 'losowo na pinie sterującym INT pojawiają się wartości pinu obok'
  • REKLAMA
  • #9 8138966
    loczi
    Poziom 13  
    Tylko przerwanie działa na D1, a nie na D2.
  • #10 8139041
    PO.
    Poziom 20  
    loczi napisał:
    piny sa na płytce już, ale na 100% to nie problem pinów. Teraz jak piszę inny program. Mam tak za INT0 jest na D1 ;/


    Ale że co? Przerwania są na fizycznych nóżkach, nie przestawisz ich.

    Jeśli zwierasz przyciski do masy to (j/w) je podciągnij, mogą być wewnętrzne pullupy.

    Nie konfigurujesz typu przerwania, domyślnie jest low level zdaje się - a jak jest low level to musisz naprawdę krótko przycisnąć przycisk, żeby się wykonało tylko raz :E ...
  • #11 8139060
    loczi
    Poziom 13  
    Nie chodzi, o to że się wykonuje wiele razy tylko

    Tylko przerwanie działa na D1, a nie na D2(tak jak jest w specyfikacji)
  • #12 8139131
    m.bartczak
    Poziom 16  
    Zamiast krzyczeć, po prostu włącz te pull-upy i zobacz, to przecież tylko 1 linijka kodu!

    Przeczytaj też to co zacytowałem po angielsku.
  • #13 8139278
    loczi
    Poziom 13  
    Sprawdzałem... ;/

    EDIT. Rezultatów BRAK
  • #14 8139344
    m.bartczak
    Poziom 16  
    No i jaki rezultat?
  • #15 8139413
    sulfur
    Poziom 24  
    Według karty katalogowej mega32 strona 255 tabela 105 i strona 256 tabela 106 domyślne fuse bity
    high: 10011001
    low: 11100001
REKLAMA