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

AVR ASM - Komunikacja w dwie strony przez RS232 Atmega8

Szycha082 21 Lip 2014 11:08 2349 10
REKLAMA
  • #1 13813052
    Szycha082
    Poziom 11  
    Panowie mam problem jak w temacie z komunikacją w dwie strony.
    Moim założeniem było napisanie takiej komunikacji aby aby procesory nie zawieszały się w oczekiwaniu na odbierane dane oraz w sytuacji przerwy w trakcie transmisji.
    Jeden układ jest masterem i zawsze rozpoczyna transmisję.
    Co ciekawe program chodzi dobrze do momentu wykrycia błędu komunikacji. Po wykryciu błędu procesory dalej wymieniają między sobą pakiety ale nie są one przyjmowane jako prawidłowe.
    Pakiet składa się z 5 bajtów i sumy CRC.

    Co może być nie tak, lub proszę o gotowe rozwiązanie.

    Podany fragment kodu jest kodem układu slave gdzie pierw oczekuje na dane z mastera.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 13813345
    mi14chal
    Poziom 28  
    Ten kod wygląda okropnie, parę instrukcji w jednej linijce... Po za tym co tutaj mówić pokazałeś mały fragment kodu i tyle. Najlepiej zrób obsługę UART na przerwaniach, a najlepiej napisz to w C.
  • REKLAMA
  • #3 13813554
    Szycha082
    Poziom 11  
    Dlaczego wygląda okropnie? właśnie tak się robi gdy robimy krótka pętlę, po za tym to jest cały kod odbierający pakiet, kodu wysyłającego nie zamieszczałem gdyż jest bardzo prosty i działa poprawnie.
    Wiem, że najprostszym kodem odbioru jest kod podany niżej jednak jest on bardzo... "ułomny" nie odporny na przerwanie transmisji w trakcie odbioru.
    Jeżeli ktoś ma może prostszy ale skuteczny kod będę wdzięczny za pomoc.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 13813695
    excray
    Poziom 41  
    Jeśli nie chcesz zawieszać procesora to rób odbiór w przerwaniu i w formie bufora kołowego.

    Dodano po 47 [minuty]:

    Kolego na szybko napisałem Ci taki przykład obsługi takiego przerwania. Zakładam że znasz zasadę działania bufora kołowego bądź jesteś w stanie sobie doczytać w necie jego działanie.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Nie gwarantuję że w kodzie nie ma błędów bo kodu nie sprawdzałem - pisałem go tylko teoretycznie i pod Ciebie. Niemniej na 99% jest ok.
  • #5 13818437
    Szycha082
    Poziom 11  
    Przepraszam, że się nie odzywałem ale zająłem się na razie innym problemem.
    Mam tylko takie pytanie czy taki bufor kołowy to nie to samo co rejestr przesuwny?
    Rejestru kołowego jako takiego jeszcze nie stosowałem a rejestr przesuwny owszem i ciekawi mnie czy waszym zdaniem któryś jest lepszy. Bo moim zdaniem to są to takie same bufory wykonane w inny sposób.
  • REKLAMA
  • #6 13818569
    Konto nie istnieje
    Poziom 1  
  • #7 13818799
    Szycha082
    Poziom 11  
    Źle się wyraziłem, pisząc rejestr miałem na myśli bufor przesuwny gdzie bajt wejściowy umieszczany jest na na początku rejestru po wcześniejszym przesunięciu pozostałej zawartości bufora jeden bajt dalej.
  • REKLAMA
  • #8 13819725
    Konto nie istnieje
    Poziom 1  
  • #9 13823463
    Szycha082
    Poziom 11  
    Czy jest możliwe wykonanie komunikacji ciągłej w obie strony na przerwaniach? Z tego co rozumiem RX i TX działają niezależnie, tylko rejestr UDR jest wspólny dla obu operacji. Wydaje mi się że można tylko nie wiem jak to zorganizować.
  • #10 13824100
    Konto nie istnieje
    Poziom 1  
  • #11 13830795
    Szycha082
    Poziom 11  
    Zamieszczam kod programu do komunikacji ciągłej w dwie strony, może komuś cię przyda bo na elektrodzie takiego czegoś chyba nie ma.
    Działanie jego jest takie, że posiada dwa bufory FIFO dla danych odbieranych i wysyłanych.
    Każda wysyłana paczka danych zawiera bajt CRC i gdyby dane były wysyłane bezpośrednio z bufora danych to mogło by się tak zdarzyć że zanim została by wysłana cała paczka danych któryś z bajtów mógłby ulec zmianie w trakcie transmisji i suma CRC wyliczana na początku nie zgadzała by się.
    Fragment kodu RX można by też umieścić w przerwaniu odbiorczym bo odpowiada on za sprawdzenie paczki danych po odebraniu bajtu.

    Na koniec napiszę tylko tyle, że mimo iż powinien działać prawidłowo pojawiają się dziwne błędy, można by je porównać do falowania danych, wysyłając np $58 następnie $A2 przez moment odbierane są na przemian $58 i $A2.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jeszcze pytanie troszkę z innej beczki czy można programowo wymusić wejście w przerwanie chodzi mi o :.org 0x0D rjmp UTXC ; USART, Tx Complete
    bo jakoś flagi TXC nie mogę ustawić.
REKLAMA