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



Teraz jest 31 sty 2025, o 09:08


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: 1 lip 2012, o 18:08 
Offline
Użytkownik

Dołączył(a): 01 cze 2012
Posty: 72
Lokalizacja: Gdańsk
Pomógł: 2

Dzisiaj zacząłem przerabiać temat ADC. Po kolei, tak jak Mirek opisuje w książce, wpisywałem kody i sprawdzałem co się dzieje. W pewnych sytuacjach, na wyświetlaczu otrzymywałem wyniki, których się nie spodziewałem. W końcu udało mi się znaleść "słaby" punkt.

Pokaże o jaki fragment chodzi. Mirek tak napisał w ksiąźce:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zmienną "wynik" wyświetliłem na LCD. Zmienna ta przybiera wartości od 0 do 65535, czyli tylko wartości o długości dwóch bajtów! Przecież zmienna "wynik" jest o długości czterech bajtów. Po różncyh kombinacjach, doszedłem jak to "naprawić".
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

I teraz zwracam się z pytaniem, DLACZEGO? Czy chodzi o to, że ukontroler pobiera zmienną dwubajtową na stos, operuje na niej i wynik wpisuje, w tym przypadku, do zmiennej czterobajtowej?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2012, o 20:58 
Offline
Moderator
Avatar użytkownika

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

Ale rozwiązanie może być prostsze, w takich operacjach:

Kod:
wynik = pm * 1 * 2957;


jeśli wyrażenie po prawej stronie równania ma przekroczyć rozmiar dwóch bajtów to trzeba:

1. albo zrobić jawne rzutowanie na typ 4-bajtowy, np tak:

Kod:
wynik = (uint32_t)(pm * 1 * 2957);


2. albo stosując specyfikator UL

Kod:
wynik = pm * 1 * 2957UL;


który spowoduje automatyczne niejawne rzutowanie i promocję do typu 4-bajtowego dla wyniku

dlaczego tak się dzieje? Ano dlatego że domyślnie kompilator AVR GCC robi zawsze promocję do typu 2-bajtowego (uint16_t) .... i jeśli nie ma jawnego rzutowania to może być właśnie taki efekt o jakim piszesz.


Autor postu otrzymał pochwałę

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

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