<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=5&amp;t=17145&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-12-27T18:47:30+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=5&amp;t=17145&amp;mode</id>
<entry>
<author><name><![CDATA[kremir]]></name></author>
<updated>2016-12-27T18:47:30+01:00</updated>
<published>2016-12-27T18:47:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178341#p178341</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178341#p178341"/>
<title type="html"><![CDATA[Re: Yellowbook - BMP180 - little endian vs big endian]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178341#p178341"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />W pierwszym przypadku założyłem, że do elementów tablicy już zostały przypisane wartości bajtów w odpowiedniej kolejności<br /></div><br />ale oczywiście tak nie było. Wyjściem do rozważań był kod z ksiązki.<br />Własnie w kodzie z książki jest najpierw przyklad z odczytem danych do tablicy która jest zawarta w unii złożonej z tej zmiennej tablicowej (22 elementów 8-bitowych)  i 11 liczb 16-bitowych a później już inny przykład z bezpośrednim przypisaniem odczytanych dwóch bajtów do zmiennej 16 bitowej.<br />W pierwszym przypadku, jako że jest to unia to żeby poprawnie liczba 16 bitowa była zinterpretowana następuje zamiana bajtów tak że układają się w kolejności LSB i MSB. I po to ta unia została jak mniemam zastosowana aby łatwo to było zrobić na większej liczbie danych.<br />W drugim przypadku zapisana liczba 16 bitowa ma zapisane bajty w kolejności MSB LSB bez zamiany. <br /><br />Twoje wyjaśnienia jak najbardziej mnie przekonują. Sam zresztą napisałeś:<br />[syntax]union ui16 {<br />    uint8_t bajt&#91;2&#93;;<br />    uint16_t wartosc;<br />} zmienna;<br /> <br />    //tutaj musisz dbać o kolejność bajtów<br />    zmienna.bajt&#91;0&#93; = temp&#91;1&#93;;<br />    zmienna.bajt&#91;1&#93; = temp&#91;0&#93;;<br />   // jednak tu przypisujesz po prostu wartość 16-bitową<br />    zmienna.wartosc = temp&#91;0&#93; &lt;&lt; 8 | temp&#91;1&#93;;[/syntax]<br />W unii muszę dbać o kolejność bajtów i dlatego zamieniam ją a przypisując bezpośrednio do zmiennej już nie. Zmyłką było dla mnie zdanie w książce, że przy przypisywaniu bezpośrednio do zmiennej 16-bitowej też <br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />szybko zamieniamy bajty miejscami<br /></div><br /><br />Jeszcze raz dzięki za poświęcony czas<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=861">kremir</a> — 27 gru 2016, o 18:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-12-27T10:21:19+01:00</updated>
<published>2016-12-27T10:21:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178300#p178300</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178300#p178300"/>
<title type="html"><![CDATA[Re: Yellowbook - BMP180 - little endian vs big endian]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178300#p178300"><![CDATA[
<div class="quotetitle">kremir napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent">[syntax=c]zmienna.wartosc = zmienna.bajt&#91;1&#93;&lt;&lt;8 | zmienna.bajt&#91;0&#93;;<br />zmienna.wartosc =         temp&#91;0&#93;&lt;&lt;8 |         temp&#91;1&#93;;[/syntax]<br /></div><br />Przypadek pierwszy:<br />zmienna.bajt[0] zawiera MSB odczytanego int'a, zmienna.bajt[1] zawiera LSB. Po zamianie zmienna.wartosc jest zapisana w kolejności LSB MSB, czyli tu jest zamiana.<br /><br />W drugim przypadku:<br />temp[0] też zawiera MSB odczytanego int'a a temp[1] też zawiera LSB i zapisuję to w zmienna.wartosc jako zwykły int MSB LSB.</div><br />Nie, nie. W pierwszym przypadku założyłem, że do elementów tablicy już zostały przypisane wartości bajtów w odpowiedniej kolejności, czyli:[syntax=c]//<br />    // najpierw przypisanie (tutaj następuje odwrócenie)<br />    zmienna.bajt&#91;0&#93; = temp&#91;1&#93;; // LSB<br />    zmienna.bajt&#91;1&#93; = temp&#91;0&#93;; // MSB<br />    // czyli 'zmienna.bajt&#91;0&#93;' zawiera LSB<br />    // a     'zmienna.bajt&#91;1&#93;' zawiera MSB<br />    // i wtedy dopiero otrzymujemy zależność<br />    zmienna.wartosc = zmienna.bajt&#91;1&#93;&lt;&lt;8 | zmienna.bajt&#91;0&#93;;<br />    // aby uzyskać wartość elementu unii 'zmienna.wartosc' bezpośrednio<br />    // należy zamienić bajty tablicy 'temp' podczas przypisania<br />    zmienna.wartosc =         temp&#91;0&#93;&lt;&lt;8 |         temp&#91;1&#93;;[/syntax]<br />Jeszcze inaczej, bez użycia unii:<br />[syntax=c]// deklarujemy zmienną 16-bitową<br />uint16_t ui16_var;<br />// odbieramy dane z czujnika w kolejności 'little endian'<br />// czyli temp&#91;0&#93; zawiera LSB<br />//       temp&#91;1&#93; zawiera MSB<br />// przypisujemy wartość do zmiennej 16-bitowej<br />ui16_var = temp&#91;1&#93;&lt;&lt;8 | temp&#91;0&#93;;<br /><br />// odbieramy dane z czujnika w kolejności 'big endian'<br />// czyli temp&#91;0&#93; zawiera MSB<br />//       temp&#91;1&#93; zawiera LSB<br />// przypisujemy wartość do zmiennej 16-bitowej<br />// w odwróconej kolejności<br />ui16_var = temp&#91;0&#93;&lt;&lt;8 | temp&#91;1&#93;;<br /><br />// porównując<br />ui16_var = temp&#91;1&#93;&lt;&lt;8 | temp&#91;0&#93;; // 'temp' zawiera dane odebrane w 'little endian'<br />ui16_var = temp&#91;0&#93;&lt;&lt;8 | temp&#91;1&#93;; // 'temp' zawiera dane odebrane w 'big endian'<br /><br />// reasumując wartość zmiennej 16-bitowej zawsze będzie równa<br />ui16_var = MSB&lt;&lt;8 | LSB;<br />// a pod MSB i LSB należy podstawić odpowiednie elementy tablicy,<br />// w zależności od tego, w jakiej kolejności bajty zostały odebrane[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 27 gru 2016, o 10:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kremir]]></name></author>
<updated>2016-12-26T22:09:39+01:00</updated>
<published>2016-12-26T22:09:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178288#p178288</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178288#p178288"/>
<title type="html"><![CDATA[Re: Yellowbook - BMP180 - little endian vs big endian]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178288#p178288"><![CDATA[
Nadal nie widzę  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> bo jeśli jedna z operacji to zamiana bajtów to druga już nie.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />// zauważ taką zależność<br />zmienna.wartosc = zmienna.bajt[1]&lt;&lt;8 | zmienna.bajt[0];<br />zmienna.wartosc =         temp[0]&lt;&lt;8 |         temp[1];<br /></div><br /><br />Przypadek pierwszy:<br />zmienna.bajt[0] zawiera MSB odczytanego int'a, zmienna.bajt[1] zawiera LSB. Po zamianie zmienna.wartosc jest zapisana w kolejności LSB MSB, czyli tu jest zamiana.<br /><br />W drugim przypadku:<br />temp[0] też zawiera MSB odczytanego int'a a temp[1] też zawiera LSB i zapisuję to w zmienna.wartosc jako zwykły int MSB LSB.<br />Upieram się więc, że w drugim przypadku zamiany nie ma <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ale może to jest kwestia nazewnictwa? W każdym razie proces jest dla mnie jasny i za to dziękuję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=861">kremir</a> — 26 gru 2016, o 22:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-12-26T21:38:25+01:00</updated>
<published>2016-12-26T21:38:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178287#p178287</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178287#p178287"/>
<title type="html"><![CDATA[Re: Yellowbook - BMP180 - little endian vs big endian]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178287#p178287"><![CDATA[
<div class="quotetitle">kremir napisał(a):</div><div class="quotecontent"><br />zmienna = (temp[0]&lt;&lt;8 | temp[1]);<br /><br />A tu nie ma zamiany bajtów miejscami tak jak to miało miejsce w przykładzie z unią.<br /></div><br />Jest, tylko tego nie widzisz.<br />[syntax=c]union ui16 {<br />    uint8_t bajt&#91;2&#93;;<br />    uint16_t wartosc;<br />} zmienna;<br /><br />// zauważ taką zależność<br />zmienna.wartosc = zmienna.bajt&#91;1&#93;&lt;&lt;8 | zmienna.bajt&#91;0&#93;;<br />zmienna.wartosc =         temp&#91;0&#93;&lt;&lt;8 |         temp&#91;1&#93;;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 26 gru 2016, o 21:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kremir]]></name></author>
<updated>2016-12-26T21:24:57+01:00</updated>
<published>2016-12-26T21:24:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178286#p178286</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178286#p178286"/>
<title type="html"><![CDATA[Re: Yellowbook - BMP180 - little endian vs big endian]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178286#p178286"><![CDATA[
Dzięki za odpowiedź. Twoje wyjaśnienie do mnie trafia, ale ... Ten przykład z unią (podobną unię zastosował Mirek w książce i potem zamieniał bajty miejscami) jest dla mnie zrozumiały. Ale potem już nie, dlatego że Mirek w dalszej części rozdziału, w opisie funkcji odczytu temperatury napisał <div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Pamiętajmy jednak że tutaj także najpierw odczytywany jest starszy bajt słowa, a więc w ostatniej linijce szybko zamieniamy bajty miejscami...<br /></div> <br />a ostatnia linijka wygląda tak (biorąc za przykład tablicę temp a nie nazwy zmiennych z książki):<br /><br /><span style="color: #4000BF">zmienna = (temp[0]&lt;&lt;8 | temp[1]);<br /></span><br />A tu nie ma zamiany bajtów miejscami tak jak to miało miejsce w przykładzie z unią.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=861">kremir</a> — 26 gru 2016, o 21:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-12-26T20:38:12+01:00</updated>
<published>2016-12-26T20:38:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178285#p178285</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178285#p178285"/>
<title type="html"><![CDATA[Re: Yellowbook - BMP180 - little endian vs big endian]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178285#p178285"><![CDATA[
<div class="quotetitle">kremir napisał(a):</div><div class="quotecontent"><br />Gdzie popełniam błąd w rozumowaniu?<br /></div><br />Traktujesz zmienną 16-bitową jako tablicę bajtów.<br /><br />Przecież kiedy zadeklarujesz zmienną 16-bitową, to nie przypisujesz do niej bajtów w kolejności odpowiedniej do endianness, tylko wartość, czyli bajt MSB przesunięty o 8 bitów w lewo OR bajt LSB, lub inaczej MSB*256+LSB. Kiedy przypiszesz wartość do zmiennej, to już dalej kompilator dba o poprawną kolejność bajtów w pamięci, Ty nie musisz się o to martwić.<br /><br />Twój tok rozumowania byłby poprawny np. w przypadku unii tablicy bajtów i zmiennej 16-bitowej:<br />[syntax=c]union ui16 {<br />    uint8_t bajt&#91;2&#93;;<br />    uint16_t wartosc;<br />} zmienna;<br /><br />    // tutaj musisz dbać o kolejność bajtów<br />    zmienna.bajt&#91;0&#93; = temp&#91;1&#93;;<br />    zmienna.bajt&#91;1&#93; = temp&#91;0&#93;;<br />    // jednak tu przypisujesz po prostu wartość 16-bitową<br />    zmienna.wartosc = temp&#91;0&#93; &lt;&lt; 8 | temp&#91;1&#93;;<br />    // lub<br />    zmienna.wartosc = temp&#91;0&#93; * 256 + temp&#91;1&#93;;<br />    // zawartość unii będzie taka sama niezależnie od sposobu[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 26 gru 2016, o 20:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kremir]]></name></author>
<updated>2016-12-26T19:00:09+01:00</updated>
<published>2016-12-26T19:00:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178282#p178282</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178282#p178282"/>
<title type="html"><![CDATA[Yellowbook - BMP180 - little endian vs big endian]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17145&amp;p=178282#p178282"><![CDATA[
Witam,<br /><br />Zapoznaję się aktualnie z treścią świeżo otrzymanej nowej książki - yellowbook'a. Zacząłem od początku i muszę przyznać że różne interesujące smaczki programistyczne szybko się pojawiły. Dotarłem do obsługi czujnika ciśnienia i temperatury BMP180. Oczywiście pobrałem sobie notę katalogową by samemu przyjrzeć się jak ten czujnik obsłużyć. No i podczas analizy pojawiła się pewna wątpliwość przy funkcjach pobierających temperaturę i ciśnienie. Pokażę na czym polega wątpliwość bez wpisywania kodu.<br />Liczby 16 bitowe przekazywane są z czujnika w kolejności MSB i LSB czyli oczywiste jest że trzeba je skonwertować do little endian. Na początku obsługi czujnika pobierane są parametry kompensacyjne do tablicy np. uint8_t bmp[22]. Mamy więc po kolei:<br /><span style="color: #4000BF">bmp[0] &lt;- MSB parametru1<br />bmp[1] &lt;- LSB parametru1 itd dla kolejnych parametrów</span><br />czyli proces konwersji 1-szego parametru na little endian wygląda tak że do bmp[1] przypisujemy wartość z bmp[0] a do bmp[0] przypisujemy wartość z bmp[1]. Czyli po konwersji mam<br /><span style="color: #4000BF">bmp[0]=LSB parametru 1<br />bmp[1]=MSB parametru 1</span><br />I to jest zrozumiałe.<br /><br />Teraz pojawia się funkcja do odczytu temperatury. I znów mamy tablicę nazwijmy ją uint8_t temp[2] do której odczytywane są poszczególne bajty z fubckji odczytu TWI. Czyli wydaje się że te bajty będą wczytywane do bufora również w kolejności jak wyżej:<br /><span style="color: #4000BF">temp[0] &lt;- MSB temperatury<br />temp[1] &lt;- LSB temperatury</span><br />W związku z tym konwersja do little endian powinna wg mnie wyglądać tak że przesuwamy LSB &quot;w lewo&quot; a MSB zostawiamy:<br /><span style="color: #4000BF">temp[1]&lt;&lt;8 | temp[0]</span> i wtedy mamy znów układ bajtów LSB MSB począwszy od nizszego adresu.<br />W książce jest jednak inaczej, czyli tak jakby w temp[0] był LSB a w temp[1] MSB:<br /><span style="color: #4000BF">temp[0]&lt;&lt;8 | temp[1]<br /></span><br />Gdzie popełniam błąd w rozumowaniu?<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=861">kremir</a> — 26 gru 2016, o 19:00</p><hr />
]]></content>
</entry>
</feed>