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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-12-01T22:19:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=9505&amp;mode</id>
<entry>
<author><name><![CDATA[michal98]]></name></author>
<updated>2014-12-01T22:19:49+01:00</updated>
<published>2014-12-01T22:19:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106956#p106956</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106956#p106956"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106956#p106956"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Powiem wprost.. proszę ... nie pisz takiego kodu! Co z tego że inni piszą jeszcze gorszy (np. tasiemiec  switch-case który wyłącza i włącza diody... )<br /><br />W programowaniu obowiązuje zasada że kod który się powtarza, łamie regułę DRY (ang. Don't Repeat Yourself). U Ciebie jest ,,stado swirch-case&quot; a możesz to zrobić bardzo prosto definiując tablicę z wartościami każdego z warunków i sprawdzając czy dane mieszczą się w zakresie. Indeks dopasowanej komórki tablicy to numer klawisza. Prosto, łatwo i skutecznie bez ,,tasiemca&quot; z switch-case. Zwykłe for po tablicy z 1 if a w środku break po dopasowaniu! I kod mniejszy i szybciej będzie działało niż to.. coś....<br /><br />PS. Jak miałbym wskazać jaką konstrukcję usunąć z C, to było by to switch-case. W 99% można zastąpić ją czytelniejszym if lub tablicą. Twój przypadek nie należy do tego 1% <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br />PS2. No i jeszcze kwiatki ze zmienną globalną.. eh..  <br /><br />Jaka jest objętość wsadu do MCU teraz? Jak poprawisz na tablicę i przemyślisz zwracanie klawisza w metodzie sprawdz, to zobaczysz że kod _bardzo_ zmaleje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /></div><br /><br /><br />Bardzo dziękuję za uwagę i inną propozycję rozwiązania mojego problemu. Powiem szczerze, że nie podobało mi się wersja z poleceniem case ale nie wpadłem na inne rozwiązanie <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> <br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 29-11-2014<br /> *      Author: Michał Szymocha<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define x 3<br /><br />uint16_t pomiar(uint8_t kanal);<br />uint8_t  sprawdz();<br /><br />uint16_t warunek&#91;16&#93; = {743, 990, 927, 967, 472, 600, 415, 536, 297, 371, 241, 327, 158, 199, 140, 179};<br />uint16_t raw;<br />uint8_t key, i;<br /><br />int main( void )<br />{<br /><br />lcd_init();<br />ADMUX |= (1&lt;&lt;REFS0);<br />ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS0);<br /><br /><br />while(1)<br />{<br /><br />key = sprawdz();<br /><br />lcd_locate(0,0);<br />lcd_int( pomiar(7) );<br />lcd_str(&quot;     &quot;);<br />lcd_locate(1,0);<br />lcd_int( key );<br />lcd_str(&quot;     &quot;);<br /><br />}<br />}<br />uint16_t pomiar(uint8_t kanal )<br />{<br />ADMUX = (ADMUX &amp; 0xF8) | kanal;<br />ADCSRA |= (1&lt;&lt;ADSC);<br />while( ADCSRA &amp; (1&lt;&lt;ADSC) );<br />return ADCW;<br />}<br />uint8_t sprawdz()<br />{<br />raw = pomiar(7);<br /><br />for(i = 0; i  &lt; 16; i++)<br />{<br />if(raw &gt;= (warunek&#91;i&#93; - x) &amp;&amp; raw &lt;= (warunek&#91;i&#93; + x) ) //(raw &gt;= 743 - x &amp;&amp; raw &lt;= 743 + x )<br />{<br />key = i+1;<br />break;<br />}else key = 0;<br />}<br />return key;<br />}[/syntax]<br /><br />Kod z instrukcją case zajmował 1646b, a kod z tablicą i instrukcją for 1438b.<br /><br />Proszę jeszcze o komentarz odnośnie schematu w eagle'u <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><a href="http://forum.atnel.pl/_obrazki/o/4341/4f623edc13d632bc2621fc3d8a1b5ff1.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4341/4f623edc13d632bc2621fc3d8a1b5ff1.png" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4341">michal98</a> — 1 gru 2014, o 22:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michal98]]></name></author>
<updated>2014-12-01T20:42:31+01:00</updated>
<published>2014-12-01T20:42:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106936#p106936</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106936#p106936"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106936#p106936"><![CDATA[
[syntax=c]Case 1 , 2:<br /><br />Case 1 . 2:<br /><br />Case (1 . 2):<br /><br />Case (1 , 2):<br /><br />Case 1 2:[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4341">michal98</a> — 1 gru 2014, o 20:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kaka0204]]></name></author>
<updated>2014-12-01T20:38:27+01:00</updated>
<published>2014-12-01T20:38:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106935#p106935</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106935#p106935"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106935#p106935"><![CDATA[
<div class="quotetitle">michal98 napisał(a):</div><div class="quotecontent"><br />działa prawidłowo, a zapisany w każdy inny sposób eclipse podkreśla na pomarańczowo z błędem &quot;Syntax error&quot;<br /></div><br /><br />&quot;Każdy inny sposób&quot; tzn. jak?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=889">kaka0204</a> — 1 gru 2014, o 20:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michal98]]></name></author>
<updated>2014-12-01T20:22:01+01:00</updated>
<published>2014-12-01T20:22:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106934#p106934</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106934#p106934"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106934#p106934"><![CDATA[
Dzięki za odpowiedź.<br /><br />Zmieniłem typ funkcji z uint8_t na void i usunąłem &quot;return 0;&quot; nie potrzebuje nic zwracać, ponieważ ta funkcja zapisuje wynik do zmiennej globalnej &quot;key&quot;<br /><br />Warunek  <br />[syntax=c]case 743 - x ... 743 + x:[/syntax]<br />działa prawidłowo, a zapisany w każdy inny sposób eclipse podkreśla na pomarańczowo z błędem &quot;Syntax error&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4341">michal98</a> — 1 gru 2014, o 20:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kaka0204]]></name></author>
<updated>2014-12-01T20:09:29+01:00</updated>
<published>2014-12-01T20:09:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106928#p106928</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106928#p106928"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106928#p106928"><![CDATA[
Napisałeś<br /><br />[syntax=c]uint8_t sprawdz();[/syntax]<br /><br />Źle musisz podać typ argumentu. Ta funkcja będzie korzystała z argumentu typu void. To po pierwsze. Po drugie w funkcji sprawdz() napisałeś<br /><br />[syntax=c]return 0;[/syntax]<br /><br />A więc funkcja zawsze zwróci 0. Napisz tak:<br /><br />[syntax=c]return key;   // zapewne o tą wartość ci chodzi :)[/syntax] <br /><br />Po trzecie.<br /><br />[syntax=c]case 743 - x ... 743 + x:[/syntax]<br /><br />Ten warunek jest błędy. Kolega jacekk232 wielokropek podał dla przykładu. Musisz to zmienić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=889">kaka0204</a> — 1 gru 2014, o 20:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michal98]]></name></author>
<updated>2014-12-01T19:18:53+01:00</updated>
<published>2014-12-01T19:18:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106917#p106917</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106917#p106917"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106917#p106917"><![CDATA[
Dziękuję za pomoc. <br /><br />Potrzebowałem tego gdyż programowałem obsługę keypada 4x4 <a href="http://forum.atnel.pl/download/file.php?mode=view&amp;id=1555"  class="postlink"><span style="font-size: 85%; line-height: normal">nota katalogowa</span></a>jednym pinem procesora za pomocą ADC. Potrzebowałem użyć zakresu liczb, gdyż jak wiadomo rezystory mogą minimalnie zmieniać swoją rezystancję np. pod wpływem temperatury.<br /><br />Kod który napisałem :<br />[syntax=c]/*<br />/*<br /> * main.c<br /> *<br /> *  Created on: 29-11-2014<br /> *      Author: Michał Szymocha<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define x 8<br /><br />uint16_t pomiar(uint8_t kanal);<br />uint8_t sprawdz();<br /><br />uint16_t raw;<br />uint8_t key;<br />int main( void )<br />{<br /><br />lcd_init();<br />ADMUX |= (1&lt;&lt;REFS0);<br />ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS0);<br /><br /><br />while(1)<br />{<br /><br />sprawdz();<br /><br />lcd_locate(0,0);<br />lcd_int( pomiar(7) );<br />lcd_str(&quot;     &quot;);<br />lcd_locate(1,0);<br />lcd_int( key );<br />lcd_str(&quot;     &quot;);<br /><br />}<br />}<br />uint16_t pomiar(uint8_t kanal )<br />{<br />ADMUX = (ADMUX &amp; 0xF8) | kanal;<br />ADCSRA |= (1&lt;&lt;ADSC);<br />while( ADCSRA &amp; (1&lt;&lt;ADSC) );<br />return ADCW;<br />}<br />uint8_t sprawdz()<br />{<br />raw = pomiar(7);<br />switch(raw)<br />{<br />case 743 - x ... 743 + x:<br />key = 1;<br />break;<br />case 988  - x ... 988 + x:<br />key = 2;<br />break;<br />case 921 - x ... 921 + x:<br />key = 3;<br />break;<br />case 966 - x ... 966 + x:<br />key = 4;<br />break;<br />case 476 - x ... 476 + x:<br />key = 5;<br />break;<br />case 601 - x ... 601 + x:<br />key = 6;<br />break;<br />case 415 - x ... 415 + x:<br />key = 7;<br />break;<br />case 542 - x ... 542 + x:<br />key = 8;<br />break;<br />case 281 - x ... 281 + x:<br />key = 9;<br />break;<br />case 359 - x ... 359 + x:<br />key = 10;<br />break;<br />case 233 - x ... 233 + x:<br />key = 11;<br />break;<br />case 318 - x ... 318 + x:<br />key = 12;<br />break;<br />case 153 - x ... 153 + x:<br />key = 13;<br />break;<br />case 195 - x ... 195 + x:<br />key = 14;<br />break;<br />case 135 - x ... 135 + x:<br />key = 15;<br />break;<br />case 176 - x ... 176 + x:<br />key = 16;<br />break;<br />default:<br />key = 0;<br />break;<br />}<br />return 0;<br />}<br /><br />}[/syntax]<br /><br />A oto schemat stworzony w Eagle'u<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/4341/4dd53b4c944ec833a0c4e0dff8a3bb35.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4341/4dd53b4c944ec833a0c4e0dff8a3bb35.png" alt="Obrazek" /></a><br /><br />p1 : Czy kod w C jest napisany poprawnie, bez jakichś błędów których ja nie widzę z uwagi na to, że jestem początkujący ?<br />p2 : Czy połączenia na schemacie są wykonane prawidłowo ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4341">michal98</a> — 1 gru 2014, o 19:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-12-01T01:12:05+01:00</updated>
<published>2014-12-01T01:12:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106853#p106853</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106853#p106853"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106853#p106853"><![CDATA[
W gcc można użyć takiej konstrukcji<br />[syntax=c]switch(x)<br />{<br />case 1 ... 5:<br />    funkcja();<br />case 10 ... 25:<br />    funkcja2();<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 1 gru 2014, o 01:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[j23]]></name></author>
<updated>2014-12-01T00:18:21+01:00</updated>
<published>2014-12-01T00:18:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106847#p106847</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106847#p106847"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106847#p106847"><![CDATA[
<div class="quotetitle">michal98 napisał(a):</div><div class="quotecontent"><br />(...) ale z tego co widzę to zamiast 16 linijek ten warunek miałby 160.<br /></div><br />Możesz jeszcze spróbować napisać taką funkcję:<br />[syntax=c]int czy_jest_w_zakresie(int zmienna_testowana, int xmin, int xmax)<br />{<br />for (int i = xmin; i &lt; xmax; i++)<br /> {<br /> if (zmienna_testowana == i)<br />   {<br />    return 0; // jest w zakresie<br />   }  <br />   else return 1; // nie jest w zakresie<br />}[/syntax]<br /><br /><br />ewentualnie taką:<br />definicja:<br />[syntax=c]int czy_jest_w_zakresie_tab(zmienna_testowana2, int *tab_zakres)<br />{<br />const int c = (sizeof(tab_zakres) / sizeof(tab_zakres&#91;0&#93;));<br />for (int i = 0; i &lt; c; i++)<br />    {<br />    if (zmienna_testowana2 == tab_zakres&#91;i&#93;)<br />       {<br />       // jakieś funkcje jak jest w zakresie<br />       return 0;<br />       }<br />       else <br />             {<br />             // jakieś funkcje jak nie jest w zakresie<br />              return 1;<br />              }<br />}[/syntax]<br /><br /><br />zastosowanie w kodzie dla funkcji czy_jest_w_zakresie_tab():<br />[syntax=c]int zakres_1&#91;&#93; = { 0, 1, 2, 3 }; // możliwe wartości stałych dcb<br />int zakres_2&#91;&#93; = { 2, 5, 10, 12, 18 };<br /><br />czy_jest_w_zakresie_tab(3, int zakres_1); // jest<br />czy_jest_w_zakresie_tab(-2, int zakres_1); // nie jest<br />czy_jest_w_zakresie_tab(3, int zakres_2); // nie jest<br />czy_jest_w_zakresie_tab(12, int zakres_2); // jest[/syntax]<br /><br />Mam nadzieję, że nic nie pomieszałem.<br /><br />Pozdrawiam! j23 Jarek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4504">j23</a> — 1 gru 2014, o 00:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michal98]]></name></author>
<updated>2014-11-30T23:31:54+01:00</updated>
<published>2014-11-30T23:31:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106846#p106846</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106846#p106846"/>
<title type="html"><![CDATA[Re: Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106846#p106846"><![CDATA[
Dzięki za szybką odpowiedź<br /><br />Ja mam takich warunków if 16 i porostu myślałem że  mogę jakoś uprościć mój kod, ale z tego co widzę to zamiast 16 linijek ten warunek miałby 160.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4341">michal98</a> — 30 lis 2014, o 23:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michal98]]></name></author>
<updated>2014-11-30T23:22:02+01:00</updated>
<published>2014-11-30T23:22:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106840#p106840</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106840#p106840"/>
<title type="html"><![CDATA[Zamiana &quot;if&quot; na &quot;case&quot;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9505&amp;p=106840#p106840"><![CDATA[
Czy można zapisać poniższy kod z użyciem polecenia case ?<br /><br />[syntax=c]if (x &gt; 1 &amp;&amp; x &lt; 5)<br />{<br />    funkcja;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4341">michal98</a> — 30 lis 2014, o 23:22</p><hr />
]]></content>
</entry>
</feed>