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



Teraz jest 25 kwi 2024, o 22:18


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 18 mar 2018, o 11:09 
Offline
Nowy

Dołączył(a): 19 lut 2015
Posty: 5
Pomógł: 0

Witam wszystkich.
Na początek powiem, że nie jestem jeszcze zbyt biegły w programowaniu, dlatego proszę o wyrozumiałość czytając mój kod. Prawdopodobnie dałoby się go napisać znacznie prościej używając innych funkcji i zmiennych, ale ciągle się jeszcze uczę.
Mój problem polega na tym, że kod programu nie działa do końca tak jak trzeba.
Program ma za zadanie odczyt ciągu danych przesłanych poprzez BT z telefonu i w zależności od wartości sterowanie prędkością i kierunkiem 2-ch silników M1 i M2. Te silniki napędzają czołg na gąsienicach. W telefonie mam zainstalowany program "BlueTooth Electronics". Można w nim w bardzo łatwy sposób tworzyć własne programy, które w zależności od użytych elementów wysyłają poprzez bluetooth dane do przejściówki BTM222 dalej przez RS232 do Atmegi. W moim przypadku jest to Atmega32. W moim programie wykorzystuję żyroskop w telefonie do sterowania silnikami.
Przykłądowo mój program wysyła ciąg danych np. "k12.35k". Oznacza to, że telefon test pochylony do tyłu o 12,35 stopnia. litery "k" są znacznikiem początku i końca wysyłanych danych z żyroskopu. Może być też ciąg danych "k-7.32k". Oznacza to, że telefon jest pochylony do przodu o 7,32 stopnia.
Odczyt stopni i sterowanie prędkością silników działa ok. Przy wychyleniu telefonu do tyłu też jest ok. Problem pojawia się gdy pochylam telefon do przodu i ciąg danych jest ze znakiem "-". Wówczas co jakiś czas pojawiają się błędy. Silniki kręcą się do przodu i za chwile do tyłu. Nie potrafię zlokalizować błędu. Próbowałem pisać programy już na różne sposoby, ale efekt jest ten sam.Poniżej kod programu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oraz funkcja dokonująca zamiany znaków ascii na liczby. Wiem że dałoby się to pewnie zrobić za pomocą funkcji ITOA, ale nie wychodziło mi to, więc napisałem swoją funkcję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Funkcja uart_getc(); z książki Pana Mirka i bufor o rozmiarze 64. Przy buforze w rozmiarze 32 efekt pracy programu jest ten sam. Poniżej jeszcze zrzuty z ekranu telefonu podczas pochylania telefonu. W lewym okienku są dane wysyłane przez mój program na telefon.
s-oznacza stop silników
t-oznacza jazdę do tyłu
p-oznacza jazdę do przodu
W prawym okienku są dane wysyłane przez telefon do atmegi.
ObrazekObrazekObrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 mar 2018, o 19:30 
Offline
Nowy

Dołączył(a): 19 lut 2015
Posty: 5
Pomógł: 0

Nikt mi nie pomoże? A może ktoś ma koncepcję, szkielet takiego programu do analizy ciągu danych takich jakie pisałem...tzn. np. "k12.35k" ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 03:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 cze 2012
Posty: 414
Lokalizacja: Oborniki
Pomógł: 5

Podpowiedź na szybko,

Żeby zamienić jedną cyfrę z ASCII na liczbę, wystarczy zrobić tak:

char znak = '5';
if(znak >= '0' && znak<='9')
int cyfra = znak - '0';

I tak jedną funkcja zamienisz każdą cyfrę ASCII na inta

Popraw kod to znacznie to ułatwi analizę już na początek:)


Wysłane z mojego Redmi Note 4 przy użyciu Tapatalka

_________________
Pozdrawiam:
Mikołaj



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 03:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 cze 2012
Posty: 414
Lokalizacja: Oborniki
Pomógł: 5

Do tego zamiast robić jakieś podchody z "cy2" itp zrób po prostu tak:

char znak;
uint8_t liczba = 0;
while(1){
znak = uart_getch():
if(znak >= '0' && znak <= '9')
{
liczba *=10;
liczba += znak - '0';
}
else
break;
}
while(znak != 'k')
{
znak = getch();
}


Przy okazji lepiej zmień znak startowy na inny niż końcowy, jest to pewniejsze rozwiązanie

Wysłane z mojego Redmi Note 4 przy użyciu Tapatalka

_________________
Pozdrawiam:
Mikołaj



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 18 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