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

[attiny2313][c/as6][isr] - dwukrotne wywołanie przerwania w debuggerze as6

piotrbdg2010 18 Sty 2013 11:22 975 0
  • #1 11805397
    piotrbdg2010
    Poziom 9  
    Witam,

    Mój cel to:
    Odbieranie danych poprzez usart,

    Sposób testowania aplikacji to:
    debugger w atmel studio 6 poprzez wyklikiwanie wartości bitów w IO View

    Problem, z którym walczę:
    Dwukrotne wywołanie ISR(USART_RX_vect)

    Ok, teraz opiszę problem nieco dokładniej. Zacznę od kodu (okrojonego):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W przedstawionym powyżej kodzie ustawiam breakpoint zaraz na wejściu do funkcji przerwania ISR(USART_RX_vect), uruchamiam debugger, zatrzymuję go (pauza bądź dodatkowy breakpoint w głównej pętli while(1)), następnie w IO View, w rejestrze UCSRA ustawiam (klikając) bit RXC (oprócz tego ustawiony jest jeszcze jeden bit UDRE, którego nie mogę odznaczyć), naciskam F5 czyli kontynuację debugowania. Debugger przenosi mnie do breakpointa w funkcji przerwania (ISR), odczytywany jest UDR. Niestety kolejny F5 przenosi mnie po raz drugi do funkcji przerwania, drugi raz odczytuję UDR i dopiero wtedy wartość rejestru UCSRA wraca do oryginalnej postaci (zaznaczony tylko bit UDRE) i kolejne wywołania ISR już nie następują - takiego zdarzenia oczekiwałbym już po pierwszym odczycie UDR, a nie dopiero po drugim.

    Moje pytanie (1) i pytania dodatkowe (2 i 3 - niezwiązane ściśle z tematem postu):
    1. Dlaczego tak się dzieje i jak to naprawić / rozumieć ?
    2. Dlaczego używanie F5 działa, a używanie F10 w debuggerze w ogóle nie powoduje wejścia do ISR? Wystarczy, że w debuggerze użyję F10 choćby raz to później F5 i tak nie spowoduje wejścia do ISR mimo ustawionego bitu RXC i muszę restartować debugger i używać tylko F5.
    3. W jaki sposób ręcznie mogę zasymulować jakąś wartość w rejestrze UDR? Niestety ręcznie nic tu nie mogę wyklikać - wartości bitów się nie zmieniają w widoku IO View i chyba w ogóle bo odczytywana w ISR wartość z rejestru UDR wynosi 0.

    Ponadto mam wrażenie, że moje wyklikiwanie bitów w IO View jest mocno chałupniczym podejściem. Czytałem o plikach stimuli, ale zdaje się, że to nie działa w as6. Jak powinienem podchodzić do takich tematów?
REKLAMA