Cześć
Sprawdzam różne rzeczy podczas nauki uarta dla xmega128a3u. Korzystam z biblioteki Atmela, uart w trybie z przerwaniami, software'owy cykliczny bufor odbiorczy i nadawczy. Mam tablicę z danymi w formie znaków ASCII. Oglądam sobie wszystko przy pomocy realterma, do PC podłączone za pomocą przejściówki rs485-usb. Chciałem na początek obliczyć ile dokładnie znaków wysyłam.
Jak to wygląda konkretnie:
- UARTC1 wysyła mi dane z ww. tablicy komend,
- w przerwaniu USARTC1_DRE zwiększam licznik o 1 za każdym wywołaniem
- wysyłam dane za pomocą USARTC0 do komputera.
Oto kod:
Przerwanie USARTC1_DRE:
No i wszystko się zgadza, widzę na terminalu ile znaków wysłałem. Jednakże, gdy zwiększam licznik w przerwaniu:
to na terminalu widzę 1.
I tu moje pytanie: o ile wiem, to rejestr wyjściowy uarta to rejestr przesuwny. Przerwanie to powinno być odpalone, gdy wszystkie bity z tego rejestru zostaną wypchnięte i żaden nie oczekuje na wysłanie (nota: The transmit complete interrupt flag (TXCIF) is set and the optional interrupt is generated when the entire frame in the shift register has been shifted out and there are no new data present in the transmit buffer.). Pierwotnie myślałem, że tak się dzieje (przerwanie txc jest odpalane) przy każdej wysłanej ramce, czyli tyle razy ile wysyłam bajtów danych, a tu się okazuje, że to przerwanie jest zapalane raz po całej sekwencji wysyłki z mojej pętli while.
Jak to w końcu jest z tym przerwaniem? Czy rejestr przesuwny jest zapełniany w sposób ciągły danymi z bufora software'owego tak długo aż nie skończą się dane i przez to przerwanie TXC odpala się tylko raz na koniec, a nie po każdym bajcie?
Proszę uprzejmie o wskazówki i pozdrawiam.
Sprawdzam różne rzeczy podczas nauki uarta dla xmega128a3u. Korzystam z biblioteki Atmela, uart w trybie z przerwaniami, software'owy cykliczny bufor odbiorczy i nadawczy. Mam tablicę z danymi w formie znaków ASCII. Oglądam sobie wszystko przy pomocy realterma, do PC podłączone za pomocą przejściówki rs485-usb. Chciałem na początek obliczyć ile dokładnie znaków wysyłam.
Jak to wygląda konkretnie:
- UARTC1 wysyła mi dane z ww. tablicy komend,
- w przerwaniu USARTC1_DRE zwiększam licznik o 1 za każdym wywołaniem
- wysyłam dane za pomocą USARTC0 do komputera.
Oto kod:
Kod: C / C++
Przerwanie USARTC1_DRE:
Kod: C / C++
No i wszystko się zgadza, widzę na terminalu ile znaków wysłałem. Jednakże, gdy zwiększam licznik w przerwaniu:
Kod: C / C++
to na terminalu widzę 1.
I tu moje pytanie: o ile wiem, to rejestr wyjściowy uarta to rejestr przesuwny. Przerwanie to powinno być odpalone, gdy wszystkie bity z tego rejestru zostaną wypchnięte i żaden nie oczekuje na wysłanie (nota: The transmit complete interrupt flag (TXCIF) is set and the optional interrupt is generated when the entire frame in the shift register has been shifted out and there are no new data present in the transmit buffer.). Pierwotnie myślałem, że tak się dzieje (przerwanie txc jest odpalane) przy każdej wysłanej ramce, czyli tyle razy ile wysyłam bajtów danych, a tu się okazuje, że to przerwanie jest zapalane raz po całej sekwencji wysyłki z mojej pętli while.
Jak to w końcu jest z tym przerwaniem? Czy rejestr przesuwny jest zapełniany w sposób ciągły danymi z bufora software'owego tak długo aż nie skończą się dane i przez to przerwanie TXC odpala się tylko raz na koniec, a nie po każdym bajcie?
Proszę uprzejmie o wskazówki i pozdrawiam.