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

[ATmega] [UART] [C] Zmiana Baud Rate w czasie pracy programu

tomekk_nt 14 Sty 2012 14:32 2284 4
REKLAMA
  • #1 10395648
    tomekk_nt
    Poziom 10  
    W jaki sposób w trakcie działania programu na uC zmienić prędkość transmisji - Baud Rate? Napotkałem następujący problem, na który nie znalazłem niestety odpowiedzi. Transmisja ma przebiegać UARTem między PC a uC (ATmega32). Aplikacja uC ma mieć możliwość zmiany Baud Rate w czasie pracy.

    Załóżmy, że chcąc połączyć się z PC z BR 115200:
    1. Łączę się najpierw z uC z BR 19200.
    2. Wysyłam komunikat o zmianie BR.
    3. uC konfiguruje UART.
    4. PC się rozłącza i ponownie łączy z BR 115200.

    Problemem jest punkt 3. Próbowałem wykonać zmianę prędkości na uC w taki sposób:
    1. Wyłączenie przerwań po odebraniu komunikatu o zmianie BR.
    2. Ustawienie rejestrów BR w UART.
    3. Uruchomienie przerwań i inicjacja UART.

    Niestety po ponownym połączeniu PC z prędkością BR 115200 przy transmisji uC się wiesza albo wpada gdzieś w pętlę.

    Program na PC napisany jest w C#, wysyłanie komunikatu o zmianie transmisji działa prawidło. Fragment kodu odpowiedzialny za tą transmisję:

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Program uC (pisany w C) rozpoznaje komunikat i przechodzi do odpowiedniej sekwencji. A oto, co próbuję w niej zrobić:

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


    Do komunikacji UART wykorzystuję bibliotekę Pana Jespera Hansena, którą można znaleźć tutaj.
    Kwarc oczywiście okrągły dla UART - 11.0592 MHz.
  • REKLAMA
  • #2 10395801
    mirekk36
    Poziom 42  
    A może tak wypadałoby napisać w jakim języku to w ogóle próbujesz programować ?

    Generalnie to wymyśliłeś sobie sztuczne utrudnienie z tą zmianą prędkości i można powiedzieć tylko jedno - bo przecież do żadnego kodu nie można się odwołać (nic nie pokazałeś)

    Pewnie, że można to robić jak ktoś się uprze - to jest możliwe
    A wina w takim wypadku leży tylko i wyłącznie po twojej stronie bo nie potrafisz się programowo dopasować do tego po obydwu stronach.
  • REKLAMA
  • #3 10395869
    tomekk_nt
    Poziom 10  
    Więcej info w poście #1. Sorry, że od razu tego nie zamieściłem.

    Oczywiście, że jest to utrudnienie, nawet niekonieczne w tym projekcie, ale zaciekawił mnie też ten temat. Kiedyś nawet zrobiliśmy coś takiego na projekt, ale na ADuC no i to działało całkiem sprawnie.

    Zdaję sobie sprawę z tego, że wina leży po mojej stronie. Dlatego też zwracam się z prośbą do bardziej doświadczonych o jakieś wskazówki, jak można to skutecznie rozwiązać.
  • REKLAMA
  • #4 10396085
    tmf
    VIP Zasłużony dla elektroda
    W komunikacji UART nie ma czegoś takiego jak łączenie się i rozłączanie. Po prostu zmieniasz UBRR i każdy następny wysłany bajt wysyłany już jest z nową prędkością. Jak taktujesz procesor? Przez kwarc który daje sensowny podział dla otrzymania prędkości 115kbps? Zapewne nie i w tym jest problem. Im większa prędkość transmisji tym mniejsza tolerancja UART na odchylenia taktowania.
  • #5 10396164
    tomekk_nt
    Poziom 10  
    Mówiąc o ponownym łączeniu miałem na myśli aplikację po stronie PC - najpierw wysyłam komunikat z domyślną prędkością, później zamykam port i otwieram go ponownie z nowym BR. Fragment kodu zamieściłem w #1 poście.

    Kwarc oczywiście okrągły dla UART - 11.0592 MHz.
REKLAMA