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



Teraz jest 19 lut 2025, o 14:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 20 sie 2016, o 19:05 
Offline
Nowy

Dołączył(a): 20 sie 2016
Posty: 19
Pomógł: 0

Witam!
Mam pozornie prosty problem z programem napisanym w C dla mikrokontrolera Atmega8A. Buduję robota z możliwością kontroli silników i pomiarem odległości (ultradźwięk) sterowanym z bluetooth (RS232). Całość jest na płytce stykowej i póki co zasilana z programatora. Program jest prosty, ale od czasu do czasu zupełnie się zwiesza i zaczyna działać dopiero po resecie (najczęściej problemy pojawiają się przy przesyle kilku wiadomości jedna zaraz po drugiej). Według mnie kod w C jest poprawny, ale może coś pomijam dlatego prosiłbym kogoś bardziej doświadczonego o pomoc.

Poniżej zamieszczam mój kod źródłowy:
Cytuj:
#ifndef F_CPU
#define F_CPU 8000000UL
#endif

// TEGO NIGDY NIE ROBI SIĘ W KODZIE programu, a szczególnie na tym forum nie prezentujemy nawet takich kodów, w związku z tym, że jest to kompletny nonsens - proszę uprzejmie na przyszłość o tym pamiętać - dobrze ? mirekk36



Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2016, o 20:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1033
Lokalizacja: Trójmiasto
Pomógł: 190

Proponuje dodać jedno diodowy debuger w newralgiczne punkty (np pętla gdzie program czeka na echo z czujnika) - być może w tych pętlach program staje...
Jeśli nie wiesz co to jedno diodowy debuger tu masz w poradniku P. Mirka
https://www.youtube.com/watch?v=yVFf22JxuEs



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2016, o 22:01 
Offline
Nowy

Dołączył(a): 20 sie 2016
Posty: 19
Pomógł: 0

Debugowanie zrobiłem jako wysyłanie przez bluetooth wartości związanej z buforem cyklicznym (indeks). Dzieje się to po ruchu silnika (case n i case b w instrukcji switch). I problemy pojawiają mi się także w przypadku tych instrukcji. Po prostu po którejś odebranej literze przestaje zupełnie reagować (coś jakby gubił się w kodzie i zaczyna działać dopiero po resecie). Np. gdy wyślę mu wielokrotnie literę n to po którejś z nich kompletnie się zawiesza. Nie jest to jednak regularny błąd bo zazwyczaj działa poprawnie.

Zacząłem się zastanawiać czy problem nie leży np. po stronie zasilania, ale mam je odfiltrowane kondensatorami 47uF, 22uF (elektrolityczne) i 3x100nF (ceramiczne).

I przepraszam za tą definicję F_CPU, myślałem że jeśli cały program jest w obrębie jednego pliku to jest to ewentualnie dozwolone, ale rozumiem do czego może to prowadzić przy bardziej rozbudowanych projektach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2016, o 09:20 
Offline
Użytkownik

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

Ja tu widzę dwa problemy:
  1. Instrukcja switch nie zawiera opcji default. W związku z tym, w przypadku odebrania znaku innego niż przewidywany zestaw (n,b,r,l,m) na skutek np. pomyłki po stronie nadajnika lub przekłamania w transmisji, zmienna ogon nie będzie inkrementowana i pętla while(1) będzie się kręcić w kółko, nie robiąc nic sensownego (czyli program "zawiśnie", przynajmniej do czasu, kiedy procedura obsługi przerwania "nadpisze" ten element tablicy).
  2. Nigdzie nie sprawdzasz, czy w tablicy bufor masz jeszcze jakieś dane do przetworzenia. Innymi słowami niezależnie od tego, czy jakieś dane zostały odebrane, czy też nie, pętla główna będzie w kółko odczytywać dane z bufora i je interpretować. Jeszcze prościej - ogon nie może wyprzedzić głowy :).

Spróbowałbym zrobić mniej więcej tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2016, o 11:31 
Offline
Nowy

Dołączył(a): 20 sie 2016
Posty: 19
Pomógł: 0

Dzięki za pomoc, już poprawiłem :) Default przeoczyłem, bo zapomniałem o błędach transmisji (uznałem że wysyłam mu poprawnie to nie ma co nie działać...).
Wcześniej nawet na to nie zwróciłem uwagi, bo wszystko mi się wieszało w losowych momentach. Przyczyną były problemy z zasilaniem, po tym jak dałem osobne do silnika wszystko śmiga. Nie spodziewałem się że jeden mały silnik może aż tak szarpać napięcie ...



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO