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



Teraz jest 25 lip 2026, o 12:09


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 2 cze 2016, o 22:07 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Witam.
Próbuję napisac program który oblicza czas pomiędzy zboczami. Mój problem polega na tym ze na ekranie noki3310 wartość icr jest z poza jej zakresu czyli np:1213001, naprowadzicie koledzy gdzie popełniłem błąd ?
Pozdrawiam.
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: 2 cze 2016, o 22:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

witam,
problem chyba w linijce 43:
itoa ....utoa.. gdzieś było o wyświetlaniu wartości poza zakresem.
itoa wyświetla chyba int, a tu potrzebne jest uint.

http://forum.atnel.pl/topic11931.html?hilit=wy%C5%9Bwietlanie%20ltoa

------------------------ [ Dodano po: 25 minutach ]

w tym przypadku to nawet ltoa, -- 32 bity.
oraz zmienna uint32_t, skoro ma mieć wartość, " 1213001 "



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2016, o 16:19 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Zmiana na utoa nic nie pomogła. Wartość ICR o ile dobrze pamiętam powinna być maksymalna 65535 a u mnie są za wysokie wyniki ;( Chcę zrobić licznik prędkości.



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

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

zerknij, pomyślałem- dopisałem po 25 min.:
"ltoa". 32bity oraz (uint32_t lub int32_t :)
pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2016, o 19:27 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Witam.
Obliczyłem czas jednego obrotu lecz wyniki są bardzo chwiejne i potrafią osiągać wyniki ujemne (zmienna czas_jednego_obrotu). atmemga32 taktowanie 8 MHz.
Obroty do testów odczytuje z wiatraka który zasilany jest cały czas napięciem 5v:
Obrazek

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: 15 cze 2016, o 21:37 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Koledzy siedzę nad tym kilka wieczorów i nie mam pomysłu jak rozwiązać ten problem ;(



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

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

Nie mam czasu, żeby dokładnie analizować Twój kod, ale proponuję, żebyś przede wszystkim opanował typy zmiennych całkowitych (jaka jest różnica pomiędzy zmiennymi ze znakiem i bez, jaki jest zakres poszczególnych typów 8-, 16-, 32-bitowych), bo moim zdaniem to z ich nieznajomości wynikają Twoje problemy. Ja wiem, każdy chciałby jak najszybciej opanować sztukę programowania, ale tu nie ma drogi na skróty. Trzeba trochę czasu na poznanie teorii poświęcić.

Jak już wspomniałem nie analizowałem całego kodu, więc podam tylko przykład:
henryxxl napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jak już używasz stałych wykraczających poza zakres int (w avr-libc ten typ ma 16 bit), to powinieneś używać przyrostków L lub UL (czyli np. 10000000UL). Tutaj jednak to nie rozwiąże problemu.
Większym problemem jest tutaj zakres zmiennych. Jak myślisz, jaki będzie wynik działania
'10000000*czas_cyklu'
gdzie 'czas cyklu' jest krotnością liczby 65536? Nawet przy zmiennej 'przepelnienia' równej 1 wynik będzie wynosił 655360000000, czyli ponad 655*10^9, gdzie zakres zmiennej 32-bitowej ze znakiem jest tylko trochę większy od 2*10^9. Nawet jeśli końcowy wynik (po podzieleniu przez 8000000) będzie się mieścił w zmiennej 32-bitowej, to i tak najpierw musi być wykonana operacja mnożenia.
A wystarczyłoby zrobić np tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po co komplikować proste rzeczy?

Tak jak napisałem, nie analizowałem całości, więc tego typu błędów może być więcej (np. zmienne 'czas_cyklu' czy też 'czas_jednego_obrotu', być może i inne, powinny być typu unsigned, bo to zwiększy ich zakres, a przecież czas raczej wartości ujemnych nie przyjmuje). Poświęć trochę czasu na opanowanie typów zmiennych (głownie typów całkowitych), przemyśl swoje obliczenia i popraw błędy. Jak sam włożysz w to więcej wysiłku, to pewnie inni też chętniej pomogą.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 cze 2016, o 18:24 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Witam.
Dziękuję za odpowiedź. Nie mam pomysłu jak zrobić dzielenie po przecinku bez używania double.
oto fragment kodu i przykładowe obliczenia. Chcę obliczyć prędkość na podstawie czasu pełnego obrotu koła (jak licznik rowerowy). Według mojego myślenia powinienem czas cyklu podzielić przez taktowanie procesora aby obliczyć czas obrotu w sekundach później obliczyć ilość obrotów na sekundę i tak dalej aż uzyskam prędkość w km/h. Proszę o wskazówkę jak poradzić sobie z takimi liczbami i odpowiedź czy dobrze myślę lub wskazać jakiś lepszy pomysł.
Pozdrawiam i dziękuję za odpowiedzi.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Edit
Zrobiłem rzutowanie zmiennej czas_jednego_obrotu i jak narazie idę do przodu. Działam dalej ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 cze 2016, o 21:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

hmm.
obliczyć prędkość w km/h.
to może zacząć nie od czasu jednego obrotu, tylko od ilości obrotów na czas?
np: timer w odstępach czasu liczy ile obrotów uzyskano.
dla 1000/min- da 16,666.. obr/sek.
sprawdzając ilość co sekundę, będzie wynik 16 - 17, średnia z 2-3 odczytów da precyzyjniejszy wynik chwilowy aktualizowany co 2-3 sek.?
jeżeli obroty są mniejsze, można odpowiednio zagęścić -( np, magnesy na szprychach-), tak żeby impulsy były 4, 5, 6, 10 razy częściej, i uwzględnić to w obliczeniach.
a przebytą trasę można zliczać, sumując obroty, i mnożąc przez obwód. ?
może jakoś tak.?



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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