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

[ATmega162] [ATmega162][ASM] - Dwukierunkowa transmisja UART nie działa poprawnie

symfonia 07 Wrz 2013 13:01 1977 10
  • #1 12710334
    symfonia
    Poziom 10  
    Witam,

    Realizuje transmisję dwukierunkową pomiędzy komputerem a urządzeniem radiowym poprzez mikroprocesor z dwoma UARTami. Założenie jest takie, aby po wysłaniu z komputera danych konfiguracyjnych do modułu radiowego, odpowiedział on potwierdzeniem że konfiguracja przebiegłą pomyślnie. Dane z komputera przesyłam normalnie bez przerwań badając tylko stan bufora UDR1. Po wykryciu ze moduł radiowy coś odsyła następuje przerwanie (od RXC0) i nastepuje przesłanie z niego do komputera danych. Komunikacja komputer <-> procesora jest zrealizowana na UART1 a procesor <-> nadajnik na UART0. Niestety cos mi nie działa i nie wiem gdzie tkwi błąd. Załączam fragment kodu odpowiedzialny za transmisje:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Bedę wdzięczny za wszystkie sugestie.
  • #2 12710382
    ZbeeGin
    Poziom 39  
    symfonia napisał:
    Niestety cos mi nie działa i nie wiem gdzie tkwi błąd.

    Może bardziej konkretnie jaki aspekt tego nie działa.

    Największy Twój błąd to umieszczenie rozkazu SBIS, a po nim NOP, a dopiero potem RJMP. Przecież taki kod pętli nie ma prawa działać poprawnie.
  • #3 12710403
    symfonia
    Poziom 10  
    Znaczy te NOPY dodałem później jak już i tak mi nie działało w nadziei, że może poprzez ciągłe skoki nie może wejść w przerwanie. Bez NOP też nie działa. Konkretnie nie działa to, że jak wyśle dane konfiguracyjne do modułu to powinien on odpowiedzieć znakami "ok". Na kompie nic mi się jednak takiego nie wyświetla. Dodam że prędkość transmisji jest ustawiona taka sama 9600 bodów.
  • #4 12710483
    Konto nie istnieje
    Poziom 1  
  • #5 12710502
    excray
    Poziom 41  
    Marek_Skalski napisał:
    Uwaga czysto techniczna. Zamiast r16 i r17, używaj r24 i r25. Dzięki temu masz możliwość wykonania kilku operacji 16-bitowych w 1 cyklu zegara (adiw, sbiw), co często bywa przydatne.
    Jeśli wykonuje operacje 8-mio bitowe to po co ma angażować rejestry >=r24?
  • #6 12710613
    symfonia
    Poziom 10  
    1. Tak, wiem, NOPy wstawiłem pochopnie, już się z tego wytłumaczyłem ;)
    2. Niestety ze względów formalnych nie mogę pokazać całego programu, nie ma to jednak żadnego znaczenia w tym przypadku, bo pokazałem fragment kodu od początku, program po wejściu w pętlę konfiguracja jak widzicie z niej już nie wychodzi ( z wyjątkiem obsługi przerwania) Nie ma więc możliwości aby pozostały kod za pętlą wpływał na jej działanie.Komunikacja PC-uC działa.
    4. Tak, wykorzystuje maxa i jest podłączony dobrze.
  • #7 12710649
    Konto nie istnieje
    Poziom 1  
  • #8 12710675
    symfonia
    Poziom 10  
    No ale właśnie potwierdzenie wysyłam w przerwaniu:

    Przerwanie:
    in r17,UDR0 //odbior z modułu
    oczekiwanie4:
    sbis UCSR1A,UDRE1
    rjmp oczekiwanie4
    out UDR1,r17 //wysłanie do kompa
    reti
    Po wykonaniu tego fragmentu wejdzie znów do petli KONFIGURACJA po czym znów wejdzie w kolejne przerwanie jeśli nadejdzie więcej niż jeden znak od transceivera a ja nie będe nic wysyłał z komputera. Pętla jest zamknięta, to wiem, jednak taki miałem zamiar, najpierw skonfigurowac moduł a potem zrobić to tak żeby wychodził z tej pętli i przechodził do dalszej części programu. Na razie celowo z niej nie wychodzę.
  • #9 12710679
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #10 12710755
    Konto nie istnieje
    Poziom 1  
  • #11 12710951
    symfonia
    Poziom 10  
    No tak, myślałem że czarna magia się dzieje a ja skakałem od razu do przerwania. Chyba bym tego nie zauważył sam. Po zmianie wszystko ładnie działa. Dzięki wielkie!
REKLAMA