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

[Bascom] Atmega64 RS485 - jak wykryć koniec transmisji UART?

matul 19 Kwi 2012 20:35 1674 3
REKLAMA
  • #1 10812726
    matul
    Poziom 11  
    Witam forumowiczów ...

    Piszę dość zaawansowany program na Atmege64, większość rzeczy wykonywane jest w przerwaniach programowych i jest wszystko OK. Komunikację zrobiłem na RS485 i działa dobrze (protokół MODBUS RTU) ale mam problem z wysłaniem danych:

    - jak wiadomo RS485 - więc na czas wysyłania muszę uruchomić nadajnik
    - wysyłam dane
    - po ostatnim znaku muszę przełączyć na odbieranie danych

    1. Przy instrukcji PRINTBIN nie można określić kiedy został wysłany ostatni znak i trzeba by wyliczyć czas nadawania np 5 znaków i po tym czasie wyłączyć nadajnik - rozwiązanie nie jest doskonałe ale działa (wstrzymuje program)

    2. Kolejne rozwiązanie:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i tu mam problem bo nie wiem jak to się dzieje, jak w pętli "For" wpiszę "1 to 5" to wysyła mi tylko 4 znaki od 1 do 4 z bufora Tx_buf(n) a jak "1 to 6" to 5 znaków - nie rozumiem jak to się dzieje, przy innym wykorzystaniu takiej samej pętli wszystko jest OK.

    3. Kolejne przemyślenie jest takie żeby nadawać znak w przerwaniu. Przerwanie trzeba by uwarunkować od przejścia rejestru usr1,5 z "0 - bufor zajęty" na "1 - bufor wolny". Nie wiem jak to skonfigurować, może ktoś już wykonał podobny program i podpowie jak to zrobić ???

    Pozdrawiam
  • REKLAMA
  • #2 10813233
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 10826054
    matul
    Poziom 11  
    Saabotaz napisał:
    Skorzystaj z przerwania USART TX COMPLETE.
    0) włączasz to przerwanie
    1) nadajesz 1 bajt
    2) czekasz w pętli która sprawdza stan jakiegoś bitu-flagi
    Bajt sie wysłał i wchodzi przerwanie tx complete. Ustaw w nim jakiś bit-flagę
    3) pętla wykryła zmianę bitu-flagi, wyjście z pętli oczekiwania i idziesz do pkt 1, i tak 5 razy
    4) wyłączasz przerwanie


    OK, napisałem program według zaleceń, działa prawidłowo i wszystko wykonuje się w trakcie przerwań. Dalej pozostaje problem pętli "For", żeby wysłać 5 znaków muszę pętlę wykonać 6 razy, może ktoś ma podobny problem ??

    Mam jeszcze jedno pytanie do forumowiczów, jest jeszcze opcja "multi-processor communication" która odfiltrowuje pakiety i tylko pakiet adresowany do odbiorcy trafia do bufora i wywołuje przerwanie (nie męczy programu niepotrzebnymi danymi), i tu mam pytanie czy ktoś już może zetknął się z tą opcją i wie jak ją uruchomić ??
  • #4 10827448
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA