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



Teraz jest 12 lut 2025, o 17:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 1 lut 2013, o 00:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

Witam

Przymierzam się do zakupu pewnego czujnika, ze względu na to że jest dosyć drogi chcę przed zakupem napisać do niego bibliotekę żeby potem nie okazało się że tego nie oprogramuję.

Zacząłem od rzeczy najprostszej czyli zmiennych i obliczeń na nich, niestety wynik końcowy nie zgadzał się z tym z noty katalogowej (wszystkie obliczenia razem z przykładowymi wartościami podane).
Znalazłem miejsce w którym wynik jest nie prawidłowy, oto kod:

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



błąd w obliczeniu jest tu: TEMP = 200 + dT*(C5+100)/2048;
po podstawieniu wartości wygląda to tak: TEMP = 200 + 587*(51+100)/2048; co powinno dać 243 a daje 211

(Wyniki wyświetlam na wyświetlaczu podpiętym do uC)

Rozbiłem to na mniejsze działanie żeby sprawdzić gdzie jest błąd
i jest on tu TEMP = dT*(C5+100); w wyniku powinno dać 88637
a daje coś ok 23000 (nie mogę sprawdzić dokładnie bo układ mam w pracy)

Nie wiem dlaczego tak się dzieje, zakres zmiennej TEMP jest wystarczający bo jest ona typu uint32_t
próbowałem też jawnego rzutowania
TEMP=(uint32_t) dT*(C5+100); \\ nie wiem czy to ma sens w tym przypadku
nie pomogło

Przy takim zapisie końpilator nie wywala błędów ani warningów
dopiero po napisaniu
TEMP = 587*151; wyświetla warning "integer overflow in expression"

dodam jeszcze że podejrzewałem że za ten błąd może być odpowiedzialna zła kolejność
bo jeśli najpierw (151) podzielić przez 2048 to wychodzi 0,07373046875 co na procku dało by 0
ale z tego co rozumiem z książki przy takim zapisie TEMP = 200 + dT*(C5+100)/2048; najpierw wykona się mnożenie.


uC to Atmega8

Proszę o pomoc, ja niczego nie wymyślę...

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 00:28 
Offline
Użytkownik

Dołączył(a): 12 paź 2012
Posty: 207
Lokalizacja: Rzeszów
Pomógł: 16

hej, strzelam że to promocja do int'a, zmienna dT powinna być większego typu bo 88tys nie mieści się w uint16 - a to ona jako największa w dzianiu wymusza liczbę rejestrów na których prowadzona jest operacja, ( 88637 -65535 =~23tys)
lub druga metoda
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a tu masz trochę na ten temat od Mirka: http://atnel.pl/domyslna-promocja-do-typu-int.html

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 00:40 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27358
Lokalizacja: Szczecin
Pomógł: 1042

bardzo dobra sugestia wyżej abyś przeczytał ten link, niestety niewiele osób go czyta bo wydaje im się jakimś tworem z kosmosu a tymczasem wpadają w takich (wydawać by się mogło) prostych obliczeniach :( ....

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 00:42 
Offline
Użytkownik

Dołączył(a): 12 paź 2012
Posty: 207
Lokalizacja: Rzeszów
Pomógł: 16

Promocja w mirkoprocku, phii ;)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 00:47 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Na początek na szybko proponuje również zmienić typ zmiennnych Cx z uint16_t na uint32_t bo jakoś jak patrze na te przesunięcia o 13 miejsc to mam dziwne uczucie, że część tej liczby zostaje obcięta.

P.s. Domyślam się, że chodzi ci o czujnik BMP085, do którego masz piękny kawałek kodu w C (w nocie katalogowej naturalnie :D) do obliczania ciśnienia, może nieoptymalny jak na 8-bit procki ale możesz zobaczyć czy w ogóle zadziała.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 14:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

Mirku czytam wszystko co piszesz ;)
i sprawdzałem czy to działa:
Cytuj:
TEMP=(uint32_t) dT*(C5+100); \\ nie wiem czy to ma sens w tym przypadku
nie pomogło


niestety w kod wkradł się babol i wynik się nie zgadzał.
Dopiero dzisiaj po przeczytaniu waszych postów i ponownym testowaniu zauważyłem babola.
Mianowicie zamiast C5 które jest równe 2002 ma być C6 które jest równe 51.

Teraz wynik jest poprawny :)
W kolejnych obliczeniach też musiałem użyć jawnego rzutowania i wszystko działa OK
A tu kod:


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

krafin napisał(a):
Na początek na szybko proponuje również zmienić typ zmiennnych Cx z uint16_t na uint32_t bo jakoś jak patrze na te przesunięcia o 13 miejsc to mam dziwne uczucie, że część tej liczby zostaje obcięta.

w tych czterech słowach 16 bitowych jest zawarte 6 wartości różnej wielkości od C1 do C5 są większe niż 8 bitów
więc są uint16_t i się mieszczą
wartość C6 jest 7 bitowa więc jest typu uint8_t
krafin napisał(a):
P.s. Domyślam się, że chodzi ci o czujnik BMP085, do którego masz piękny kawałek kodu w C (w nocie katalogowej naturalnie :D) do obliczania ciśnienia, może nieoptymalny jak na 8-bit procki ale możesz zobaczyć czy w ogóle zadziała.

Ten do którego piszę kod to MS5541C ale dzięki za podsunięcie nazwy, bo nie wiem czy MS5541C dostanę w Polsce.

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 14:59 

Pomógł: 0

Proszę bardzo gotowe kody

http://nrqm.ca/2013/01/avr-code-for-the ... re-sensor/



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 15:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

No i zepsułeś mi zabawę...

Ale mimo wszystko dziękuję ;)

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 15:26 

Pomógł: 0

No przecież, wcale nie musisz kopiować. Ale koncept masz i praktycznie biblioteki gotowe. Zawsze to łatwiej.

Zresztą sam jestem wyznawcą zasady "Po co wyważać otwarte drzwi". Teraz się możesz skupić na konkretnym zadaniu, a nie męczyć biblioteki ;).

Wójek Google to mój stary i dobry znajomy (znam go jeszcze jak był w pieluszce ;), nic przede mną nie ukrywa :).



Góra
  
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 3 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