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

Jak obliczyć liczbę wysyłanych znaków przez UART w Xmega128A3U?

dawid.barracuda 08 Kwi 2017 16:27 834 4
REKLAMA
  • #1 16400285
    dawid.barracuda
    Poziom 13  
    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:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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


    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++
    Zaloguj się, aby zobaczyć kod

    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.
  • REKLAMA
  • Pomocny post
    #2 16400334
    tmf
    VIP Zasłużony dla elektroda
    Cytat:
    when the entire frame in the shift register has been shifted out and there are no new data present


    Z czego wynika, że przerwanie jest generowane, gdy w UART nic nie ma (czyli nic nie ma w rejestrze nadajnika i buforze sprzętowym). W przypadku ciągłej transmisji nie jest więc generowane TxC. Co zresztą nie miałoby sensu. Dzięki temu możesz rozpoznać sytuację, gdy UART skończył nadawać i można np. bezpiecznie wyłączyć nadajnik.
  • REKLAMA
  • #3 16400341
    dawid.barracuda
    Poziom 13  
    Czyli mam rozumieć, że jest bufor sprzętowy (przesuwny) i bufor nadajnika (rejestr DATA)?
  • REKLAMA
  • Pomocny post
    #4 16400379
    tmf
    VIP Zasłużony dla elektroda
    Tak, masz rejestr nadajnika i do tego chyba 2-poziomowy bufor. Dzięki czemu możesz załadować kilka bajtów do wysyłki (tu posługujesz się UDRE), a jak wszystkie zostaną wysłane i w buforach też nic nie będzie to zgłoszone zostanie TXC.
  • #5 16400387
    dawid.barracuda
    Poziom 13  
    Aaa, no to teraz sprawa jasna. Dziękuję Panie Tomku po raz kolejny za pomoc i pozdrawiam serdecznie :) Temat uważam za zamknięty :)
REKLAMA