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 sprawdzić koniec transmisji UART w AVR ASM (Atmega328 i Attiny2313)?

higlos 14 Gru 2016 10:23 1002 7
REKLAMA
  • #1 16125944
    higlos
    Poziom 13  
    Witam,

    Mam układ komunikujący się po UART pomiędzy Atmega328 (master) a Attiny2313(slave) . Transmisja działa prawidłowo jednak mam pewien problem. Jest ona zamieniana na RS485 poprzez MAX485. Układ AVR Master steruje pracą tych układów aby przełączać kierunek ich pracy. Tutaj właśnie chciałem dopracować program. Po zakończonej transmisji czekam w programie sztucznie 1milisekunde i po tym czasie zmieniam stan portu aby układ Master mógł odebrać dane. Próbowałem doszukać się odpowiedniego rejestru w nocie aby program poczekał na wysłanie ostatniego bitu stop. Program jest napisany w asamblerze:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod



    Dziękuje za podpowiedź i ewentualne sugestię :)
  • REKLAMA
  • #2 16125955
    conan02

    Poziom 30  
    TXC0 ustawia się w chwili opróżnienia rejestru nadawania, rejestr przesuwny transmisji jeszcze nadaje ostatnią ramkę. Jedyny sposób jak już masz czasówkę w programie to ustaw ją na czas transmisji danych + czas oczekiwania do przełączenia MAX485. Czyli na 10x czas bitu +1ms (jeśli używasz ramki z jednym bitem stopu), przy 2 będzie 11x czas bitu + 1ms, można to wyliczyć do zmiennej jednorazowo przy ustalaniu prędkości transmisji, lub dać na stałe w programie jeśli używasz tylko jednego bitratu.
  • REKLAMA
  • #3 16125990
    higlos
    Poziom 13  
    Dziękuję za odpowiedź. Prędkość jest stała i wynosi 32500 (transmisja jest odizolowana transoptorami stąd niska prędkość), a bitów 11 gdyż dochodzi parzystość. Dokładny czas jak najbardziej można wyliczyć (ok340uS) jednak sama czasówka jest mało elegancka :) Niestety raczej będzie musiała pozostać, a zmusza do kolejnego opóźnienia w układzie Slave który chciałby odpowiedzieć natychmiast jednak ta wiadomość mogłaby nie być odebrana przed brakiem przełączenia portu D.4


    Właściwie w ostateczności można wysłać nadmiarowo jeden bajt, aby właśnie po sprawdzeniu gotowości rejestru na przesłanie danych do TX wyzerować port D.4. Pozostanie pewna zmiana programu w układzie Slave aby on nie zwracał uwagi na kolejny bajt w ramce danych. Idąc dalej może jest możliwość wysłania wirtualnego bajtu w układzie Master tak aby on nie wyszedł z niego ?:)
  • Pomocny post
    #4 16126097
    conan02

    Poziom 30  
    Zobacz na tą notę aplikacyjną, tam są opisane metody zarządzania linią nadawania i odbioru.
    Link
    W sytuacji wykorzystywania przerwania pustego bufora i tak trzeba odliczyć czas do przełączenia. Specyfikacja standardu wymaga, żeby przełączenie nastąpiło w połowie czasu wysyłki jednego bitu po ostatnim bicie stopu.
    Z praktyki zauważyłem, że adresowane moduły "slave" w modbusie po RS485 i tak mają zaimplementowane opóźnienie odpowiedzi. Poza tym wykonanie komendy przez "slave" również zajmuje jakiś czas.
  • REKLAMA
  • #5 16126172
    jnk0le
    Poziom 18  
    Flagę TXC należy czyścić poprzez zapis logicznej '1', przed rozpoczęciem transmisji.
  • Pomocny post
    #6 16126276
    kamyczek
    Poziom 38  
    Zamiast robić tam opóźnienie można policzyć ile taktów zajmie uartowi wysłanie ostatniej ramki i robić sobie inne potrzebne operacje ,które zajmują czas a po odpowiedniej ich liczbie zmienić stan porty i tyle . Asembler daje wiele możliwości wykorzystania czegoś co się nazywa opóźnieniem . A jak masz wolny licznik to można na nim zrealizować opóźnienie i w przerwaniu od licznika zmienić stan portu nie przejmując się zupełnie niczym . Czekasz w pętli jak nie masz nic do roboty ale jak jest coś co się tam da wcisnąć to się wciska w to miejsce co się ma i tyle .
  • REKLAMA
  • #7 16127001
    higlos
    Poziom 13  
    kamyczek napisał:
    Zamiast robić tam opóźnienie można policzyć ile taktów zajmie uartowi wysłanie ostatniej ramki i robić sobie inne potrzebne operacje ,które zajmują czas a po odpowiedniej ich liczbie zmienić stan porty i tyle . Asembler daje wiele możliwości wykorzystania czegoś co się nazywa opóźnieniem . A jak masz wolny licznik to można na nim zrealizować opóźnienie i w przerwaniu od licznika zmienić stan portu nie przejmując się zupełnie niczym . Czekasz w pętli jak nie masz nic do roboty ale jak jest coś co się tam da wcisnąć to się wciska w to miejsce co się ma i tyle .


    Jak najbardziej Twoje sugestie są prawidłowe. Licznik niestety jest zajęty, a musiałbym z jego interwału 4ms mocno zejść w dół z czasem aby precyzyjne odmierzać czas (drugi PWM).

    Rozwiązałem to dodajac w układzie Master nic nie znaczace dla odbiornika Slave dodatkowe dwa bajty danych w ramce po których bezpiecznie resetuje port D.4. Działa świetnie z małą ilością kodu.

    Dziękuje za zainteresowanie
  • #8 16127083
    kamyczek
    Poziom 38  
    Faktem jest że niewiele osób zwraca na to uwagę i przy rs485 i podobnych rozwiązaniach w których należy sterować transmisją wklejają blok opóźnienia i często jego wielkość nie ma zupełnie nic wspólnego z wymaganym opóźnieniem . Wiele adapterów posiada układ zegarowy np. 555 ,który generuje opóźnienie jednak przeważnie jest to opóźnienie stałe realizowane pod najmniejszą prędkość transmisji jaką wspiera moduł czyli okropnie długie przy szybkich transmisjach .
REKLAMA