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

USART ATMEGA8L- 5 bajtowa ramka

marnowak 08 Sty 2012 17:31 1075 5
  • #1 10368096
    marnowak
    Poziom 15  
    Witam!
    Mam prośbę o pomoc w poprawieniu kodu.
    Otóż mam zadeklarowane globalnie następujące zmienne:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W programie głównym mam 2 funkcje w pętli while.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Funkcja ComRdFrame wygląda następująco:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Natomiast przerwanie od odbioru:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W założeniu funkcja ComRdFrame ma zanalizować ramkę danych jeśli w buforze znajdzie się 5 znaków.
    W rzeczywistości jest tak, że warunek if(x==5) jest wykonywany często kilkukrotnie tak jakby procesor nie widział, że zmienna uległa zmianie(po wejściu w warunek zeruję x). Dokładnie chodzi o to, że po odebraniu ramki na którą ATMEGA ma odpowiedzieć ramka z odpowiedzią odsyłana jest nie raz, a dwa, trzy lub cztery(ComWrt). Czytałem o optymailizacji. Ustawiłem nawet poziom optymalizacji w pliku Make na 0. Nie rozumiem takiego zachowania procesora. Na ASM się nie znam, więc raczej nie sprawdzę czy kompilator faktycznie traktuje x jako volatile. Czemu x się nie chce wyzerować w warunku w ComRdFrame?
    Jak mam sprawdzić, czy w buforze znajduje się faktycznie 5 znaków i jak go zerować jeśli tak? Moja ramka nie ma znaków początku i końca transmisji, więc interesuje mnie jedynie wykonywanie poleceń w programie w przypadku, gdy x=5, przy czym oczywiście dla jednego odebranego polecenia ma wykonać się raz, a nie kilka razy jak to obserwuję.
  • #2 10369481
    Szumlus
    Poziom 17  
    Witam,

    Proponuje koledze postąpić troszkę inaczej.
    Rozbudować ramkę danych dodając znak startu i znak stopu.
    Odbieramy znaki i pakujemy je do bufora w przerwaniu a w programie głównym sprawdzamy czy odebraliśmy bajt start i stop oraz czy liczba bajtów w buforze jest
    prawidłowa.
    Kiedyś napisałem coś takiego z tym ze miałem o tyle łatwiej że bajty start i stop były unikatowe.
    Ewentualnie można by spróbować wyłączyć odbiornik UART po odebraniu kompletnej ramki i włączyć dopiero po zdekodowaniu.

    Pozdrawiam,
    Marcin
  • #3 10370207
    marnowak
    Poziom 15  
    No właśnie. Tylko, że już napisałem aplikację pod Windows, a goni mnie termin. Brak czasu na poprawki ramki- musiałbym cały program pod Windows przerabiać.
    Po prostu ta zmienna ma jakieś problemy po za funkcją przerwania. Tak jakby po za przerwaniem nie szło jej wyzerować.Spróbuję wyłączyć odbiornik na czas dekodowania ramki.
  • #4 10370771
    Konto nie istnieje
    Konto nie istnieje  
  • #5 10371125
    marnowak
    Poziom 15  
    To nie to. x zeruję przecież. Akurat tu się nigdy nie myli program i zawsze mi działa po podłączeniu. Doprogramowałem resztę funkcji i takie rzeczy dzieją się w innych przypadkach. Po za tym nawet resetuję urządzenie nie wchodząc w warunek z rekurencją i tak się dzieje.
  • #6 11401408
    marnowak
    Poziom 15  
    Pokombinowałem trochę w tym przerwaniu. Nie jest idealnie, ale jakoś działa. Po za tym wprowadziłem zerowanie bufora w przypadku, gdy nie dojdzie 5 znaków w określonym czasie. Licznik startuje w momencie odebrania pierwszego znaku.
REKLAMA