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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-09-10T00:03:56+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2851&amp;mode</id>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2013-09-10T00:03:56+01:00</updated>
<published>2013-09-10T00:03:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=49052#p49052</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=49052#p49052"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=49052#p49052"><![CDATA[
I nastała jasność dzięki podglądowi Open Declaration .......chyba że nie.<br />Teraz wiem dlaczego PB2 = PA2 = PC2 = PD2, ponieważ wyrażenia sprowadzają się do wartości 2  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> O wiele ważniejsze jest to wyrażenie:<br />[syntax=c]#define PORTD   _SFR_IO8(0x12)[/syntax] ponieważ ono odwołuje się do 'szufladki' gdzie jest rejestr stanu całego (w tym przypadku) portu D <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Więc poprawne mój kod wygląda tak:<br />[syntax=c]#define plus  7<br />#define minus 6<br /><br />PORTD|= (1&lt;&lt;plus)|(1&lt;&lt;minus); //do vcc<br /><br />main()<br />{<br />  void klawisz(uint8_t key)<br />    {<br /> static uint8_t key_lock&#91;8&#93;, flag&#91;8&#93;;<br /><br /> if( !key_lock&#91;key&#93; &amp;&amp; !(PIND &amp; (1&lt;&lt;key))) //krotkie wcisniecie<br /> {<br /> key_lock&#91;key&#93;=2;<br /> PORTB ^=(1&lt;&lt;PB1);<br />flag&#91;key&#93;=1;<br />Tim3 = (1*2000)/10;<br />   }<br /><br /> else<br /><br />if(key_lock&#91;key&#93; &amp;&amp; (PIND &amp; (1&lt;&lt;key)))<br />{<br />key_lock&#91;key&#93;++;<br />  if( !key_lock&#91;key&#93; )<br /> {<br /> Tim3=0;<br /> flag&#91;key&#93;=0;<br />}<br />}<br /><br />else<br /><br />if( flag&#91;key&#93; &amp;&amp; !Tim3 ) //dlugie wcisniecie<br />  {<br />         PORTB ^=(1&lt;&lt;PB2);<br />         flag&#91;key&#93;=0;<br />   }<br />}<br />While(1)<br />   {<br />    klawisz(plus);<br />    klawisz(minus);<br />   }<br />}// main[/syntax]<br /><br />Jak rozumiem gdybym miał przyciski podłączone do portu 0 i 1 to tablice 'key_lock[8], flag[8];' mogłyby być dwuelementowe czyli 'key_lock[2], flag[2];' <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" /> Pytam bo nie mam jak sprawdzić bo akurat te porty mam zajęte przez LCD. Zresztą jak wstawię '2' to nie funkcja klawisz(...); nie działa prawidłowo.<br />Dzięki serdeczne jeszcze raz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> (szkoda, że nie ma emotki z piwem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> )<br />--------------- dodano-----------<br />Ale można zrobić w taki sposób:<br />[syntax=c]void klawisz(uint8_t key)<br />    {<br /> static uint8_t key_lock&#91;2&#93;, flag&#91;2&#93;;<br /><br /> if( !key_lock&#91;key-7&#93; &amp;&amp; !(PIND &amp; (1&lt;&lt;key))) //krotkie wcisniecie<br /> {<br /> key_lock&#91;key-7&#93;=2;<br /> PORTB ^=(1&lt;&lt;PB1);<br />flag&#91;key-7&#93;=1;<br />Tim3 = (1*2000)/10;<br />   }<br /><br /> else<br /><br />if(key_lock&#91;key-7&#93; &amp;&amp; (PIND &amp; (1&lt;&lt;key)))<br />{<br />key_lock&#91;key-7&#93;++;<br />  if( !key_lock&#91;key-7&#93; )<br /> {<br /> Tim3=0;<br /> flag&#91;key-7&#93;=0;<br />}<br />}<br /><br />else<br /><br />if( flag&#91;key-7&#93; &amp;&amp; !Tim3 ) //dlugie wcisniecie<br />  {<br />         PORTB ^=(1&lt;&lt;PB2);<br />         flag&#91;key-7&#93;=0;<br />   }<br />}[/syntax]<br /> <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=766">qutrit</a> — 10 wrz 2013, o 00:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-09-09T18:02:29+01:00</updated>
<published>2013-09-09T18:02:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48942#p48942</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48942#p48942"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48942#p48942"><![CDATA[
Jak sobie zaznaczysz PD6 i klikniesz prawym klawiszem to masz taką opcję jak Open Declaration (lub klawisz F3 w Eclipse), która pokaże co kryje się za tym symbolem:<br />[syntax=c]#define PORTD   _SFR_IO8(0x12)<br />#define PD0     0<br />#define PD1     1<br />#define PD2     2<br />#define PD3     3<br />#define PD4     4<br />#define PD5     5<br />#define PD6     6<br />#define PD7     7[/syntax]<br />Inny przykład. Poniższe 2 linie robią dokładnie to samo, chociaż druga jest błędna, ale tylko dlatego, że utrudnia analizę programu.<br />[syntax=c]PORTB ^=(1&lt;&lt;PB2); <br />PORTB ^=(1&lt;&lt;PA2);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 9 wrz 2013, o 18:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2013-09-09T08:00:13+01:00</updated>
<published>2013-09-09T08:00:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48881#p48881</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48881#p48881"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48881#p48881"><![CDATA[
Oczywiście, że tak zrobiłem jak kolega wyżej napisał, wszędzie pozmieniałem na key_lock[8], flag[8];. Tylko nijak nie wiem jak to ma działać, tzn. dlaczego to działa. Jak 'wartość portu' (zmienna key) indeksuje tablice, tzn. jak np PD6 przeliczane jest na zmienną key;, która występuje chociażby w key_lock[key] ??  <br />Nawet jak przyjmę:<br />[syntax=c]static uint8_t key_lock&#91;0&#93;, flag&#91;0&#93;;[/syntax] to też b. dobrze działają obydwa przyciski; chociaż tutaj jak kolega wspomniał może odgrywać rolę brak kontroli nad rozmiarem tablicy.<br />W sumie najważniejsze że działa, ale gdyby kolega coś więcej napisał, to byłoby super.<br />Dzięki.<br /><br />Aaaaa chyba zrozumiałem. Chodzi oto żeby najpierw gdzieś poza funkcją klawisz(uint8_t key) powołać jakąś funkcję która będzie mi zamieniała wciśnięty przycisk na odpowiednią cyfrę z przedziału 0-7 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> To znaczy odpowiednim portom od PD0 do PD7 przypisać cyfry od 0 do 7. I dopiero te cyfry używać jako zmienną 'key;' w funkcji klawisz();  <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" />  <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" />  <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" /> <br /><br />Natomiast samo przypisanie np. do PD0 cyfry 0 to chyba trzeba jakieś maskowanie zrobić ? <br />lub np. za pomocą funkcji typu:<br />[syntax=c]if(bit_is_clear(PIND, PD6)) key=6;// lub można przypisać dowolną wartość np. key =1;[/syntax].<br />Chyba że jest prostszy sposób  <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" />  <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" /> I wogóle czy dobrze rozumuję  <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" />  <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 9 wrz 2013, o 08:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-09-08T22:52:39+01:00</updated>
<published>2013-09-08T22:52:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48866#p48866</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48866#p48866"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48866#p48866"><![CDATA[
Jest źle i przypadkiem zadziałało  <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /> . Tak byłoby dobrze:<br />[syntax=c]void klawisz( uint8_t key)//key = {0...7} np. PD6<br />{<br />        static uint8_t key_lock&#91;8&#93;, flag&#91;8&#93;;<br /> <br />                if( !key_lock&#91;key&#93; &amp;&amp; !(PIND &amp; (1&lt;&lt;key))) //krotkie wcisniecie<br />                        {<br />                        key_lock&#91;key&#93;=20;<br />                        PORTB ^=(1&lt;&lt;PB1);<br />                        flag&#91;key&#93;=1;<br />                        Tim3 = (1*2000)/10;<br />                        }<br />//...[/syntax]<br />I wymaga to niestety jeszcze zmian w konfiguracji i zmiany zdefiniowanych symboli plus i minus.<br />W C nie ma kontroli nad przekroczeniem indeksu tablicy i można sobie zrobić w programie niezły bigos. W oparciu o adres tablicy były zmieniane komórki pamięci inne niż przynależne do tej zmiennej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 8 wrz 2013, o 22:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2013-09-08T21:30:21+01:00</updated>
<published>2013-09-08T21:30:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48840#p48840</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48840#p48840"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48840#p48840"><![CDATA[
Działa SUPER <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br />Nigdy bym na to nie wpadł. Szczerze mówiąc to za bardzo nie wiem , jak to działa.<br />Mamy zamiast zmiennych <br />[syntax=c]static uint8_t key_lock, flag;[/syntax]<br />tablice zmiennych<br />[syntax=c]static uint8_t key_lock&#91;8&#93;, flag&#91;8&#93;;[/syntax]<br />których argumentem jest w moim przypadku zmienna 'key'. I teraz jeżeli przycisk podłączony jest do PD6 czyli binarnie 0b01000000; to odpowiada to liczbie dziesiętnej chyba 64. No i tutaj już nie ogarniam <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":-(" title="Smutny" />..............<br />Mógłby kolega troszeczkę przybliżyć, co się z tym dzieje. Nawet gdy się przyjmie <br />[syntax=c]static uint8_t key_lock&#91;0&#93;, flag&#91;0&#93;;[/syntax]<br />to też pięknie działa <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=766">qutrit</a> — 8 wrz 2013, o 21:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-09-08T19:32:06+01:00</updated>
<published>2013-09-08T19:32:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48816#p48816</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48816#p48816"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48816#p48816"><![CDATA[
Twoja funkcja ma wspólne zmienne dla obu przycisków. Przeanalizuj sobie co się stanie jak jeden jest wciśnięty a drugi puszczony. Można temu zaradzić:<br />[syntax=c]static uint8_t key_lock&#91;8&#93;, flag&#91;8&#93;; //maksymalnie 8 przycisków na porcie[/syntax]<br />i używać w funkcji <br />[syntax=c]key_lock&#91;key&#93;<br />flag&#91;key&#93;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 8 wrz 2013, o 19:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2013-09-08T18:17:04+01:00</updated>
<published>2013-09-08T18:17:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48814#p48814</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48814#p48814"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=48814#p48814"><![CDATA[
Witam<br />Sprawa dotyczy przycisków, więc piszę tutaj <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> Mam funkcję obsługi przycisku i zdefiniowaną:<br />[syntax=c]void klawisz( uint8_t key)<br />{<br />static uint8_t key_lock, flag;<br /><br />if( !key_lock &amp;&amp; !(PIND &amp; (key))) //krotkie wcisniecie<br />{<br />key_lock=20;<br />PORTB ^=(1&lt;&lt;PB1);<br />flag=1;<br /> Tim3 = (1*2000)/10;<br />}<br /><br />else<br /><br />if(key_lock &amp;&amp; (PIND &amp; (key)))<br />{<br />key_lock++;<br />if( !key_lock )<br />        {<br />           Tim3=0;<br />flag=0;<br />}<br />}<br /><br />else<br /><br />if( flag &amp;&amp; !Tim3 ) //dlugie wcisniecie<br />  {<br />PORTB ^=(1&lt;&lt;PB2);<br />flag=0;<br />   }<br /><br />}[/syntax]<br />Jak widać krótkie wciśnięcie powoduje zmiane stanu diody przy porcie PB1, dłuższe wciśnięcie zmianę stanu diody na porcie PB2<br />Funkcja main()<br />[syntax=c]#define plus  (1&lt;&lt;PD7)<br />#define minus (1&lt;&lt;PD6<br /><br />PORTD|= plus|minus; //podciągnięcie do vcc<br />DDRB |= (1&lt;&lt;PB1)|(1&lt;&lt;PB2); //diody<br /><br />while(1)<br />{<br />klawisz(plus);<br />//_delay_ms(1);  <br />//klawisz(minus);<br />}[/syntax]<br />Gdy zakomentowana jest jedna to druga działa wyśmienicie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br />Gdy klawisz(plus) i klawisz(minus) są odkomentowane (_delay_ms(1);  zakomentowany) to nie działają - dioda przygasa tak jakby b.szybko migała. Po zwolnieniu przycisku ustala się stan przypadkowy.<br />Gdy _delay_ms(1); jest odkomentowany i klawisz(plus) i klawisz(minus) są odkomentowane to dioda PB1(gdy obojętnie który przycisk wciśnięty i trzymany) miga w sposób zauważalny ( na oko z częstotliwością 0,3Hz)???? Kombinuję z czasami i nic to nie pomaga.<br />Co może być przyczyną takiego zachowania ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 8 wrz 2013, o 18:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-15T11:10:41+01:00</updated>
<published>2013-04-15T11:10:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34349#p34349</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34349#p34349"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34349#p34349"><![CDATA[
ja bym się nie skupiał na tym że akurat działa dla key_lock=254 bo to może być czysty przypadek , musi działać tak samo dla key_lock=1 albo i key_lock=50000. I w tym kierunku bym to sprawdzał - bo jak może nie działać skoro poprzedni warunek (funkcja działa)<br /><br />ale zaraz zaraz co ty robisz ? no sam zobacz - skoro u ciebie przyciski to PD7, PD6 i PD5 to po jakiego grzyba w ogóle ustawiasz kierunki tych pinów i to jeszcze jako WYJŚCIA ??? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />DDRD |= 0b11100000;<br /><br />ja proponuję może wklejaj to co masz w kodzie i co testujesz a nie pisz z pamięci <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo wtedy to ciężko się dogadać ....<br /><br />skasuj tą linię w ogóle - (o ile ją masz) .... przecież po resecie o tak te piny klawiszy są wejściami a na drugi raz jak chcesz uniknąć takich MEGA CZESKICH błędów - to jednak postaraj się działać z techniką dobrego programowania czyli tak<br /><br />PORTD |= enter|minus|plus;<br /><br />albo <br /><br />PORTD |= (1&lt;&lt;PD7)|(1&lt;&lt;PD6)|(1&lt;&lt;PD5);<br /><br />albo<br /><br />DDRD &amp;= ~( (1&lt;&lt;PD7)|(1&lt;&lt;PD6)|(1&lt;&lt;PD5) );<br /><br />a nie jakieś tam<br /><br />DDRD |= 0b11100000;<br /><br />to sam zaczniesz popełniać mniej błędów<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 15 kwi 2013, o 11:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2013-04-15T11:10:48+01:00</updated>
<published>2013-04-15T10:55:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34348#p34348</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34348#p34348"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34348#p34348"><![CDATA[
Dzięki za wyczerpującą odpowiedź. Nie mniej jednak nie mogę sobie poradzić z tym problemem, próbuje na wszystkie strony i nic. <br />Co do main()<strong>;</strong>, <strong>W</strong>hile(1), tak pisałem z pamięci (w pracy ), stąd te błędy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Co do problemu:<br />Przycisk mam podłączony do nóżki procesora i masy układu. <br />[syntax=c]// plik main()<br />#include &quot;przyciski.h&quot;<br /><br />#define enter (1&lt;&lt;PD5) //enter<br />#define minus (1&lt;&lt;PD6) // &lt;-<br />#define plus (1&lt;&lt;PD7) // -&gt;<br /><br />uint8_t  d=3;<br /><br />int main(void)<br />{<br /><br />/*** PRZYCISKI na porcie D ***/<br />DDRD |= 0b11100000;<br />PORTD |=0b11100000;<br /><br />while(1)<br />{<br />klawisz_D(plus, &amp;d); // chce przerobic na taka obsluge przycisku<br /><br />/*                         Poprzednia warunek obslugi przycisku _ działała poprawnie <br />if(klawisz_D(plus))<br />{<br />d++;<br />}<br />*/<br />}[/syntax]<br />Plik przyciski.c<br />[syntax=c]#include &quot;przyciski.h&quot;<br /><br />void klawisz_D(uint8_t key, uint8_t * w)     // chce przerobic na taka obsluge przycisku<br />{<br />static uint8_t key_lock;<br /><br />if(!key_lock &amp;&amp; !(PIND &amp; key))<br />{<br />key_lock=1;<br />(*w)++;<br />}<br />else<br />{<br />if(key_lock &amp;&amp; (PIND &amp; key)) key_lock++;<br />}<br /><br />}<br /><br />/*  Poprzednia funkcja do obslugi przycisku - działała poprawnie<br />uint8_t klawisz_D(uint8_t key)<br />{<br />if(!(PIND &amp; key))<br />{<br />if(!(PIND &amp; key))<br />return 1;<br />}<br />return 0;<br />}<br />*/[/syntax]<br />Plik przysiski.h<br />[syntax=c]#ifndef PRZYCISKI_H_<br />#define PRZYCISKI_H_<br /><br />        uint8_t klawisz_D(uint8_t key); //poprzednia deklaracja funkcji<br />void klawisz_D(volatile uint8_t key, uint8_t * d); <br /><br />#endif /* PRZYCISKI_H_ */[/syntax]<br />W while(1) nie ma nic więcej oprócz obsługi przycisku i LCD. Układ (jak jest to zakomentowane) działa poprawnie dla poprzedniej wersji obsługi przycisku.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />za to ten przykład na końcu gdzie dałeś key_lock=254; to szok - to by oznaczało jednak że nie zrozumiałeś jak działa ten przykład <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> ... przecież w tym przypadku W OGÓLE ale to w NAJMNIEJSZYM stopniu nie reagujesz na DRGANIA STYKÓW przecież. Więc ten ostatni przykład gdzie niby zrozumiałeś - to jednak jest najgorszy.<br /></div><br />Tak też myślę, bo to są zaledwie 2 takty procesora do przepełnienia. Tylko jak to pogodzić z faktem, że dla key_lock=254; układ działa. Zmienna d się zwiększa.<br /><br />A najgorsze jest to, że okaże się, że to jakaś pierdółka jest źle zadeklarowana (np. nie w ty miejscu co potrzeba). Ale tak to jest, że jak się patrzy cały czas na swój kod, to ciężko dostrzec błąd.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 15 kwi 2013, o 10:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-14T08:07:47+01:00</updated>
<published>2013-04-14T08:07:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34259#p34259</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34259#p34259"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34259#p34259"><![CDATA[
dobra ok, powiem tak - twój kod z pierwszego postu MUSI działać i działa <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> mój błąd, że jakoś za szybko rzuciłem okiem na tą twoją funkcję okiem nie zwracając uwagi na zdefiniowaną w niej zmienną automatyczną <br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">uint8_t n=0;</div><br /><br />ja po prostu raczej pisałem to z myślą o ew użyciu wskaźników do funkcji (callbacku) w takiej twojej funkcji klawisz() i dlatego przy nie zwróceniu uwagi na to n=0 albo może wydało mi się że to też jest u ciebie static (wtedy także by nie działała twoja funkcja),  pomyślałem że całkiem coś pokiełbasiłeś - no ale teraz przyjrzałem się temu z rana na świeżo i widzę, że nie .... twoja funkcja z pierwszego postu NORMALNIE DZIAŁA tylko ty masz problem gdzieś indziej....<br /><br />najbardziej zdziwiło mnie twoje pytanie:<br /><br /><div class="quotetitle">qutrit napisał(a):</div><div class="quotecontent"><br />Poza tym dlaczego w warunku if(klawisz(plus)) nie mogę wstawić średnika za funkcją bo wyskakuje błąd ?<br /></div><br /><br />tzn jak chciałeś to wpisać u siebie tak ????????<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />if( klawisz(plus)<strong><span style="color: #FF0000">;</span></strong> )<br /></div><br /><br />no coś ty ? a co to miałoby znaczyć ? no sam spójrz przecież kompilator słusznie krzyczy że to błąd. Przecież średnik jest po to aby zakończyć linię a ty chcesz go w środku warunku IF dać ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />ale ok .... teraz skupmy się (cały czas trzymając się twojego pierwszego postu) nad tym dlaczego tobie ta twoja własna funkcja klawisz() nie działa a u mnie i teoretycznie i praktycznie działa. Powodów może być kilka, ale lepiej by było gdybyś pokazał większy kawałek tamtego twojego kodu - bo mogę tylko przypuszczać, że:<br /><br />1. nie dałeś podciągnięcia programowego ani zewnętrznego linii klawisza do VCC, czyli zakładając że u ciebie &quot;plus&quot; to było np:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">#define plus (1&lt;&lt;PC7)</div><br /><br />to nie zrobiłeś w kodzie np:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">PORTC |= plus; // podciągamy linię klawisza do VCC</div><br /><br />wtedy mógł się warunek albo cały czas spełniać albo działać w kratkę bo na wejściu był pływający stan HiZ<br /><br />być może też masz switcha z jakimś strasznie długimi drganiami albo zepsutego wręcz, i powinieneś był wydłużyć ten czas key_lock zgodnie z opisem na blogu, tyle że też nie powinna ci się wciąż zwiększać zmienna d++ chyba że się tak uparłeś na ten średnik po IF że w rzeczywistości swój kod napisałeś wtedy nieco inaczej niż pokazałeś czyli tak:<br /><br />[syntax=c]While(1)<br />{<br />if(klawisz(plus));  // &lt;--- tu dałeś jednak średnik na siłę<br />d++;<br />}[/syntax]<br /><br />a widać, że kodu tutaj raczej nie kopiowałeś i wklejałeś tylko pisałeś z ręki (tak mi się wydaje) bo napisałeś While zamiast while a tego by ci kompilator też nie przepuścił <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />więc generalnie w całym kodzie mogłeś zrobić jeszcze więcej błędów <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />-------------------------------------<br /><br />No i teraz dalej - bierzemy się za twój drugi post i PIERWSZY przykład - jeśli to jest cały kod main.c<br /><br />[syntax=c]#include przycisk.h<br />main();<br />{<br />  uint8_t  wsk=3;<br />  while(1)<br />  {<br />   klawisz_D(plus, &amp;wsk);<br />  }<br />}[/syntax]<br /><br />tak nawiasem powiedz mi w czym ty piszesz swoje kody źródłowe ??? przypadkiem nie w AVR Studio dzięki któremu nie widzisz połowy warningów i błędów ??? bo wystarczy spojrzeć na twój kod na górze:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />main()<strong><span style="color: #FF0000">;</span></strong><br />{<br />   ....<br /></div><br /><br />średnik w linii z main() ???? a gdzie w ogóle int main(void) { ....<br /><br />ale ok pisz jak chcesz i w czym chcesz - w każdym bądź razie ten pierwszy przykład z drugiego postu tak samo MUSI działa tylko nie u ciebie bo co ? bo tu już WYRAŹNIE w main.c przynajmniej widać że nie masz podciągnięcia programowego linii klawisza do VCC. No chyba że fizycznie masz tam gdzieś w swoim układzie rezystorami zewnętrznymi podciągniętą tą linię klawisza ????<br /><br />W każdym bądź razie - pamiętaj - OBA TE przypadki twoje (u ciebie rzekomo nie działające) nie tylko MUSZĄ działać teoretycznie (czyli dobrze sobie to wymyśliłeś) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to jeszcze działają praktycznie bo sam sprawdziłem na swoim podręcznym zestawie ATB - mam teraz z rańca chwilkę czasu.<br /><br />------------------------------<br /><br />za to ten przykład na końcu gdzie dałeś key_lock=254; to szok - to by oznaczało jednak że nie zrozumiałeś jak działa ten przykład <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> ... przecież w tym przypadku W OGÓLE ale to w NAJMNIEJSZYM stopniu nie reagujesz na DRGANIA STYKÓW przecież. Więc ten ostatni przykład gdzie niby zrozumiałeś - to jednak jest najgorszy.<br /><br />uuuff ale się rozpisałem - sprawdź sobie dwa pierwsze tak jak opisałem i wszystko będzie ci działać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i jeśli piszesz w AVR Studio to szybko zamień to na Eclipse <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 14 kwi 2013, o 08:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2013-04-13T21:09:11+01:00</updated>
<published>2013-04-13T21:09:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34253#p34253</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34253#p34253"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34253#p34253"><![CDATA[
Jakiejś strasznej filozofii w tym nie ma do zrozumienia, chyba, że diabeł tkwi w szczegółach. Po prostu zamiast wskaźnika na funkcję wstawiłem inkrementację wskaźnika i mimo to nie działa <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />  Wartość wskaźnika po naciśnięciu przycisku wzrasta tylko o jeden i później nie ma już reakcji na wciśnięcie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> Może jakaś mała podpowiedź ?<br /><br />[syntax=c]przycisk.c<br />klawisz_D(uint8_t key, uint8_t * w)<br />{<br />static uint16_t key_lock;<br /><br />if(!key_lock &amp;&amp; !(PIND&amp;key))<br />{<br />key_lock=50000;<br /><br />(*w)++;  //reakcja na PRESS<br />}<br />else<br />{<br />if(key_lock &amp;&amp; (PIND &amp; key)) key_lock++;<br />}<br />}[/syntax] <br /><br />[syntax=c]#include przycisk.h<br />main();<br />{<br />  uint8_t  wsk=3;<br />  while(1)<br />  {<br />   klawisz_D(plus, &amp;wsk);<br />  }<br />}[/syntax]<br /><br />------------------------------------------------------------<br />Ok rozumiem (chyba). key_lock=xxx; trzeba dobrać doświadczalnie, bo jeżeli dobierze się zbyt nisko, to po zwolnieniu przycisku ( i ewentualnych drganiach) może ona nie osiągnąć wartości 0 w drugim warunku. <br />Zmieniłem teraz na:<br />[syntax=c]klawisz_D(uint8_t key, uint8_t * w)<br />{<br />static uint8_t key_lock;<br /><br />if(!key_lock &amp;&amp; !(PIND &amp; key))<br /><br />{<br />key_lock=254;<br />(*w)++;<br />}<br /><br />else<br />{<br />if(key_lock &amp;&amp; (PIND &amp; key)) key_lock++;<br />}<br />}[/syntax]<br />i działa. Ale gdy wstawię np. key_lock=240; to działa za 3-4 razem. Im niższy key_lock to działa gorzej. Mam nadzieję, że oto chodziło <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=766">qutrit</a> — 13 kwi 2013, o 21:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-12T10:51:36+01:00</updated>
<published>2013-04-12T10:51:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34155#p34155</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34155#p34155"/>
<title type="html"><![CDATA[Re: Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34155#p34155"><![CDATA[
Przede wszystkim widać, że na razie w ogóle ale to w ogóle nie zrozumiałeś jak działa taki IF (ten sposób z bloga) do obsługi klawisza, który nieumiejętnie przeniosłeś sobie do swojej funkcji klawisz() <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> Proponuję żebyś NAJPIERW postarał się dokładnie zrozumieć jak to działa<br /><br />[syntax=c]if( !key_lock &amp;&amp; !(PINC &amp; KEY1 ) ) {<br />  key_lock=1;<br /> <br />  // reakcja na PRESS (wcinięcie przycisku)<br />  PORTC ^= LED;<br /> <br /> } else if( key_lock &amp;&amp; (PINC &amp; KEY1 ) ) key_lock++;[/syntax]<br /><br />a później obejrzeć sobie na tym samym blogu, w tym samym artykule tylko że dalej w jaki sposób można sobie wyprowadzić do funkcji <br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">key_press()</div><br /><br />taką obsługę - bo przecież też masz przykład .... dlaczego nie przeczytałeś całości ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 kwi 2013, o 10:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[qutrit]]></name></author>
<updated>2013-04-12T10:04:42+01:00</updated>
<published>2013-04-12T10:04:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34151#p34151</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34151#p34151"/>
<title type="html"><![CDATA[Przycisk nie działa tak jak powinien.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2851&amp;p=34151#p34151"><![CDATA[
Witam. Stworzyłem sobie funkcję do obsługi klawisza opierając się na blogu. Pomijam tutaj wszystkie nagłówki itd. ponieważ dla innej obsługi klawisz (z delay'ami) program działa poprawnie. <br /><br />[syntax=c]uint8_t klawisz (uint8_t key)<br />{<br />static uint16_t key_lock;<br />uint8_t n=0;<br /><br />if( !key_lock &amp;&amp; !(PINC &amp; key ) ) <br />  {<br />  key_lock=40000;<br />  n=1;<br />  } <br />   else if( key_lock &amp;&amp; (PINC &amp; key ) ) key_lock++;<br /><br />return n;<br /><br />}[/syntax]<br /><br />Następnie w pętli w main.c mam<br /><br />[syntax=c]While(1)<br />{<br />if(klawisz(plus))<br />d++;<br />}[/syntax]<br />Problem w tym, że jak raz nacisnę przycisk to d zaczyna rosnąć, nawet wtedy gdy zwolnię klawisz (widzę to na LCD). Oznacza to że warunek if(klawisz(plus)) po naciśnięciu i zwolnieniu jest cały czas spełniany. Dlaczego ??? Przecież jak zwolnię klawisz to if( !key_lock &amp;&amp; !(PINC &amp; KEY1 ) ) nie powinien być spełniony a tym samym n powinno przyjąć wartość n=0; i tym samym zwrócić 0. Proszę o wyjaśnienie gdzie źle rozumuję albo co źle zrobiłem.<br />Poza tym dlaczego w warunku if(klawisz(plus)) nie mogę wstawić średnika za funkcją bo wyskakuje błąd ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=766">qutrit</a> — 12 kwi 2013, o 10:04</p><hr />
]]></content>
</entry>
</feed>