Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterowanie przełaczaniem nadawania/odczyt w RS485

Marek_Gorecki 08 Lut 2016 23:14 1074 16
  • #1 08 Lut 2016 23:14
    Marek_Gorecki
    Poziom 16  

    Witam,
    mam taki problem.
    Mam łącze RS485 na 2 kablach.
    Wysyłam na RS485 string komendą printf.
    Danych mam do 10 do 100 bajtów.
    Nie mogę od razu w następnej linii przełączyć MAX485 na odbiór, bo dane jeszcze nie przejdą i urwę trnsmisję.
    Pytanie moje brzmi - jak najszybciej można to zrobić?
    Czy da się tak zrobić, aby jak tylko wyjdzie ostatni znak, to natychmiast przełaczyć się na odbiór.
    Teraz zrobiłem z naddatkiem, ale szkoda mi tych kilku ms na czekania na sztywno.

    0 16
  • Arrow Multisolution Day
  • Pomocny post
    #2 08 Lut 2016 23:47
    BlueDraco
    Specjalista - Mikrokontrolery

    Jaki mikrokontroler? Jeśli ma bit "TX complete", to nie ma problemu.

    0
  • #3 08 Lut 2016 23:51
    Marek_Gorecki
    Poziom 16  

    Używam ATMEGA2560

    Czyli ten bit zmieni wartość w chwili gdy funkcja printf wszystko wysle?

    0
  • Pomocny post
    #4 09 Lut 2016 06:12
    excray
    Poziom 39  

    Masz przecież w rejestrze UCSRxA bit TXCx który jest ustawiany po zakończeniu transmisji.

    0
  • Arrow Multisolution Day
  • #5 09 Lut 2016 08:29
    Marek_Gorecki
    Poziom 16  

    excray napisał:
    Masz przecież w rejestrze UCSRxA bit TXCx który jest ustawiany po zakończeniu transmisji.


    Wiem że taki jest, ale skoro wysyłam nie jeden bajt, lecz cały ciąg to skąd mam wiedzieć, czy ten bit nie będzie się ustawiał po każdym bajcie a nie na zakończeniu transmisji.
    Zastanawiam się, jak działa funkcja printf, czy uruchomienie następnego rozkazu, jest jednoznaczne z wykonaniem tej funkcji w całości, czy dane będą gdzieś w buforze czekać aż zostaną wysłane.
    Ale chyba nie mogą być w buforze , bo wtedy musiałby zawsze być włączone przerwania, a to nie jest wymagane przez ta funkcję.
    Wobec powyższego, printf musi wstrzymywać działanie programu na czas wysyłki, innej opcji nie ma.
    Czyli zaraz za printfem można przełaczyć się na odbiór.
    Czy się myle?

    0
  • #6 09 Lut 2016 09:10
    excray
    Poziom 39  

    Marek_Gorecki napisał:
    Wiem że taki jest, ale skoro wysyłam nie jeden bajt, lecz cały ciąg to skąd mam wiedzieć, czy ten bit nie będzie się ustawiał po każdym bajcie a nie na zakończeniu transmisji.

    A w jaki sposób wysyłasz cały ciąg przez interfejs którym można jednorazowo wysłać tylko jeden bajt? Zastanów się lepiej nad tym a sam sobie odpowiesz na swoje własne pytanie.

    Dodano po 8 [minuty]:

    EDIT> Zreszą funkcja do wysyłania znaków przez RSa jest na tyle prosta że już dawno na Twoim miejscu napisałbym własną która po aktywowaniu przełącza linię Di/Re, wysyła pakiet i po zakończonej transmisji wraca do nasłuchu. Całość oczywiście w oparciu o przerwania dzięki czemu nie będziesz wstrzymywać pracy uC.

    0
  • #7 10 Lut 2016 21:27
    Marek_Gorecki
    Poziom 16  

    excray napisał:
    Zastanów się lepiej nad tym a sam sobie odpowiesz na swoje własne pytanie.


    Gdybym wiedział to bym nie zadawał tego pytania na forum.
    Co mi z takiej podpowiedzi abym się lepiej zastanowił?

    Skoro przerwania mam wyłaczone, a funkcją printf wysyłam długi string to nie ma siły musi ten printf zajmowac pełny czas wysyłki.
    Przejście do następnej komendy jest jednoznaczne z wysyłka wszystkiego.
    Przecież nie ma jak zrobić bufora aby dane później spływały same.


    Ale jeśli się mylę to proszę o korektę, tylko błagam bez porady w stylu "jak się lepiej zastanowisz to sobie sam odpowiesz".

    pozdrawiam

    0
  • #8 10 Lut 2016 21:41
    tadzik85
    Poziom 38  

    Marek_Gorecki napisał:
    printf zajmowac pełny czas wysyłki.
    Nie musi.
    Marek_Gorecki napisał:
    Przejście do następnej komendy jest jednoznaczne z wysyłka wszystkiego.
    To zależy od implementacji.

    0
  • #9 10 Lut 2016 21:44
    Marek_Gorecki
    Poziom 16  

    nawet jak przerwania mam wyłączone?

    0
  • #10 10 Lut 2016 21:46
    tadzik85
    Poziom 38  

    Marek_Gorecki napisał:
    nawet jak przerwania mam wyłączone?

    Nawet.

    0
  • #11 10 Lut 2016 21:49
    Marek_Gorecki
    Poziom 16  

    Załóżmy że printf ma wysłać 10 znaków.
    Wysyła pierwszy i procesor przechodzi do następnej komendy.
    Po chwili bajt zostaje wysłany, bit w rejestrze UCSRxA bit TXCx się ustawia.
    W tym czasie program już poszedł daleko do przodu.
    Jak niby ma się nagle przerwać działanie tegoż programu aby wysłać kolejne znaki, skoro jak pisałem przerwania są zablokowane?

    0
  • #12 10 Lut 2016 21:51
    tadzik85
    Poziom 38  

    Marek_Gorecki napisał:
    Załóżmy że printf ma wysłać 10 znaków.
    Wysyła pierwszy i procesor przechodzi do następnej komendy.
    Po chwili bajt zostaje wysłany, bit w rejestrze UCSRxA bit TXCx się ustawia.
    W tym czasie program już poszedł daleko do przodu.
    Jak niby ma się nagle przerwać działanie tegoż programu aby wysłać kolejne znaki, skoro jak pisałem przerwania są zablokowane?


    Bo to zależy czy czekasz najpierw na pusty bufor czy później.

    Przed zmianą kierunku poczekać na flagę TC.

    0
  • #13 10 Lut 2016 21:59
    Marek_Gorecki
    Poziom 16  

    Chyba sie nie rozumiemy

    0
  • #14 10 Lut 2016 22:05
    excray
    Poziom 39  

    Tak jak napisał kolega @tadzik85. To że coś zostało przekazane do wysłania nie oznacza tego że zostało wysłane. Należałoby przyjrzeć się używanej przez Ciebie funkcji printf bądź napisać własną od nowa.

    0
  • #15 10 Lut 2016 22:09
    tadzik85
    Poziom 38  

    excray napisał:
    Należałoby przyjrzeć się używanej przez Ciebie funkcji printf bądź napisać własną od nowa.


    Wystarczyło by _write czy też odpowiednik dla avrów. Choć to i tak jest rozwiązanie kiepskie.

    Od przejścia na nasłuch służy flaga TC czy jej odpowiednik. Nie ważne czy w trybie przerwaniowym czy pollingu.

    0
  • #16 10 Lut 2016 22:12
    Marek_Gorecki
    Poziom 16  

    To może inaczej.
    Mam taki kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    gdzie rs485_odbior to zmiana stany pinu przełaczającego Max485 na odbiór.

    I teraz pytanie :
    Czy przejdzie cały string "ala ma kota" ?

    0
  • #17 10 Lut 2016 22:13
    tadzik85
    Poziom 38  

    Marek_Gorecki napisał:
    To może inaczej.
    Mam taki kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    gdzie rs485_odbior to zmiana stany pinu przełaczającego Max485 na odbiór.

    I teraz pytanie :
    Czy przejdzie cały string "ala ma kota" ?


    Odpowiedź znajduje się w 5 powyższych postach. Tu wróżek nie ma.

    0