<?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=4&amp;t=3599&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-07-20T14:06:54+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3599&amp;mode</id>
<entry>
<author><name><![CDATA[robert95]]></name></author>
<updated>2013-07-20T14:06:54+01:00</updated>
<published>2013-07-20T14:06:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42483#p42483</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42483#p42483"/>
<title type="html"><![CDATA[Re: I2C - problem ze zrozumieniem warunku pętli.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42483#p42483"><![CDATA[
<div class="quotetitle">#ciamciak# napisał(a):</div><div class="quotecontent"><br />!, to negacja logiczna (prawda/fałsz), a nie bitowa (~).<br /></div><br />Wynika z tego, że warunek jest spełniony gdy wyrażenie jest równe 0? Jeżeli tak, to warunek jest spełniony dopóki flaga TWINT jest nie wyzerowana (tzn. dopóki bit flaga TWINT w rejestrze TWCR jest równa 0)?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />2. Sprawdź jaka jest różnica pomiędzy ! a ~, bo ten pierwszy to negacja logiczna a ten drugi bitowa i ! 11110000 nie da w wyniku 00001111<br /></div><br /><div class="quotetitle">GwynBleidD napisał(a):</div><div class="quotecontent"><br />O nie nie nie, panie kochany. Pomyliłeś sobie ~ (operator bitowy) z ! (operator logiczny). Wykrzyknik robi z prawdy nieprawdę i odwrotnie, więc dowolną wartość różną od 0 zamieni Ci na 0, a 0 zamieni na 1. Natomiast tylda zrobi dokładnie tak jak piszesz, czyli zamieni każdy z bitów na przeciwny.<br /></div><br />Matko! Straszliwy błąd w zrozumieniu był przyczyną wielu problemów! Dzięki, już wszystko jasne. <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1427">robert95</a> — 20 lip 2013, o 14:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-07-20T14:03:43+01:00</updated>
<published>2013-07-20T14:03:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42481#p42481</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42481#p42481"/>
<title type="html"><![CDATA[Re: I2C - problem ze zrozumieniem warunku pętli.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42481#p42481"><![CDATA[
1. W AVR'ach niektóre bity w rejestrach zeruje się poprzez wpisanie 1 i tak jest zerowany bit TWINT<br />2. Sprawdź jaka  jest różnica pomiędzy ! a ~, bo ten pierwszy to negacja logiczna a ten drugi bitowa i ! 11110000 nie da w wyniku 00001111<br />3. Ta pętla while( !(TWCR &amp; (1&lt;&lt;TWINT) ) ); to oczekiwanie na ustawienie bitu TWINT przez moduł TWI procesora. Iloczyn logiczny wartości rejestru i 1 przesuniętej o numer bitu da w wyniku 0, gdy ten bit jest 0 i liczbę różną od zera gdy ten bit jest 1. Negacja logiczna służy do dopasowania do aktualnej potrzeby w programie czy chcemy czekać na ustawienie bitu czy na jego wyzerowanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 20 lip 2013, o 14:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ciamciak]]></name></author>
<updated>2013-07-20T14:02:30+01:00</updated>
<published>2013-07-20T14:02:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42479#p42479</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42479#p42479"/>
<title type="html"><![CDATA[Re: I2C - problem ze zrozumieniem warunku pętli.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42479#p42479"><![CDATA[
!, to negacja logiczna (prawda/fałsz), a nie bitowa (~).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1254">ciamciak</a> — 20 lip 2013, o 14:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robert95]]></name></author>
<updated>2013-07-20T13:51:53+01:00</updated>
<published>2013-07-20T13:51:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42476#p42476</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42476#p42476"/>
<title type="html"><![CDATA[I2C - problem ze zrozumieniem warunku pętli.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3599&amp;p=42476#p42476"><![CDATA[
Witam.<br />Dziś postanowiłem pierwszy i ostatni raz zapytać się o sens warunku pętli while(), gdyż z programowaniem jak z matematyką - nie zrozumiemy granic, to nie zrozumiemy pochodnych, analogicznie - nie zrozumiałem dokładnie dlaczego warunek w pętli while jest negowany operatorem <strong>!</strong> i wszystko wraca. <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br />Przechodząc do meritum, chodzi o warunek w funkcjach komunikacyjnych I2C z układem RTC, mianowicie w &quot;bluebook'u&quot; na str. 279 postanowiłem przewertować po raz kolejny sens tych zapisów - wszystko jest zrozumiałe do momentu pojawienia się warunku:[syntax=c]while( !(TWCR&amp;(1&lt;&lt;TWINT) );[/syntax]<br />Oto cała funkcja:<br />[syntax=c]TWI_start(void) {<br />              TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWSTA);<br />              while( !(TWCR&amp;(1&lt;&lt;TWINT) );<br />}[/syntax]<br /><br />Ja to widzę tak:<br />Rejestr TWCR w zapisie binarnym wyglądałby następująco:<br />TWCR = 0b<span style="color: #FF0000">1</span>0<span style="color: #0040FF">1</span>00<span style="color: #00FF00">1</span>00<br /><span style="color: #FF0000">1</span> - TWINT<br /><span style="color: #0040FF">1</span> - TWSTA<br /><span style="color: #00FF00">1</span> - TWEN<br /><br />Następnie mamy operację AND, a więc:<br />TWCR&amp;(1&lt;&lt;TWINT) = 0b<span style="color: #FF0000">1</span>0<span style="color: #0040FF">1</span>00<span style="color: #00FF00">1</span>00 &amp; <span style="color: #FF0000">1</span>0000000<br />Wynik (bez negacji): <span style="color: #FF0000">1</span>0000000<br />Wynik (po zanegowaniu): !(<span style="color: #FF0000">1</span>0000000) = <span style="color: #FF0000">0</span>1111111<br /><br />Moje pytanie brzmi:<br />Funkcja while() jest wykonywana dopóki warunek jest spełniony, a w tym przypadku do momentu gdy nie otrzymamy 0, ale zanegowanie powoduje przecież, że zawsze warunek będzie spełniony ponieważ gdy flaga TWINT nie jest wyzerowana, to wynikiem operacji będzie 0b<span style="color: #FF0000">1</span>1111111 , jest to wyrażenie większe od zera. <br />PS. Wiem, że ja coś źle interpretuję, ale problem w tym, że nie wiem kiedy robię ten koszmarny błąd. <br /><br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1427">robert95</a> — 20 lip 2013, o 13:51</p><hr />
]]></content>
</entry>
</feed>