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

ATmega16A - reset programowy po wywołaniu przerwania komparatora analogowego

rrytel 15 Kwi 2015 18:08 984 4
  • #1 14619828
    rrytel
    Poziom 14  
    Witam,
    w poniższym programie występują niepożądane resety, sprawdzałem już wartość rejestru MCUCSR i tuż po resecie ma wartość 0 czyli jest to reset programowy. zorientowałem się, że źródłem jest wywołanie instrukcji odpowiadającej za przerwanie komparatora analogowego (w oknie disassembly adres 0x00000020), które jest wyłączone... nie wiem co powoduje skok do tego adresu.
    Program wykonywany na rzeczywistym procku, debug przez jtag.

    Kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    def.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    progmemdata.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ma ktoś z was pomysł co może być źródłem tych problemów, czas od uruchomienia do resetu jest nieregularny, czasem poniżej sekundy najczęściej kilka sekund, ale raz czekałem około minuty.
    edit:
    Gdy wyłączyłem przerwania zarówno poprzez brak sei(); jak i przez
    //UCSRB=(1<<RXCIE)|(1<<RXEN);
    UCSRB=(1<<RXEN);

    to resety nie występują, więc pewnie trzeba się przyjrzeć procedurze przerwania.
  • #2 14620403
    gielo33
    Poziom 12  
    Nie podałeś schematu, więc spytam. Czy kondensatory filtrujące są? Jak zasilana jest ATmega? czy źródło zasilania ma odpowiednia wydajność prądową?
  • #3 14620438
    rrytel
    Poziom 14  
    zasilacz impulsowy 2,3A, na płytce stykowej będzie 1500uF + przy procku 2x100nF, pomiędzy resetem a +5V 1kohm, rezonator kwarcowy 16MHz,
    dip swith na porcie A + PC7
    diody na portB
    dmx RX PD0
    Jtag na porcie C
    Taki opis wystarczy czy rysować lub zdjęcie zrobić?
  • #5 14622412
    rrytel
    Poziom 14  
    Diody na pewno poprawnie, dołączyłem na samym końcu po stwierdzeniu że występują resety, stan rejestru MCUCSR sprawdzałem początkowo przez debug, później wyciągnąłem na diody. po uruchomieniu/aktualizacji programu pokazuje reset zewnętrzny/JTAG, po niespodziewanym resecie gasną wszystkie (domyślam się że o to chodziło przy pytaniu o kierunek podłączenia diód)

    na stronie Link znalazłem opis z przerwaniami komparatora. Jak dodałem do kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    To przestałem zauważać resety. Mimo że wcześniej miałem instrukcję wyłączenia komparatora...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    :wink:
    EDIT:
    Jednak resety się pojawiają ale gdy odbieram dane, jak wyłącze nadajnik to nie ma resetów, jak nadajnik wysyła dane to resety następują.
    EDIT2:
    Na wszelki wypadek załączam zawartość okna disassembly (od adresu 0x002A do 0x0A9 jest moja tablica danych)
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i najnowszy kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA