Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przejęcie wektora <__bad_interrupt> w AVR

24 Lut 2017 20:33 1095 19
  • #1 24 Lut 2017 20:33
    22053
    Użytkownik usunął konto  
  • Pomocny post
    #2 24 Lut 2017 20:59
    jnk0le
    Poziom 18  

    <__bad_interrupt> jest słabym symbolem który możesz podmienić poprzez:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 24 Lut 2017 21:12
    22053
    Użytkownik usunął konto  
  • #5 24 Lut 2017 21:20
    excray
    Poziom 39  

    Jeśli piszesz w C to nie obsłużone przerwanie nie zresetuje Ci procka - kompilator już o to zadbał. Problemu powinieneś raczej szukać np. w niewłaściwej obsłudze stosu.

    0
  • #6 24 Lut 2017 21:21
    22053
    Użytkownik usunął konto  
  • #7 24 Lut 2017 21:48
    dondu
    Moderator Mikrokontrolery Projektowanie

    Tak jak napisałeś problemem jest najprawdopodobniej włączenie przerwania, którego nie obsługujesz w programie.
    Należy więc przede wszystkim poszukać tego błędu w kodzie sprawdzając wszelkie użycia rejestrów odpowiedzialnych za przerwania.

    Jak nie znajdziesz, to możesz wybrnąć tak, by zadeklarować wszystkie pozostałe funkcje ISR i na tej podstawie ustalić, która z nich jest wykonywana.

    0
  • #8 24 Lut 2017 21:55
    22053
    Użytkownik usunął konto  
  • #10 24 Lut 2017 22:13
    22053
    Użytkownik usunął konto  
  • #11 24 Lut 2017 22:47
    excray
    Poziom 39  

    R-MIK napisał:
    Fakt ale debuger zatrzyma mi się i moge zobaczyć który układ ma ustawioną flagę IRQ. Tak będzie szybciej niz nanlizować kod programu.

    Flagi zazwyczaj się kasują przy obsłudze przerwania więc nic nie zobaczysz.

    0
  • #12 24 Lut 2017 23:03
    22053
    Użytkownik usunął konto  
  • #14 24 Lut 2017 23:13
    excray
    Poziom 39  

    dondu napisał:
    USART także kasuje:

    Ale RXC o ile się nie mylę, już nie jest kasowana przy obsłudze przerwania. Dopiero odczyt UDR kasuje flagę RxC:
    Cytat:
    This flag bit is set when there are unread data in the receive buffer and cleared when the receive
    buffer is empty (i.e., does not contain any unread data). If the Receiver is disabled, the receive
    buffer will be flushed and consequently the RXCn bit will become zero. The RXCn Flag can be
    used to generate a Receive Complete interrupt (see description of the RXCIEn bit).

    0
  • #15 24 Lut 2017 23:21
    22053
    Użytkownik usunął konto  
  • #16 25 Lut 2017 10:07
    tmf
    Moderator Mikrokontrolery Projektowanie

    R-MIK napisał:

    excray napisał:
    Jeśli piszesz w C to nie obsłużone przerwanie nie zresetuje Ci procka - kompilator już o to zadbał. Problemu powinieneś raczej szukać np. w niewłaściwej obsłudze stosu.

    Nie zresetuje tylko skoczy do sekcji "int0" czyli tam gdzie wskazuje wektor $0 czyli resetu. Różnica taka, że peryferia są ustawione jak były, nie sa inicjalizowane


    Domyślnie obsługa nieistniejącego przerwania zapętla program, a nie skacze pod wektor resetu. Więc brak obsługi IRQ nie resetuje procka, tylko go zawiesza.

    0
  • #17 25 Lut 2017 10:21
    22053
    Użytkownik usunął konto  
  • #18 25 Lut 2017 10:33
    tmf
    Moderator Mikrokontrolery Projektowanie

    @R-MIK Ok, masz rację. To zrób sobie ISR dla każdego możliwego wektora. Będziesz wiedział, który jest wywoływany.

    0
  • #19 25 Lut 2017 11:18
    22053
    Użytkownik usunął konto  
  • #20 21 Mar 2017 17:11
    22053
    Użytkownik usunął konto