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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-05-10T08:52:24+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23764&amp;mode</id>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2021-05-10T08:52:24+01:00</updated>
<published>2021-05-10T08:52:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232245#p232245</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232245#p232245"/>
<title type="html"><![CDATA[Re: Funkcja zmiany stanu na wyjściu led_on(1);]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232245#p232245"><![CDATA[
To tylko przykład. Nie ma obowiązku stosowania ani struktur ani typów wyliczeniowych. Chodzi o ideę - pozbycie się kłopotliwych ifów prostymi technikami. W pierwszym przypadku numer LEDa traktujemy jako indeks do tablicy, która zawiera paskudną część kodu i co najważniejsze skupia ją w jednym miejscu. W razie modyfikacji robi się to nie w n funkcjach tylko w jednej tablicy. Przypadek drugi podobnie tyle że obrzydliwości ukrywamy pod stałą symboliczną.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 10 maja 2021, o 08:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[argentrol]]></name></author>
<updated>2021-05-08T22:23:19+01:00</updated>
<published>2021-05-08T22:23:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232235#p232235</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232235#p232235"/>
<title type="html"><![CDATA[Re: Funkcja zmiany stanu na wyjściu led_on(1);]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232235#p232235"><![CDATA[
<img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /> Ło Matko...<br /><br />Na pierwszy rzut oka nic z tego nie rozumiem, ale jest późno i może dlatego... Jutro ze świeżą głową się temu przyjrzę... ale najpierw muszę zgłębić jeszcze raz tematy struktur i typów wyliczeniowych... <br /><br />Dziękuję!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21726">argentrol</a> — 8 maja 2021, o 22:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2021-05-08T21:37:02+01:00</updated>
<published>2021-05-08T21:37:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232234#p232234</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232234#p232234"/>
<title type="html"><![CDATA[Re: Funkcja zmiany stanu na wyjściu led_on(1);]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232234#p232234"><![CDATA[
Zależy czy chcesz by numer diody był kolejną liczbą czy też wystarczy odwoływanie się przez nazwę symboliczną. W pierwszym przypadku można zastosować tablicę &quot;tłumaczącą&quot; nr na konkretny pin i port. W drugim przypadku można zrobić zwykłą operację na porcie. W najbardziej podstawowym rozwiązaniu jest ograniczenie, że LEDy muszą się znajdować na jednym porcie. Po pewnej rozbudowie można to obejść. <br /><br />przypadek 1.<br /><br />[syntax=c]struct led {<br />  uint8_t volatile *port;<br />  uint8_t pin;<br />  _Bool inverted;  //true dla Anoda-V+, Katoda-pin, false dla Anoda-pin, katoda-GND<br />}<br />static struct led led&#91;LED_NUMBER&#93; = {<br /> {&amp;PORTA, 0,1},<br /> {&amp;PORTB,0,0},<br /> {&amp;PORTC,0,1}<br />}<br /><br />static inline void led_hi(uint8_t ledno)<br />{<br />    *led&#91;ledno&#93;.port |= 1&lt;&lt;led&#91;ledno&#93;.pin;<br />}<br /><br />static inline void led_low(uinnt8_t ledno)<br />{<br />    *led&#91;ledno&#93;.port &amp;= ~(1&lt;&lt;led&#91;ledno&#93;.pin);<br />}<br /><br />void led_on(uint8_t ledno)<br />{<br />    led&#91;ledno&#93;.inverted) ? led_low(ledno) : led_hi(ledno);<br />}<br /><br />void led_of(uint8_t ledno)<br />{<br />    led&#91;ledno&#93;.inverted) ? led_hi(ledno) : led_low(ledno);<br />}<br /><br />void led_toggle(uint8_t ledno)<br />{<br />    *led&#91;ledno&#93;.port ^= 1&lt;&lt;led&#91;ledno&#93;.pin;<br />}<br /><br />int main()<br />{<br />   led_toggle(0);<br />   led_toggle(2);<br />    led_on(0);<br />    led_on(1);<br />    led_on(2);<br />   led_off(0);<br />   led_off(1);<br />   led_off(2);<br />}[/syntax]<br /><br /><br />Przypadek drugi<br /><br />[syntax=c]#define LED1NR 6<br />#define LED2NR 5<br />#define LED3NR 4<br />#define LED_PORT PORTD<br />#define LED_INVERTED ((1&lt;&lt;LED1NR) | (1&lt;&lt;LED2NR))<br /><br />enum led {<br />      LED1 = (1&lt;&lt;LED1NR),<br />      LED2 = (1&lt;&lt;LED2NR),<br />      LED3 = (1&lt;&lt;LED3NR),<br />};<br /> <br />void led_on (enum led led){<br />        LED_PORT &amp;= ~led;<br />        LED_PORT |= (LED_INVERTED &amp; led) ^ led;<br />}<br /> <br />void led_off (enum led led){<br />      LED_PORT |= led;<br />      LED_PORT &amp;= ~((LED_INVERTED &amp; led) ^ led);<br />}<br /> <br />void led_tog (enum led led){<br />    LED_PORT ^ led;<br />}<br /><br />int main()<br />{<br />   led_on(LED1);<br />   led_toggle(LED2);<br />   led_toggle(LED3);<br />   led_off(LED1);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 8 maja 2021, o 21:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-05-08T21:04:48+01:00</updated>
<published>2021-05-08T21:04:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232232#p232232</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232232#p232232"/>
<title type="html"><![CDATA[Re: Funkcja zmiany stanu na wyjściu led_on(1);]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232232#p232232"><![CDATA[
Jeśli chcesz mieć zupełną niezależność od pinu to tylko zabawa z else if w takim przypadku<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 maja 2021, o 21:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[argentrol]]></name></author>
<updated>2021-05-08T20:04:57+01:00</updated>
<published>2021-05-08T20:04:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232231#p232231</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232231#p232231"/>
<title type="html"><![CDATA[Funkcja zmiany stanu na wyjściu led_on(1);]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23764&amp;p=232231#p232231"><![CDATA[
Witam Was.<br /><br />Szczerze mówiąc, to przypuszczam, że odpowiedź na moje pytanie gdzieś na forum jest, tylko że ja nie wiem jak to pytanie dobrze zadać. Zaczynam z językiem C, uczę się programować na Atmedze i nie umiem jeszcze nazwać niektórych rzeczy &quot;po imieniu&quot;.<br /><br />Mam taki mały kod, ale ugrzęzłem na takim czymś:<br /><br />Chciałbym w main.c użyć funkcji np. led_on(x); gdzie (x) ma oczywiście oznaczać nr diody (ale nie nr pinu!). W tej chwili mam to zrobione tak, że funkcja sprawdza to na zasadzie:<br /><br />[syntax=c]#define LED1 (1&lt;&lt;PD6)<br />#define LED2 (1&lt;&lt;PD5)<br />#define LED3 (1&lt;&lt;PD4)<br /><br />#define LED1_ON PORTD |= LED1<br />#define LED1_OFF PORTD &amp;= ~LED1<br />#define LED1_TOG PORTD ^= LED1<br />#define LED2_ON PORTD |= LED2<br />#define LED2_OFF PORTD &amp;= ~LED2<br />#define LED2_TOG PORTD ^= LED2<br />#define LED3_ON PORTD |= LED3<br />#define LED3_OFF PORTD &amp;= ~LED3<br />#define LED3_TOG PORTD ^= LED3<br /><br /><br />void led_on (uint8_t x){<br />if(x==1) LED1_ON;<br />else if(x==2)LED2_ON;<br />else if(x==3)LED3_ON;<br />}<br /><br />void led_off (uint8_t x){<br />if(x==1) LED1_OFF;<br />else if(x==2)LED2_OFF;<br />else if(x==3)LED3_OFF;<br />}<br /><br />void led_tog (uint8_t x){<br />if(x==1) LED1_TOG;<br />else if(x==2)LED2_TOG;<br />else if(x==3)LED3_TOG;<br />}[/syntax]<br /><br /><br /> To na pewno da się zrobić jakoś mądrzej, żeby w przypadku konieczności użycia np. czwartej diody nie musieć dopisywać do każdej funkcji kolejnego &quot;else if&quot;, dyrektyw preprocesora (wiem, że one akurat nie są konieczne) itd.<br /><br />Kombinowałem z jakimiś składniami typu: zamiast LED1 to LED(x), próbowałem użyć tych makr dostępu do portów, kombinowałem jak użyć tablic... nie umiem nic mądrego wymyślić...  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" />  <br />Naprowadzi mnie ktoś na jakiś azymut?<br /><br />Tylko bardzo proszę, jak najprostszym, lub chociaż w miarę prostym językiem... Dziękuję za wyrozumiałość... <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Bartek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21726">argentrol</a> — 8 maja 2021, o 20:04</p><hr />
]]></content>
</entry>
</feed>