|
Dobry wieczór,
W ramach ćwiczeń stworzyłem sobie aplikację na telefon, która ma komunikować się z mikrokontrolerem przez bluetooth (czyli UART po stronie atmegi).
W programie na AVR odbieram komunikaty z telefonu w przerwaniu ISR( USART_RXC_vect ). Dane przychodzą co ok. 300ms. Wysyłanie informacji z mikrokontrolera odbywa się w przerwaniu od Timera1. Dane są wysyłane co ok. 15ms.
Jeśli chodzi o przesyłane informacje, to z telefonu steruję PWM-em (w moim przypadku jasnością LEDa), a z mikrokontrolera przesyłam odczyty z przetwornika ADC.
Zauważyłem, że moja dioda LED, której PWM ustalam z telefonu (co 300ms przychodzi informacja o aktualnym ustawieniu PWM) co chwilę gaśnie i znów zapala się. To gaśnięcie diody występuje czasem w odstępach 1 sekundy, czasem 2s, czasem 5s - ogólnie jest to bardzo chaotyczne. Próbując rozwiązać problem na chwilę wyłączyłem wysyłanie danych z mikrokontrolera. Komunikacja odbywała się więc tylko od telefonu do AVRa. Okazało się, że problem migającej diody zniknął! Dioda normalnie świeciła się z taką jasnością jaką zadawałem.
Próbowałem rozwiązać problem na różne sposoby, zmieniałem kolejność różnych procedur, dodawałem nowe warunki, ale to nic nie zmieniło. Jedyne na co wpadłem to, że przyczyną może być dzielenie rejestru UDR pomiędzy TX i RX - może tu jest problem? Wydaje mi się, że może być tak, że np. mikrokontroler otrzyma jakąś wiadomość, ale zanim zdąży ją odczytać, odpali się przerwanie czasowe, które wysyła coś do telefonu i wtedy rejestr UDR jest zapeniany innymi danymi. Czy mogę mieć rację? Jak rozwiązać ten problem? Próbowałem już stosować różne flagi, ale to nic nie dawało, pewnie źle to robiłem.
Myślę, że nie ma sensu, abym wstawiał tu swój program, gdyż jest dosyć długi, a nie chcę zaśmiecać forum blokami tekstu. Wydaje mi się, że w miarę dobrze opisałem jak działa mój algorytm - przerwanie czasowe wysyła, a przerwanie od RX analizuje wiadomość i ustawia PWM.
|