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

[Atmega32][c] RS232/485 przerwania generowane przez TXCIE

Andrzej.Woo 19 Sty 2012 01:15 1457 4
REKLAMA
  • #1 10417349
    Andrzej.Woo
    Poziom 9  
    Pod koniec procedury obsługi przerwania SIG_UART_DATA po opróżnieniu bufora nadawczego chciałbym wywołać przerwanie SIG_UART_TRANS aby zmienić stan sygnału DE dla układu MAX485. W/g datasheet'u wystarczy ustawić bit TXCIE dla rejestru UCSRB aby spowodować wywołanie tego przerwania.
    Cytat:
    Writing this bit to one enables interrupt on the TXC Flag. A USART Transmit Complete Interrupt
    will be generated only if the TXCIE bit is written to one, the Global Interrupt Flag in SREG is written
    to one and the TXC bit in UCSRA is set.

    Pojawia się jednak taki problem, że chwilę wcześniej generowane jest przerwanie SIG_UART_RECV które w zasadzie nic nie robi, ale procedura jego obsługi zwiększa niepotrzebnie licznik bufora.

    Czy jest jakiś sposób, aby wywołać przerwanie kończące transmisję SIG_UART_TRANS (przełączenie się na odbiór) bez jednoczesnego wywołania przerwania SIG_UART_RECV?
  • REKLAMA
  • #2 10417362
    hotdog
    Poziom 26  
    Wnioskuje po poście, że kolega ma echo na RX (czyli to co wysyłamy odbieramy, czyli pin RE na stałe do masy).

    Jeżeli chcesz zignorować echo, to albo ten pin podłącz do DE (czyli DE i RE razem do pinu sterującego kierunkiem transmisji), albo wyłącz odbiornik na czas nadawania i włącz go w przerwaniu po zakończeniu transmisji (skasuj bit RXEN w UCSRB).
  • REKLAMA
  • #3 10417371
    Andrzej.Woo
    Poziom 9  
    Korzystam z prototypu EvB 4.3 i w/g schematu RE i DE są połączone i nimi właśnie próbuję sterować. To nie jest echo tylko wywołanie przerwania które pojawia się zawsze przy przełączeniu z nadawania na odbiór.

    Czy włączanie/wyłączanie (sterowanie RXEN/TXEN) modułów nie wywoła jakiś niepotrzebnych opóźnień? Używam transmisji 256 kb/s i boję się, żebym nie musiał zbyt długo czekać przy takiej transmisji.
  • REKLAMA
  • #4 10417377
    hotdog
    Poziom 26  
    po pierwsze przebrnij przez ten temat:
    https://www.elektroda.pl/rtvforum/topic1807209.html

    Pamiętaj że są 3 przerwania od USARTA i w przypadku poprawnie napisanego programu (zgodnie z best pratice) wszystkie 3 powinno się wykorzystać. Tak jest też najprościej, poniekąd :)

    To co piszesz jest raczej nie możliwe. Sprawdź jak działa Twoja płytka bez podłączonego niczego pod RS485. Jeżeli wtedy przerwanie RXC się nie wykonuje, szukał błędu po stronie innych układów.

    Prędkość może być tutaj problemem. Sprawdź czy na mniejszych boundach to działa inaczej. Standardowe trancivery chyba przy takich prędkościach mają prawo nie wyrabiać (ale mogę się mylić).

    Jaki znak w ogóle się Tobie odbiera?
  • #5 10417882
    Andrzej.Woo
    Poziom 9  
    Chyba się nie zrozumieliśmy więc wyjaśnię dokładnie. Transmisję sprawdzałem na wszystkich prędkościach włączając w to 300 bodów, a cały czas testuję na "standardowym" 9600. Ale do rzeczy...

    Do tablicy wpycham np. 100 znaków i wszystie przechodzą przez transmisję którą inicjuję ustawieniem bitu UDRIE w rejestrze UCSRB. Wtedy pojawia się przerwanie SIG_UART_DATA które nadaje wszystkie znaki z bufora. Kiedy procedura przerwania dochodzi do ostatniego znaku po jego nadaniu zeruję znacznik UDRIE i dodatkowo ustawiany jest TXCIE co powoduje wywołanie przerwania SIG_UART_TRANS po nadaniu ostatniego bitu stopu ostatniego znaku. W tym przerwaniu zmieniam stan wysoki DE/RE układu max 485 na stan niski.

    Jednak ustawienie znacznika TXCIE powoduje wcześniej (przed wywołaniem przerwania SIG_UART_TRANS) wywołanie przerwania SIG_UART_RECV w konsekwencji i odczytanie stanu z rejestru UDR i m.in. niepotrzebne zwiększenie licznika wewnętrznego bufora odczytu. Dopiero potem wywołuje się przerwanie SIG_UART_TRANS w którym zmieniam stan DE/RE na niski. Kolejność przerwań wynika z priorytetu RXC ma wyższy niż TXC.

    a teraz istotne fragmenty kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    hotdog napisał:
    To co piszesz jest raczej nie możliwe. Sprawdź jak działa Twoja płytka bez podłączonego niczego pod RS485. Jeżeli wtedy przerwanie RXC się nie wykonuje, szukał błędu po stronie innych układów.

    Jeśli nie mam nic podłączone do portu to nie dostaję przerwania. To samo jeśli podłączę odwrotnie D-/D+ portu RS485, ale wtedy dostaję śmieci. Do komunikacji z komputerem używam przejściówki UNITEK Y-1081 która oparta jest na FTDI.

    Układ elektryczny jest taki jak w tym PDF'ie.
    Cytat:
    Prędkość może być tutaj problemem. Sprawdź czy na mniejszych boundach to działa inaczej. Standardowe trancivery chyba przy takich prędkościach mają prawo nie wyrabiać (ale mogę się mylić).

    Prędkość nie ma znaczenia. Trzymam się na razie 9600, ale testowałem też na innych i jest to samo.

    Cytat:
    Jaki znak w ogóle się Tobie odbiera?

    Odebrany bajt to: 0x00

    Po czasie widzę, że faktycznie jest to jakiś rodzaj echa, bo korzystając np. z WIZ108SR czyli RS485-Ethernet nie mam takich problemów z echem. Boję się tylko, że jest to typowy nierozwiązywalny problem.
REKLAMA