Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 sty 2026, o 23:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 15 gru 2016, o 18:26 
Offline
Użytkownik

Dołączył(a): 18 lip 2014
Posty: 69
Pomógł: 0

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 gru 2016, o 20:47 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

Bez kodu nic nie poradzimy. Nie napisałeś nawet jaki to mikrokontroler. Wniosek, że rejestr UDR jest wspólny jest błędny. To są dwa oddzielne rejestry, jedynie dostępne pod tym samym adresem. Wszystko ładnie masz rozrysowane i opisane w nocie katalogowej. PWM sprzętowy, czy programowy? Ile kanałów? Jaka częstotliwość?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2016, o 09:09 
Offline
Użytkownik

Dołączył(a): 05 lut 2014
Posty: 252
Lokalizacja: obok Częstochowy
Pomógł: 14

A gdybyś to zsynchronizował? Przerwanie RX odbiera tego PWMa, odczytuje i teraz właśnie ustawia flagę zezwalającą na wysyłkę, czy po prostu wrzuca dane do bufora nadawczego bez Timera1.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2016, o 13:45 
Offline
Użytkownik

Dołączył(a): 18 lip 2014
Posty: 69
Pomógł: 0

Problem rozwiązany, okazało się, że często występował błąd OverRun danych przychodzących. Zmieniłem nieco program i działa jak należy. Temat do zamknięcia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO