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

RFM12B+ATtinny2313+Odbiornik zawiesza się oczekując danych

Drutłajer 02 Maj 2012 00:38 1110 1
  • #1 10851546
    Drutłajer
    Poziom 10  
    Witam,

    Mój drugi post na elektrodzie więc bądźcie wyrozumiali. Postanowiłem zrobić nadawanie i odbieranie danych przy pomocy przerwań (pin NIRQ). Moduły działają w prostej maszynie stanów, są 3 stany:
    -TRANSMIT: Inicjalizacja układów wewnętrznych w celu nadawania, transmisja danych
    -RECEIVE: Inicjalizacja układów wewnętrznych w celu odbierania, Odbieranie danych
    -IDLE: Wyłączenie wszystkich układów wewnętrznych
    Domyślnym stanem jest IDLE.

    Dane do wysłania pakowane są do bufora nadawczego i bajt po bajcie wysyłane w świat aż do napotkania znaku końca ramki. Sytuacja w przypadku odbiornika wygląda podobnie, odbieramy bajty aż dostaniemy bajt końca ramki.

    Do wysyłania i odbierania stworzyłem dwie funkcje w których umieściłem pętle while na początku, aby zawsze czekały na zakończenie odbierania, bądź nadawania poprzedniej ramki.
    W przypadku funkcji nadającej wszystko działa dobrze, dane wysyłane są bez problemu, natomiast w przypadku funkcji odbierającej program zawiesza się po odebraniu pierwszej ramki w drugim wywołaniu funkcji odbierajacej(dokładnie w pętli while). Czasem odbierze kilka ramek i się zawiesza, być może jest to kwestai czasowa, lecz wprowadzanie opóźnień nie pomaga.

    Procedura obsługi przerwania:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Funkcję modułowe:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Z góry dziękuję za pomoc
  • #2 10874156
    Drutłajer
    Poziom 10  
    Problem rozwiązany, chodziło o optymalizację kodu przez kompilator, a dokładnie o nieaktualizowanie flagi ucRfm12FreeFlag w pętli while, po zdefiniowaniu flagi jako volatile program działa poprawnie.
REKLAMA