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

Przerwanie od wysłanego znaku przez RS232 - jaki jest tego sens?

Marek_Gorecki 15 Wrz 2011 18:52 2034 9
REKLAMA
  • #1 9930423
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    WItam;

    chciałbym zrobić sterownik który będzie pełnił funkcję konwertera prędkości UARTU.
    Na wejściu otrzymuję ramki GPS 9600, a na wyjściu chcę wysłać to samo tylko w nieco innym standardzie (eleminacja niepotrzebnych danych.

    Zrobiłem w przerwaniu RXC odbiór ramki. Działa super.
    Robię konwersję. I chcę to wysłać znów przez RS232.
    Całość mam w Stringu Bufor.
    Chciałbym wysyłać wykorzystując przerwanie TXC. Ale nie w ząb nie rozumiem jak do tego podejść.
    Jaka jest logika tego przerwania?
    Jak go stosować?

    Bardzo proszę o pomoc.
  • REKLAMA
  • #3 9930487
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    Nie wiedziałem że to zależy od rodzaju procesora.
    Robię to na ATMEGA88

    Może uzupełnię - czy da się jednocześnie nadawać i odbierać korzystając z obu przerwań (TXC i RXC)?
  • REKLAMA
  • Pomocny post
    #4 9930523
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Marek_Gorecki napisał:
    Nie wiedziałem że to zależy od rodzaju procesora.


    Przecież nie napisałeś tej wiadomości w dziale AVR tylko mikrokontrolery ogólne to skąd można wiedzieć czy chodzi ci w ogóle o AVR czy np ARM czy PIC - bo pomiędzy nimi może być różnie ;)

    Marek_Gorecki napisał:

    Robię to na ATMEGA88


    teraz jasne

    Marek_Gorecki napisał:
    Może uzupełnię - czy da się jednocześnie nadawać i odbierać korzystając z obu przerwań (TXC i RXC)?


    W AVR'ach masz aż dwa przerwania służące do nadawania TXC oraz UDRE

    każde działa troszkę inaczej. Jedno z nich np TXC można fajnie wykorzystać do sterowania przepływem gdy robisz sobie RS485 natomiast UDRE do nadawania. Ale też nic nie stoi na przeszkodzie aby TXC użyć do nadawania.

    Każde z tych dwóch przerwań zachodzi w różnym momencie. TXC - gdy bufor zostanie wysłany a UDRE gdy bufor jest pusty

    poczytaj - popatrz w przykładach w necie jak to się robi - albo może jakąś książkę gdzie masz to dobrze wyjaśnione ?? (zobacz na banerek na dole mojej wypowiedzi - tam na pewno znajdziesz wszystko opisane od A do Z)
  • REKLAMA
  • #5 9930716
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Jeśli pytasz o sens stosowania przerwania informującego o nadaniu znaku to zależy on od ciebie. W szczególności nikt nie każe ci go wykorzystywać, a z tego co piszesz wynika, że można się bez niego obejść skoro odbiór masz nieblokujący zrobiony na przerwaniach odbiornika. Oczywiście w ATMega można jednocześnie nadawać i odbierać - te dwa podsystemy są od siebie prawie niezależne. Prawie - bo baudrate w obu przypadkach jest taki sam, więc jeśli jednocześnie chcesz np. odbierać 9600 bps, a nadawać z inną prędkością to tak się nie da. Ale w "half-dupleksie" oczywiście możesz. Jeśli z jakiegoś powodu jest to niezbędne to możesz wykorzystać dwa UARTy, co pewnie i tak ma większy sens, ze względu, że zapewne jednak do tego GPSa coś trzeba czasami wysłać.
    Przerwanie nadajnika można wykorzystać do tego samego celu co przerwanie odbiornika - aby w sposób nieblokujący zrealizować wysyłanie paczki danych - czyli powiedzmy, że twój wynikowy string to jedna transakcja - inicjujesz nadawanie pierwszego znaku, a kolejne nadają się "same" w przerwaniu nadajnika. Lecz jak pisałem w twoim przypadku nic nie stoi na przeszkodzie, aby o tym przerwaniu zapomnieć i nadawanie zorganizować jako blokujące - na odbiór to nie wpłynie bo masz go ładnie zrealizowany w przerwaniu. No może IMHO troche elegancja ucierpi :)
  • REKLAMA
  • #6 9930764
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    Dzięki za odpowiedzi. Właśnie uczę się programowania procesorów i chciałbym trochę sobie utrudnić i trochę na siłę wykorzystać oba przerwania aby je poznać.

    Mam prośbę abyście ewentualnie poprawili mój tok myślenia ( na razie bez kodu bo nie wiem jak się za to zabrać).

    Otóż mam tablicę String[] ="ALA MA KOTA"
    Teraz chcę go wysłać wykorzystując przerwanie TXC.
    I właśnie mam problem jak zacząć to robić.
    Jeśli to wstrzykiwanie danych do UDRa będzie się odbywać w procedurze przerwania TXC to jak mam w tą procedurę wejść?
    Czy mam wysłać pierwszy znak a resztę dodać do procedury obsługi przerwania?

    Nie wiem czy dobrze tłumaczę, ale może zrozumiecie mnie.
  • Pomocny post
    #7 9930951
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    No raczej właśnie tak jak piszesz - pierwszy znak nadać "ręcznie" a kolejne nadadzą się same dzięki przerwaniu. Innej sensownej możliwości nie widzę.
    Z drugiej strony, żeby takie nieblokujące nadawanie w pełni wykorzystać potrzebujesz bufor z którego znaki będą nadawane. Wtedy możesz wykorzystać jedną funkcję, np. Send("Ala ma kota"), która skopiuje string do tego bufora i rozpocznie nadawanie, po czym natychmiast wróci. Ponowne wywołanie tej funkcji zanim nadawanie poprzedniego łańcucha się nie zakończy ma wpisać tylko nawy łańcuch do bufora (czyli serializacja danych), dzięki temu zostanie on nadany po pierwszym. Masz wtedy w pełni nieblokujące nadawanie, dodatkowo jeśli funkcja Send będzie reentrant, to możesz wysyłać stringi z przerwań, czy innych dziwnych miejsc programu bez obawy, że uszkodzi to nadawanie wcześniejszych stringów - coś w rodzaju transakcyjności. IMHO to ciekawe ćwiczenie.
  • #8 9931442
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    Dziękuję kolego za odpowiedź - popróbuję i jak coś wyniknie to dam znać.
    Pozdrawiam
  • #9 9931851
    arturt134
    Poziom 27  
    Posty: 792
    Pomógł: 76
    Ocena: 24
    W następnej kolejności wykorzystaj też przerwanie UDRE do wysłania danych, a przerwanie TXC do zakończenia transmisji.
    W ten sposób poznasz różnice między tymi dwoma przerwaniami; przyda Ci się to gdy kiedyś będziesz chciał transmitować dane przez RS485, do sterowania przepływem.
    Generalnie, jak raz napiszesz porządny sterownik, to później będziesz z niego korzystał w innych projektach.
  • #10 10559554
    esnow
    Poziom 14  
    Posty: 138
    Ocena: 3
    witam,
    czy mógłby ktoś podać dwa fragmenty kodu jak wysyłać stringa używając przerwania od TXC i UDRE ?

    z góry dziękuję.

Podsumowanie tematu

✨ Użytkownik planuje stworzyć sterownik konwertujący prędkość UART, który odbiera ramki GPS z prędkością 9600 bps i wysyła je w zmodyfikowanej formie przez RS232. Zastosował przerwanie RXC do odbioru danych, ale ma trudności z implementacją przerwania TXC do nadawania. Dyskusja dotyczy możliwości jednoczesnego nadawania i odbierania danych na mikrokontrolerze ATMEGA88 oraz logiki działania przerwań TXC i UDRE. Uczestnicy sugerują, aby rozpocząć nadawanie pierwszego znaku ręcznie, a kolejne znaki wysyłać w procedurze przerwania. Wskazują również na korzyści z używania obu przerwań do nieblokującego nadawania oraz na różnice między nimi. Użytkownik prosi o przykłady kodu do implementacji.
Wygenerowane przez model językowy.
REKLAMA