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



Teraz jest 19 kwi 2024, o 14:07


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
 Tytuł: UART i TimeOut
PostNapisane: 22 sty 2019, o 06:42 
Offline
Użytkownik

Dołączył(a): 07 paź 2011
Posty: 77
Pomógł: 0

Cześć, mam kłopot z którym nie mogę sobie poradzić.
Próbowałem zrobić Timeout do obsługi odbieranych danych z UARTa.
Ustawiłem Timer0 na przepełnienie i przerwanie co około 1ms (nie jest ważna super precyzja).
Program wygląda tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Niestety cały czas wisi na odbieraniu w funkcji UART_receive, po prostu nie wychodzi z niej jak TimerProg będzie 0!

Możecie podpowiedzieć co jest nie tak, na razie nic mi nie przychodzi do głowy co jest nie tak



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2019, o 10:06 
Offline
Użytkownik

Dołączył(a): 22 kwi 2017
Posty: 99
Lokalizacja: Piła
Pomógł: 4

Wstaw debugger jednodiodowy lub po prostu wyświetl tą zmienną Timer prog na wyświetlaczu i zobaczysz czy Ci się inkrementuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2019, o 10:59 
Offline
Użytkownik

Dołączył(a): 07 paź 2011
Posty: 77
Pomógł: 0

To już sprawdziłem, liczy do zera.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2019, o 12:16 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Nie masz żadnych ostrzeżeń po kompilacji? Spróbuj włączyć może dodatkowe ostrzeżenia -Wextra i -pedantic.
Wygląda to tak, jakby kompilator nie traktował zmiennej TimerProg jako volatile i po prostu zoptymalizował sprawdzanie warunku if(!TimerProg) (przyjął, że warunek będzie zawsze niespełniony). Zmienną TimerProg masz zdefiniowaną w tym samym pliku źródłowym, co funkcję UART_receive()?

Mógłbyś ewentualnie ograniczyć kod do (kompilującego się) minimum, które pokazuje problem i przedstawić na forum. Błąd może być w kodzie, którego nie pokazałeś. To, co przedstawiłeś powinno działać, a przynajmniej ja nie potrafię dopatrzyć się tam błędu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2019, o 12:58 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Błąd błędem, ale staram się wymyślić skąd taka konstrukcja?
Nie było by lepiej powołać do życia jakąś zmienną i "napełnić" ją wartością rejestru UDR gdy przyjdzie przerwanie "jest nowy bajt"?
To taki najprostszy sposób.
Oczywiście później rozwija się to do postaci bufora cyklicznego ale na początek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
rozwiązuje Ci całą masę problemów.
Później obrabiasz tylko wartość zmiennej która jest "napełniana" w przerwaniu.

P/S Nazwa przerwania jest z procka który ma dwa uarty stąd ta nazwa. USART0

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sty 2019, o 13:30 
Offline
Użytkownik

Dołączył(a): 07 paź 2011
Posty: 77
Pomógł: 0

Dzięki za odpowiedz, ale w przypadku przerwania od UART jest taki problem (dla mnie) że mogę nie zapanować nad tym co przychodzi?
Całość ma działać tak, że jest zapytanie do układu i odpowiedź, a w chwili ewentualnego rozłączenia zareagować Timeoutem.


Jak popatrzę co jest wygenerowane w ASM przez kompilator to mam faktycznie zapętlenie bez sprawdzania warunku Skacze 5 adresów na dół i potem 5 do góry. Nie mam jak tego teraz pokazać, ale coś z optymalizacją chyba jest nie tak (mam ustawiona na -Os)
Zmienna jest volatile w piku tym co funkcja do UART, tylko LCD mam w innej.

Ale masz rację, zacznę od małych kroków, napiszę tylko samą funkcję do odbioru danych i zobaczę co się dzieje z nią i pokaże Wam jak to działa.



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: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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