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



Teraz jest 23 mar 2026, o 18:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 3 lip 2014, o 22:42 
Offline
Nowy

Dołączył(a): 29 sty 2014
Posty: 8
Pomógł: 0

Witam,
Mam problem, próbuje dojść co może być przyczyną i niestety już nie daję rady... Spróbuję go opisać: mam zaprogramowane 2 czujniki ultradźwiękowe na atmega 32. Zczytują one odległość od punktu(w kodzie są to wartości y i z). p jest połową obwodu trójkąta, x-wartość stała. W momencie kiedy wyświetlam osobno wartości na wyswietlaczu: p-y, p-z uzyskuję dobre wartości(dodatnie). Problem pojawia się gdy chcę dokonać iloczynu liczb:
r=p*(p-x)*(p-y)*(p-z);
Wychodzą wyniki nieprawdziwe, ujemne co jest głęboką nieprawdą. Czy miałby ktoś jakieś pomysły na to jak rozwiązać ten problem? Kod poniżej:


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



Ostatnio edytowano 4 lip 2014, o 17:52 przez Jacentyg1990, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lip 2014, o 22:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2013
Posty: 119
Lokalizacja: Cinisi
Pomógł: 12

wpisz kod w syntax c . :) trochę lepiej to wygląda i lepiej się go analizuje ;)

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





ps. chodź niewiele sie znam na tym ale pierwsze co to sprawdziłbym czy wynik jest w stanie się zmieścić w zmiennej "r" typu uint32_t
bo jeżeli jeszcze zmienna "p" jest mnożona a ona też jest typu uint32_t i to przez zmienne typu uint16_t to wynik może nie zmieścić się w zmiennej "r". Taka moja sugestia

_________________
sig off :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lip 2014, o 23:17 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

Zobacz jakie masz typy zmiennych p,r są typami uint32_t a powiedz mi jaką największa liczbę można podać na lcd_int(p); lcd_int(r); ?? Hmm dodaj operatory rzutowania przy wyliczaniu tych skomplikowanych wzorów. Zainteresuj się UL http://atnel.pl/domyslna-promocja-do-typu-int.html

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2014, o 06:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

Panowie a kod się wam kompiluje?

Przecie tu są 2x ;;

volatile uint16_t time1 = 0, time2 = 0, i = 0;;

Powinien być błąd kompilacji.

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2014, o 09:19 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

W jakimś moim przykładowym programie dałem po 2 średniki i nic. Zero błędów nawet jak dałem ich po 5 w odstępach. W asm są one wyznacznikami komentarza więc w C może jest podobnie. Ale być może przez nie program może nie zadziałać właściwie.

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2014, o 15:07 
Offline
Nowy

Dołączył(a): 29 sty 2014
Posty: 8
Pomógł: 0

Z moich obserwacji wynika, że wyświetlacz wyświetla tylko pierwsze 16 bitów pełnej 32-bitowej liczby. Istnieje możliwość uzyskania pełnej 32 bitowej liczby na LCD?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2014, o 16:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Jeśli używasz funkcji lcd_int() z Bluebooka to funkcja ta poprawnie wyświetla liczby o wartości od −32 768 do +32 767, czyli liczby 16-bitowe ze znakiem int16_t.

Jeśli chcesz wyświetlać liczby 32-bitowe to musisz albo lekko zmodyfikować funkcję lcd_int() albo napisać nową np. lcd_long(). Wystarczy, że w funkcji lcd_int() zmienisz itoa na:
ltoa dla liczb z zakresu −2 147 483 648 — +2 147 483 647 czyli int32_t
ultoa dla liczb z zakresu 0 — +4 294 967 295 czyli uint32_t.

Jeszcze należało by zmienić typ przekazywanego argumentu z int na uint32_t albo int32_t.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2014, o 17:31 
Offline
Nowy

Dołączył(a): 29 sty 2014
Posty: 8
Pomógł: 0

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

Jeśli tak to proszę o pomoc w jej modyfikacji bo nie wiem gdzie te zakresy należy pozmieniać. z Góry dziękuję za pomoc.
Jeszcze mam jedno pytanie:
mam za zadanie pomnożyć liczbę 100 przez sqrt(6). Wynik który wyświetlam to 200. Czy jest możliwe, żebym wyświetlał wynik 244 na wyświetlaczu lcd?
Używałem typu float i niestety nic to nie dało...



Ostatnio edytowano 4 lip 2014, o 17:51 przez Jacentyg1990, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2014, o 18:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Tak chodzi o tą funkcję. A chodziło mi o taką modyfikację
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2014, o 20:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

mokrowski napisał(a):
Jak jeszcze raz umieścisz kod bez syntax C, to zrobię laleczkę vodoo z twoim inicjałem i będę kłuł szpilkami ;-/


dobre dobre tego jeszcze nie było

sorry za offtop ale nie mogłem się powstrzymać :) bym mógł postawił bym flaszkę :)

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2014, o 22:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 paź 2011
Posty: 780
Pomógł: 20

Cześć
Czy przypadkiem nierobisz ultradźwiękowe go skanera 3D ?
Oczywiście jeśli możesz powiedzieć bo wygląda to mi na wyciąganie współrzędnych i lądowaniem do STL-a ?

Pozdrawiam

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lip 2014, o 23:05 
Offline
Nowy

Dołączył(a): 29 sty 2014
Posty: 8
Pomógł: 0

Dziękuję wszystkim za pomoc, zgodnie z podpowiedzią kolegi jacekk232 udało mi się wszystko wykonać i hula :)



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

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO