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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-01-06T22:10:39+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=14104&amp;mode</id>
<entry>
<author><name><![CDATA[Dariu5z]]></name></author>
<updated>2016-01-06T22:10:39+01:00</updated>
<published>2016-01-06T22:10:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149850#p149850</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149850#p149850"/>
<title type="html"><![CDATA[Re: makro do operowania diodami LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149850#p149850"><![CDATA[
Czasem proste rozwiązania są na wyciągnięcie ręki, wystarczy tylko spojrzeć z ciut innej strony <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> dziękuję za pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11550">Dariu5z</a> — 6 sty 2016, o 22:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-06T20:22:04+01:00</updated>
<published>2016-01-06T20:22:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149836#p149836</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149836#p149836"/>
<title type="html"><![CDATA[Re: makro do operowania diodami LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149836#p149836"><![CDATA[
Napisałem:<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Jak potrzebujesz koniecznie mieć gdzieś indziej zdefiniowane LEDy, to możesz zrobić tablicę LED[] i w niej przypisywać wartości.<br /></div>więc nie zgodzę się z:<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Nie wiem dlaczego tak w stronę makr ciągniecie.<br /></div>Zamiast funkcji robisz tablicę:<br />[syntax=c]uint8_t LED&#91;&#93; = { LED_1, LED_1, LED_1, LED_2, LED_2, LED_2, LED_3, LED_3 };[/syntax]<br />i możesz zamiast funkcji ją użyć:<br />[syntax=c]if (pomiar_temp&#91;i&#93;&#91;4&#93; == -1)  PORTD &amp;= ~LED&#91;i&#93;;[/syntax]<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 6 sty 2016, o 20:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2016-01-06T20:08:42+01:00</updated>
<published>2016-01-06T20:08:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149833#p149833</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149833#p149833"/>
<title type="html"><![CDATA[Re: makro do operowania diodami LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149833#p149833"><![CDATA[
Nie wiem dlaczego tak w stronę makr ciągniecie. Od makr należy uciekać jak najdalej. Wiadomo, że nieraz ułatwią wiele, ale mają jedną podstawową wadę - nie są sprawdzane przez kompilator (np. zgodność typu). Zamiast makr należy stosować funkcje - po to one są.<br />Fragment:<br />[syntax=c]for (i = 0; i &lt; 8; i++) {<br />        if (pomiar_temp&#91;i&#93;&#91;4&#93; == -1)  PORTD &amp;= ~(LED_(i));<br />        if (pomiar_temp&#91;i&#93;&#91;4&#93; == 0) PORTD |= LED_(i);<br />        if (pomiar_temp&#91;i&#93;&#91;4&#93; == 1) PORTD ^= LED_(i);<br />}[/syntax]<br />można zastąpić:<br />[syntax=c]for (i = 0; i &lt; 8; i++) {<br />        if (pomiar_temp&#91;i&#93;&#91;4&#93; == -1) zapal_led(i);<br />        if (pomiar_temp&#91;i&#93;&#91;4&#93; == 0) zgas_led(i);<br />        if (pomiar_temp&#91;i&#93;&#91;4&#93; == 1) migaj_led(i);<br />}[/syntax]<br />a funkcje obsługi LEDów robisz osobno, np.:<br />[syntax=c]void zapal_led(char led)<br />{<br />  if (led == 1) PORTD &amp;= ~(LED_1);<br />  if (led == 2) PORTD &amp;= ~(LED_2);<br />  //itd. dla liczby LEDów - oznaczmy jako max_led<br />  if ((led &lt;1) || (led &gt;max_led)) wywal_blad();<br />}[/syntax]<br />Zaletą jest, że można dowolnie podłączyć LED (port, pin, sposób sterowania itp.), kompilator sprawdza poprawność, w funkcji wywal_blad() możemy zdefiniować co ma się dziać w programie, gdy w jakimś nieprzewidzianym przypadku zmienna <em>i</em> wyjdzie poza dopuszczalny zakres. Łatwo też będzie zmienić, gdy zamiast zapalania diody będziemy chcieli jeszcze coś obsłużyć (np. dodać efekt dżwiękowy) - wystarczy zmodyfikować zapal_led(). Oczywiście lepiej nazwę wtedy zmienić, np. na: reakcja_temp_za_wysoka() - taka nazwa pozwala też łatwo rozczytać się w kodzie i znaleźć błąd w złym przypisaniu funkcji w danej sytuacji. <br />Aha, być może ciało funkcji zapal_led gasi, a nie zapala, ale to już sam wiesz. Wiem, że użyłem makr, ale tylko tych, które definiują porty, piny itp. Tego się raczej nie przeskoczy, jeśli chce się zachować czytelność kodu.  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Zresztą zaleca się używanie definicji zastępujących wartości liczbowe, np. zamiast 3.14 lepiej użyć <br />[syntax=c]#define liczba_pi 3.14[/syntax]<br />gdyż, jeśli będzie potrzeba zwiększyć jej dokładność to wystarczy zrobić to w definicji a nie w wielu miejscach programu, gdzie jej użyliśmy. Podobnie jeśli przyjdzie zmienić typ można zapisać:<br />[syntax=c]#define liczba_pi 3.14f[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 6 sty 2016, o 20:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-06T19:45:07+01:00</updated>
<published>2016-01-06T19:45:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149827#p149827</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149827#p149827"/>
<title type="html"><![CDATA[Re: makro do operowania diodami LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149827#p149827"><![CDATA[
Mieszasz kod dla preprocesora (czyli wykonywany przed kompilacją) z kodem dla kompilatora.<br />i jest zmienną kodu w C. Więc preprocesor robi z tego LED_i.<br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br />Jak potrzebujesz koniecznie mieć gdzieś indziej zdefiniowane LEDy, to możesz zrobić tablicę LED[] i w niej przypisywać wartości.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 6 sty 2016, o 19:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Dariu5z]]></name></author>
<updated>2016-01-06T19:08:24+01:00</updated>
<published>2016-01-06T19:08:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149824#p149824</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149824#p149824"/>
<title type="html"><![CDATA[makro do operowania diodami LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14104&amp;p=149824#p149824"><![CDATA[
Cześć, mampewien problem z makrami, potrzebuję pomocy bardziej doświadczonej osoby.<br />mam 8 czujników DS18B20 i 8 diod<br />jeśli temperatura jest za wysoka to dioda mruga co 0.5s<br />jeśli za niska - świeci światłem ciągłym<br />jeśli ok - nic się nie dzieje<br />sprawdzanie i mruganie mam załatwione wewnątrz takiej konstrukcji<br />[syntax=c]if (flaga_05sek) {<br />     if (pomiar_temp&#91;0&#93;&#91;4&#93; == -1) {PORTD &amp;= ~(LED_1);}<br />     if (pomiar_temp&#91;0&#93;&#91;4&#93; == 0) {PORTD |= LED_1;}<br />     if (pomiar_temp&#91;0&#93;&#91;4&#93; == 1) {PORTD ^= LED_1;}<br />     if (pomiar_temp&#91;1&#93;&#91;4&#93; == -1) PORTD &amp;= ~(LED_2); <br />     if (pomiar_temp&#91;1&#93;&#91;4&#93; == 0) PORTD |= LED_2; <br />     if (pomiar_temp&#91;1&#93;&#91;4&#93; == 1) PORTD ^= LED_2;<br />     <br />     ...<br />     <br />     flaga_05sek = 0;<br />}[/syntax]<br />pomiar_temp[][] to bufor do odczytu temperatury<br />wcześniej instrukcja sprawdza, czy temp jest za niska (-1), ok (0) czy za wysoka (1) i daje wartość w 4 kolumnie<br />diody mam na LED_1, LED_2, ..., LED_8<br />pytanie brzmi, jak te if'y zastąpić makrem LED_(x)?<br /><br />Zrobiłem takie cudo, ale kompilator krzyczy mi, że LED_(i) to niezdefiniowana funkcja...<br />[syntax=c]#define LED_(x) XLED_(x)<br />#define XLED_(x) (LED_##x)<br /><br />...<br /><br />for (i = 0; i &lt; 8; i++) {<br />if (pomiar_temp&#91;i&#93;&#91;4&#93; == -1)  PORTD &amp;= ~(LED_(i));<br />if (pomiar_temp&#91;i&#93;&#91;4&#93; == 0) PORTD |= LED_(i);<br />if (pomiar_temp&#91;i&#93;&#91;4&#93; == 1) PORTD ^= LED_(i);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11550">Dariu5z</a> — 6 sty 2016, o 19:08</p><hr />
]]></content>
</entry>
</feed>