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



Teraz jest 17 lis 2024, o 11:48


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 30 sie 2012, o 10:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

Witam. Wiem że nie polecacie tego kursu ale ma tu kod do pomiaru temperatury co mi się przydać może :)
http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=8
A mój problem polega teraz że nie mogę zrozumieć co się dzieje w tej linii kodu gdzie jest zmienna "temp"
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W Funkcji sprint to wiem tylko tyle że %4.2f jest odpowiedzialny za wyświetlenie liczby zmienno-przecinkowe, a \x.. to jakiś znak lecz próbowałem dopasować z tablicy ASCII to mi nie pasowało coś. (po prostu wyświetlały się nie te symbole co chciałem)
a główny problem to zmienna temp
doszedłem do tego że do tabeli _pad[0] i _pad[1] przy temperaturze 29deg zapisywana jest wartość 209. Potem gdy jest operacja przesunięcia o 8 w lewo to jest 256 no i wychodzi ze _pad[1] + [0] = 465 podzielone przez 16 daje nam 29 ale to raczej tak nie działa. operacja jest wykonywana na bitach i nie rozumiem jak po przesunięciu o 8 wyjdzie taka wartość jak wyżej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2012, o 10:43 
Online
Moderator
Avatar użytkownika

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

W tej części kodu dzieje się TRAGEDIA - to znaczy autor kursu robi po prostu masakrę z mózgu początkującego ale nie tym że jest jakiś wzór, nie tym że pokazuje to jakieś tam obliczenia ....

ale tym, że stosuje do tego zmienne typu float - które pociągają za sobą strasznie DUŻE zużycie kodu w pamięci FLASH a co za tym idzie na małych prockach będziesz miał dopiero masakrę

a druga sprawa to pokazują pomiar temperatury RODEM z Bascoma - czyli

- start konwersji
- .... WAIT 750 ms ...... - zgroza !!!!
- odczyt temperatury

to drugi rodzaj robienia sieczki ludziom z mózgu ....

jednym słowem nie nazywaj w ogóle tego kursu - "kursem programowania" bo to nie jest kurs programowania niestety :(

to jest kurs jak w najprostszy i najgorszy z możliwych sposobów JAKOŚ TAM odczytać DS18B20 .... a już z DS1820 będziesz miał NOWY problem ...... SZOK !

gdy tymczasem w książce masz - kurs programowania - dzięki czemu nie lasujesz sobie mózgu a dodatkowo nie ma wyżej wymienionych wad itp

dlatego ja nawet nie zabieram się za tłumaczenie co tu jest i powiem więcej - proszę mi tu nie wklejać linków to tych pseudo kursów bo zaczyna mi się wydawać że bardziej chodzi o reklamę tego niż pytania ....

_________________
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: 30 sie 2012, o 10:58 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Jeżyk-1 napisał(a):
Witam. Wiem że nie polecacie tego kursu ale ma tu kod do pomiaru temperatury co mi się przydać może :)

Bardziej może Ci się przydać sposób jak to zrobić dobrze. ;)
Jeżeli masz książkę Mirka to zobacz jak jest zrobiony odczyt i obsługa DSa.
No a jak nie masz... to masz problem ;)

Powiedz mi tylko po co wyważać otwarte drzwi :?:

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2012, o 11:15 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

W termometrze DS18B20 masz 2 bajty, ale w pierwszym masz SSSSSxxx a w drugim xxxxyyyy, gdzie S to znak, xxxxxxx to całkowita wartość temperatury, a yyyy to ułamkowa wartość temperatury. Sprawdź w specyfikacji http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf . Po przesunięciu pierwszego bajtu masz SSSSSxxx00000000, po dodaniu drugiego wychodzi SSSSSxxxxxxxyyyy. Wykonywane jest dzielenie przez 16.0 (masz błąd w kodzie), wtedy otrzymujesz wynik z przecinkiem np. 29.0
Co do znaczka stopnia to spróbuj B0. Zgodność kodów wyświetlacza z kodami ASCII ogranicza się do przedziału 0x21 - 0x7D. Poza tym przedziałem może być różnie.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2012, o 11:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

To nie reklama Panie Mirku tylko próbowałem się dowiedzieć czegoś. Książkę planuję kupić dopiero na wpłatę a do tego czasu nie chciałem się nudzić :(
zastanawiało mnie głownie te przesunięcie bo jeżeli mam jeden Bajt czyli 8 bitów 11111111 i jak zrobię przesuniecie w prawo 0 8 to wydawało mi się ze to wszystko się wyzeruje a jednak nie i jakoś to działa :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2012, o 13:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

Zmienna temp była tu zdefiniowana jako double.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2012, o 14:57 
Online
Moderator
Avatar użytkownika

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

Jeżyk-1 napisał(a):
Zmienna temp była tu zdefiniowana jako double.


No to pewnie się zdziwisz a może i nie zdziwisz ale w języku C dla AVR używanie typu double charakterystyczne jest dla osób, które nie znają prawie w ogóle specyfiki języka C dla AVR. Zobacz podaję ci kolejny dowód na jakość tego kursu. Ale żeby nie było że tylko coś tam mówię to wyjaśniam.

otóż w AVR GCC jest tylko jeden uproszczony typ przeznaczony dla liczb zmiennoprzecinkowych

float

na komputerach PC można w standardowym języku C korzystać naturalnie z typu o zwiększonej precyzji czyli

double

ale w tak małych prockach jest to po prostu bez sensu - zatem pozostawiono wprawdzie typ double, ale tylko po to aby była zgodność ze standardem, gdy np skorzystasz z jakiegoś kodu z PC i żeby nie trzeba było dużo zmieniać.

Tyle że domyślnie typ double w AVR GCC zostaje niejawnie zastąpiony type float !

a zatem pisząc kod od nowa i używając typu double - widać od razu że coś ktoś jest na bakier, i nie tylko z tym, że akurat nie wiedział o tym co tu napisałem. Ale przede wszystkim dlatego że do TAK PROSTYCH rzeczy jak obsługa temperatury z DS18B20 w ogóle używa typów zmiennoprzecinkowych zamiast liczb całkowitych o czym pisałem wyżej.....

ale żebyś dobrze zrozumiał - używając liczb całkowitych nadal mamy możliwość pełnego przedstawienia na LCD czy gdziekolwiek temperatury w postaci liczby zmiennoprzecinkowej tyle że oszczędzając FLASH i czas wykonywanych operacji.

Wiem, pisałeś już że nosisz się z zamiarem zakupu książki z atnela, ale może wstrzymaj się z zaśmiecaniem sobie głowy informacjami z tego kursu.

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

Strefa czasowa: UTC + 1


Kto przegląda forum

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