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):
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?
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++
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?
