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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-15T17:06:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=144&amp;mode</id>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-15T17:06:49+01:00</updated>
<published>2015-05-15T17:06:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129230#p129230</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129230#p129230"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129230#p129230"><![CDATA[
<div class="quotetitle">jerrylu napisał(a):</div><div class="quotecontent"><br />Pozostaje obsługa przytrzymania przycisku jak napisałem.<br />Ja w tym wątku nie mam już nic do dodania.<br /></div><br />Oj tam - jesteś świetnym obserwatorem i dokumentalistą.<br />Kol. kamer uzyskał świetny pseudo random generator, a nie było to Jego zamiarem. Ty podpowiadasz, że ma wyjść z wartością 0 gdy przycisk ciągle wduszony, wtedy nie będzie &quot;liczba&quot; się zmieniać - mówię i ja.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 15 maja 2015, o 17:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-15T15:46:08+01:00</updated>
<published>2015-05-15T15:46:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129227#p129227</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129227#p129227"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129227#p129227"><![CDATA[
No właśnie chyba się nie zrozumieliśmy. Proszę o wybaczenie.<br />A błąd Koledze kamer wskazałem 2 razy - wczoraj bez rozwinięcia, dzisiaj z rozwinięciem - godz. 08:57<br />Co więcej sprawdziłem, że na 16MHz pętla z inkrementacją przepełniającą key_lock trwa ok. 22ms.<br />Czyli bez dodatkowych zmiennych i sprawdzania warunków w jej obiegu (jak wspomniałem powyżej) nie ma siły, <br />żeby nie poleciał ciąg kolejnych cyfr na plus, bądź na minus w zależności od klawisza. <br />W końcu to tylko 1/50 sekundy i warunek ponownie jest spełniony do inkrementacji/dekrementacji licznika.<br />Delay aż 200ms w pierwszym warunku funkcji pozwala spokojnie zwiększać i zmniejszać licznik ale tylko przy krótkich naciśnięciach.<br />Ale to tylko rozwiązanie dla pokazania, że podstawowa funkcjonalność programu jest zachowana.<br />Pozostaje obsługa przytrzymania przycisku jak napisałem.<br />Ja w tym wątku nie mam już nic do dodania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 15 maja 2015, o 15:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-15T10:43:10+01:00</updated>
<published>2015-05-15T10:43:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129215#p129215</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129215#p129215"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129215#p129215"><![CDATA[
Chyba się nie zrozumieliśmy. Zainteresowany nie chce Twojego gotowca. Chce dojść do błędu - którego nie wskazałeś.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 15 maja 2015, o 10:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-15T10:25:31+01:00</updated>
<published>2015-05-15T10:25:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129214#p129214</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129214#p129214"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129214#p129214"><![CDATA[
Przecież zwracało prawdę i była inkrementacja/dekrementacja przy wciśnieciu klawisza - poprawne działanie.<br />Problemem było to, że przy dłuższym przytrzymaniu przycisku szła seria tych inkrementacji/dekrementacji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 15 maja 2015, o 10:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-15T10:05:35+01:00</updated>
<published>2015-05-15T10:05:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129213#p129213</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129213#p129213"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129213#p129213"><![CDATA[
<div class="quotetitle">jerrylu napisał(a):</div><div class="quotecontent"><br />Z uporem szukasz dziury w działających poprawnie fragmentach kodu kolegi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /> <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  Na pewno to widzisz? - Ta funkcja  ( klawisz_wcisniety( KEY1_PIN) ) ma zwrócić prawdę, by wykonało się &quot;liczba+=1&quot;<br />A tak nie było  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 15 maja 2015, o 10:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-15T09:42:01+01:00</updated>
<published>2015-05-15T09:42:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129212#p129212</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129212#p129212"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129212#p129212"><![CDATA[
&quot;klawisz_wcisniety&quot; to funkcja, do funkcji jest przekazywany klawisz jako parametr. Dopiero w funkcji sprawdzany jest jego stan.<br />Z uporem szukasz dziury w działających poprawnie fragmentach kodu kolegi <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=8719">jerrylu</a> — 15 maja 2015, o 09:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-15T09:30:31+01:00</updated>
<published>2015-05-15T09:30:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129211#p129211</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129211#p129211"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129211#p129211"><![CDATA[
<div class="quotetitle">kamer napisał(a):</div><div class="quotecontent"><br />Ale nadal nie rozumiem dlaczego mój prosty kod nie działał. Coś musiało być nie tak skoro teraz działa.<br />pozdrawiam<br />Łukasz<br /></div><br />Popatrzmy na funkcje:<br />[syntax=c]if( klawisz_wcisniety( KEY1_PIN) ) liczba+=1;                   //sprawdzenie czy klawisz 1 wciśnięty[/syntax] <br />Funkcja if wykona się, gdy argument jest prawdą - i tak jest - PRAWDA = ( klawisz_wcisniety( KEY1_PIN) ), a powinna być FALSE (klawisz puszczony).<br /> Sprawdź taką drobnostkę - ( klawisz_wcisniety(~ KEY1_PIN) ) lub (~ klawisz_wcisniety( KEY1_PIN) ).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 15 maja 2015, o 09:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-15T08:57:17+01:00</updated>
<published>2015-05-15T08:57:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129210#p129210</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129210#p129210"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129210#p129210"><![CDATA[
Tak jak pisałem, nie zdajesz sobie sprawy z szybkości pętli.<br />Pętla while + inkrementacja key_lock do 255 i zmiana na zero wykręca się b. szybko - 20ms?<br />I masz znowu spełniony pierwszy warunek w funkcji, która zwraca Ci 1 i zwieksza/zmniejsza licznik wyświetlacza.<br />20ms to 1/50 sekundy, czyli już b. krótkie nacisnieęie zmieni licznik o 1. Dłuższe o serię następnych.<br />Przytrzymaj przycisk przez 10 sekund. Zobacz ile Ci nabije licznik.<br />Podziel 10sek przez to co nastukało ci na liczniku i masz czas obiegu pętli z przepełnieniem key_lock.<br /><br />Pozdrówka!<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />Dałoby się obsłużyć tą sytuację w Twojej prostej funkcji, ale wprowadzając kolejne zmienne.<br />Zmienna na przepełnienie licznika + zmienna zmiany stanu klawisza.<br />Jeśli nastąpiło przepełnienie key_lock bez zmiany stanu klawisza (klawisz cięgle wciśnięty) - zwróć zero.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 15 maja 2015, o 08:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamer]]></name></author>
<updated>2015-05-15T06:19:13+01:00</updated>
<published>2015-05-15T06:19:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129205#p129205</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129205#p129205"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129205#p129205"><![CDATA[
Podciągnięcie do 5V:<br /><br />[syntax=c]KEY_DIR &amp;= ~(KEY1_PIN | KEY2_PIN);//piny są wyjściowe<br />KEY_PORT |= KEY1_PIN | KEY2_PIN;//podciągnięte do 5V[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 12 minutach ]</span></strong><br /><br />jerrylu:<br />Sprawdziłem kod od Ciebie - działa jak należy <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Zmieniłem jedynie funkcję obsługi drugiego przycisku tak by też działał przy wciśnięciu a nie zwolnieniu. Dzięki wielkie za pomoc i poświęcony czas.<br /><br />Ale nadal nie rozumiem dlaczego mój prosty kod nie działał. Coś musiało być nie tak skoro teraz działa.<br /><br />pozdrawiam<br />Łukasz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9883">kamer</a> — 15 maja 2015, o 06:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-15T06:14:28+01:00</updated>
<published>2015-05-15T06:14:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129204#p129204</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129204#p129204"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129204#p129204"><![CDATA[
<div class="quotetitle">kamer napisał(a):</div><div class="quotecontent"><br />Przyciski, tak jak kolega wspomniał, są zadeklarowane w pliku d_led.h i działają poprawnie.<br />Wydaje mi się że wszystko rozumiem z tego kodu i że powinno działać ok, a tak nie jest.<br /></div><br />Hmm. Deklaracje są, reset ustawia wejścia, a podciąganie wejść jak rozwiązałeś?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 15 maja 2015, o 06:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-14T23:43:48+01:00</updated>
<published>2015-05-14T23:43:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129201#p129201</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129201#p129201"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129201#p129201"><![CDATA[
Zapodaję Ci przetestowany kod nieblokującej obsługi klawiszy pod Twój przykład na bazie kodu MK:<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2010-03-30<br /> *       Autor: Mirosław Kardaś<br /> *       modified by jerrylu for kamer<br /> */<br />#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego (obsługa LED)<br /><br /><br />#define KEY1 (1&lt;&lt;PD0)<br />#define KEY2 (1&lt;&lt;PD1)<br /><br />void licz_inc(void);<br />void licz_dec(void);<br />uint8_t key1_lock, key2_lock;<br /><br />uint16_t liczba=2015;                //deklaracja zmiennej liczba<br /><br />void licz_inc(void) {<br /> liczba++;<br />}<br /><br />void licz_dec(void) {<br /> liczba--;<br />}<br /><br />void key_press( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br />void key_push_up( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br /><br /><br />//**************** OBSŁUGA DWÓCH KLAWISZY za pomocą 2 funkcji<br /><br />int main(void) {<br /><br /> PORTD |= KEY1|KEY2;  // podciągamy linie klawiszy do VCC<br /> d_led_init();           //inicjalizacja wyświetlacza<br /> _delay_ms(10);<br /><br /> sei();<br /><br /> while(1) {<br /><br />  key_press( &amp;key1_lock, &amp;PIND, KEY1, licz_inc );<br /><br />  key_push_up( &amp;key2_lock, &amp;PIND, KEY2, licz_dec );<br /><br />  if(liczba&gt;9999) liczba=9999;                                            //zabezpieczenie przed przekroczeniem zakresu wyświetlacza<br />  if(liczba&lt;0) liczba=0;                                                  //zabezpieczenie przed przekroczeniem zakresu wyświetlacza<br />  cy1=liczba/1000;                                                                //obliczenie pierwszej cyfry do wyświetlenia<br />  cy2=(liczba-1000*cy1)/100;                                              //obliczenie drugiej cyfry do wyświetlenia<br />  cy3=(liczba-1000*cy1-100*cy2)/10;                               //obliczenie trzeciej cyfry do wyświetlenia<br />  cy4=(liczba-1000*cy1-100*cy2-10*cy3);<br />  }<br />}<br /><br />void key_press(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) {<br />  *klock=1;<br /><br />  // reakcja na PRESS (wcinięcie przycisku)<br />  if(kfun) kfun();<br /><br /> } else if( *klock &amp;&amp; key_press ) (*klock)++;<br />}<br /><br /><br />void key_push_up(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) *klock=1;<br /> else if( *klock &amp;&amp; key_press ) {<br />  if( !++*klock ) {<br /><br />   // reakcja na PUSH_UP (zwolnienie przycisku)<br />   if(kfun) kfun();<br />  }<br /> }<br />}[/syntax] <br /><br />Uwaga na inne piny - u mnie PD0 i PD1 - zmieniasz na swoje.<br />PORTD i PIND zmieniasz na PORTC i PINC.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 14 maja 2015, o 23:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-14T21:32:20+01:00</updated>
<published>2015-05-14T21:32:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129197#p129197</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129197#p129197"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129197#p129197"><![CDATA[
Masz Bluebooka, że tak zapytam?<br />Jak go masz, to masz i biblioteki, możesz zrobić obsługę nieblokującą przycisków wg Mirka.<br />Jeśli nie, to pozostaje Ci na początek standardowa obsługa &quot;drgań styków&quot; na delay-ach.<br />Możesz oczywiście znależć bez problemu przykłady w sieci nieblokującej obsługi przycisków na timerach i przerwaniach.<br />Nie ma siły, aby zrobić nieblokującą obsługę bez tych drugich - oprócz koncepcji Mirka z przekazywaniem zewnętrznych funkcji do funkcji obsługi klawisza:<br />[syntax=c]key_press( &amp;key1_lock, &amp;PINC, KEY1, change_led1 );[/syntax]<br />Drugie pytanie, dalej nie rozumiesz, dlaczego zmienia Ci się licznik o ileś tam cyfr przy przytrzymaniu przycisku?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 27 minutach ]</span></strong><br /><br />Ponieważ multipleksujesz wyswietlacze wstaw sobie tam swoją funkcję i będzie ok zapewne (jak jest wystarczająco często odpalane przerwanie).<br />Oczywiscie musisz dać deklarację volatile dla funkcji i zmiennych tam wykorzystywanych.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 14 maja 2015, o 21:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamer]]></name></author>
<updated>2015-05-14T20:38:49+01:00</updated>
<published>2015-05-14T20:38:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129193#p129193</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129193#p129193"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129193#p129193"><![CDATA[
Przyciski, tak jak kolega wspomniał, są zadeklarowane w pliku d_led.h i działają poprawnie.<br /><br />[syntax=c]#define KEY1_PIN (1&lt;&lt;PC7)<br />#defineKEY2_PIN (1&lt;&lt;PC6)<br />#defineKEY_PORT PORTC<br />#defineKEY_DIR DDRC[/syntax]<br /><br />Co do opóźnień to nie widzę sensu ich użycia - one jedynie opóźnią narastanie/opadanie licznika a nie o to chodzi. Chciałbym żeby przycisk wciśnięty i trzymany powodował tylko jedną zmianę licznika. <br />Wydaje mi się że wszystko rozumiem z tego kodu i że powinno działać ok, a tak nie jest.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9883">kamer</a> — 14 maja 2015, o 20:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-14T19:48:27+01:00</updated>
<published>2015-05-14T19:48:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129185#p129185</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129185#p129185"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129185#p129185"><![CDATA[
Przecież przyciski działają, jak Kolega napisał. Definicja pewnie w d_led.h.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 14 maja 2015, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-14T18:14:54+01:00</updated>
<published>2015-05-14T18:14:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129176#p129176</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129176#p129176"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129176#p129176"><![CDATA[
<div class="quotetitle">kamer napisał(a):</div><div class="quotecontent"><br />Zwracam 0 tak długo aż licznik key-lock przepełni rozmiar zmiennej czyli 255. Dopiero wtedy key_lock jest 0 i sprawdzany jest przycisk w pierwszym warunku if funkcji.<br /></div><br />A pro po - na którym pinie i jakiego portu masz KEY1_PIN bo nie widzę definicji klawiszy - czy to kompiluje się?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 14 maja 2015, o 18:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-14T17:43:31+01:00</updated>
<published>2015-05-14T17:43:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129175#p129175</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129175#p129175"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129175#p129175"><![CDATA[
Chyba nie zdajesz sobie sprawy z szybkości tych pętli.<br />Dlatego przy wyzerowaniu masz znowu zwróconą jedynkę i inkrementację/decrementację licznika przy cały czas wciśniętym przycisku.<br />Daj sobie delay w głównej,  to zobaczysz zmianę<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 14 maja 2015, o 17:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamer]]></name></author>
<updated>2015-05-14T17:26:10+01:00</updated>
<published>2015-05-14T17:26:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129173#p129173</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129173#p129173"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129173#p129173"><![CDATA[
Zwracam 0 tak długo aż licznik key-lock przepełni rozmiar zmiennej czyli 255. Dopiero wtedy key_lock jest 0 i sprawdzany jest przycisk w pierwszym warunku if funkcji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9883">kamer</a> — 14 maja 2015, o 17:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-14T17:13:53+01:00</updated>
<published>2015-05-14T17:13:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129167#p129167</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129167#p129167"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129167#p129167"><![CDATA[
Masz racje, brak wykrzyknika. <br />Jednak praca nie jest dobrym miejscem do takich analiz. Potrzeba spokoju.<br />Zwróć uwagę, że zwracanie 0 przez funkcje nic nie zmienia w Twoim programie.<br />W kolejnym obiegu masz znowu zwracaną jedynkę.  Itd - 0/1/0/1<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 14 maja 2015, o 17:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamer]]></name></author>
<updated>2015-05-14T17:00:02+01:00</updated>
<published>2015-05-14T17:00:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129163#p129163</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129163#p129163"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129163#p129163"><![CDATA[
Żeby drugi warunek był spełniony i licznik key-lock był inkrementowany musi być też zwolniony przycisk ( key_lock &amp;&amp; (PINC &amp; klawisz ) ).<br />Wydaje mi się, że powinno to działać na jednej zmiennej, zakładając że w jednej chwili naciskam tylko jeden przycisk.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9883">kamer</a> — 14 maja 2015, o 17:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-14T16:34:42+01:00</updated>
<published>2015-05-14T16:34:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129160#p129160</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129160#p129160"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129160#p129160"><![CDATA[
Sorry odnośnie deklaracji, jest ona u Ciebie też poza ciałem funkcji, ale tak wrzucona, że moje stare oczy to przegapiły.<br />Powinna być dla porządku na górze programu.<br />Niestety jestem w pracy i rzucam tylko w wolnej chwili okiem na Twój kod.<br />Zaraz się przyjrzę dokładniej.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 10 minutach ]</span></strong><br /><br />Ale jak key_lock = 1<br />to zawsze masz spełniony drugi warunek i zawsze masz dekrementację licznika i inkrementację key_lock<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 16 minutach ]</span></strong><br /><br />Raczej musisz pójść drogą dwóch zmiennych dla obydwu klawiszy - modyfikacja kodu Mirka:<br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html" >http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 14 maja 2015, o 16:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamer]]></name></author>
<updated>2015-05-14T16:03:45+01:00</updated>
<published>2015-05-14T16:03:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129156#p129156</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129156#p129156"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129156#p129156"><![CDATA[
Ale dlaczego program zwraca mi 1 gdy przycisk jest wciśnięty a zmienna key_lock jest różna od 0? <br />W takim wypadku program nie powinien wejść do pętli if( !key_lock &amp;&amp; !(PINC &amp; klawisz)) a powinien zwracać 0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9883">kamer</a> — 14 maja 2015, o 16:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-14T15:43:12+01:00</updated>
<published>2015-05-14T15:43:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129153#p129153</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129153#p129153"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129153#p129153"><![CDATA[
Ależ wręcz przeciwnie.<br />Program zauważa, że masz wciśnięty przycisk cały czas, <br />a ponieważ wywołuje ciągle w pętli funkcję sprawdzania klawisza - &quot;klawisz_wcisniety&quot;,<br />ciągle zwraca też 1, co powoduje inkrementację licznika.<br />Nie wykorzystujesz wcale zmiennej key_lock, tak w ogóle, jeśli chcesz z niej korzystać w funkcji main i klawisz_wcisniety,<br />zadeklaruj ją przed main.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Przy zmniejszaniu podobnie, dostajesz ciągle 0 i dekrementujesz z szybkoscią obiegu pętli while.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 14 maja 2015, o 15:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamer]]></name></author>
<updated>2015-05-14T14:39:08+01:00</updated>
<published>2015-05-14T14:39:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129143#p129143</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129143#p129143"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=129143#p129143"><![CDATA[
Cześć wszystkim, <br />Jestem początkujący jeżeli chodzi o programowanie, więc proszę o wyrozumiałość:)<br />Modyfikuję właśnie program dotyczący obsługi wyświetlacza 7segmentowego z BB. Dopisałem funkcję która obsługuje dwa przyciski i w zależności od ich stanu zwiększa lub zmniejsza wyświetlaną liczbę. <br />Napotkałem problem przy obsłudze przycisku - program nie zauważa, że przycisk jest ciągle wciśnięty i zmienia mi wartość liczby o wiele więcej niż o 1 podczas jednego naciśnięcia. <br />Do zabezpieczenia funkcji użyłem fragmentu kogu z artykułu Pana Mirka o obsłudze klawiszy, ale widocznie nie zrozumiałem czegoś do końca bo ciągle występuję ten błąd.<br />Kod poniżej: <br /><br />[syntax=c]* main.c<br /> *<br /> *  Created on: 13 maj 2015<br /> *      Author: Luk<br /> */<br /><br />#include &lt;avr/io.h&gt;//biblioteka systemowa avr<br />#include &lt;util/delay.h&gt;//biblioteka opóźnień<br />#include &lt;avr/interrupt.h&gt;//biblioteka przerwań<br /><br />#include &quot;d_led.h&quot;//załącznie pliku nagłówkowego obsługi led<br /><br />uint8_t klawisz_wcisniety(uint8_t klawisz);//deklaracja funkcji sprawdzającej przycisk<br /><br /><br />int main(void){<br /><br />d_led_init();        //inicjalizacja wyświetlacza<br /><br />uint16_t liczba;//deklaracja zmiennej liczba<br />liczba=2015;  //wartość początkowa zmiennej liczba<br /><br />sei(); //globalne załączenie przerwań<br /><br />while(1){<br /><br />if( klawisz_wcisniety( KEY1_PIN) ) liczba+=1;        //sprawdzenie czy klawisz 1 wciśnięty<br />if( klawisz_wcisniety( KEY2_PIN) ) liczba-=1;        //sprawdzenie czy klawisz 2 wciśnięty<br />if(liczba&gt;9999) liczba=9999;//zabezpieczenie przed przekroczeniem zakresu wyświetlacza<br />if(liczba&lt;0) liczba=0;//zabezpieczenie przed przekroczeniem zakresu wyświetlacza<br />cy1=liczba/1000;//obliczenie pierwszej cyfry do wyświetlenia<br />cy2=(liczba-1000*cy1)/100;//obliczenie drugiej cyfry do wyświetlenia<br />cy3=(liczba-1000*cy1-100*cy2)/10;//obliczenie trzeciej cyfry do wyświetlenia<br />cy4=(liczba-1000*cy1-100*cy2-10*cy3);//obliczenie czwartej cyfry do wyświetlenia<br />}<br />}<br /><br />uint8_t key_lock;//deklaracja zmiennej pomocniczej do sprawdzenia stanu przycisku<br />uint8_t klawisz_wcisniety(uint8_t klawisz){<br /><br />if( !key_lock &amp;&amp; !(PINC &amp; klawisz)){// sprawdzenie czy zmienna pomocnicza=0 oraz czy przycisk jest wciśnięty<br />key_lock=1;// ustawienie zmiennej pomocniczej na 1<br />return 1;// funkcja zwraca wartość 1<br />}<br /><br />else if( key_lock &amp;&amp; (PINC &amp; klawisz ) ) key_lock++;//sprawdzenie czy zmienna pomocnicza jest różna od 0 oraz czy klawisz jest<br />return 0;// funkcja zwraca wartość 0<br />}[/syntax]<br /><br /><br />Czy możecie mi podpowiedzieć co robię źle?<br /><br />pozdrawiam<br />Łukasz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9883">kamer</a> — 14 maja 2015, o 14:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-05-28T10:11:26+01:00</updated>
<published>2014-05-28T10:11:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=82603#p82603</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=82603#p82603"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=82603#p82603"><![CDATA[
Wypróbuj poniższy prościutki programik.<br />[syntax=c]/*<br /> * main.c<br /> * F_CPU: 8000000Hz<br /> * MCU: Atmega32<br /> *<br /> *  Created on: 2014-05-28<br /> *      Author: Jacek<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#define LED_PIN (1&lt;&lt;PC4)<br />#define LED_ONPORTC &amp;=~LED_PIN<br />#define LED_OFFPORTC |= LED_PIN<br />#define LED_TOGPORTC ^= LED_PIN<br /><br />#define KEY_PIN(1&lt;&lt;PC5)<br /><br />volatile uint8_t Timer1;//zmienna na potrzeby timera programowego<br />uint16_t key_lock;//zmienna na potrzeby obsługi klawisza<br />uint8_t tryb;<br /><br /><br />void key_press(uint16_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) );<br />void zmien_tryb(void);<br /><br />int main(void)<br />{<br /><br />DDRC |= LED_PIN; //ustawienie kierunku pinu jako wyjscie<br />LED_OFF;<br /><br />DDRC &amp;=~ KEY_PIN; //ustawienie kierunku pinu jako wejscie<br />PORTC|= KEY_PIN; //podciągnięcie programowe linii klawisza do VCC<br /><br />//konfiguracja Timer2 - timery programowe, tyknięcie timera co 10ms<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br />OCR2 = 78;// dodatkowy podział przez 78 (rej. przepełnienia)<br />TIMSK |= (1&lt;&lt;OCIE2);// zezwolenie na przerwanie CompareMatch<br /><br />sei();<br /><br />while(1)<br />{<br />key_press(&amp;key_lock, &amp;PINC, KEY_PIN, zmien_tryb);<br /><br />if(0 == tryb) LED_OFF;<br />else if(1 == tryb) LED_ON;<br />else if(2 == tryb)<br />{<br />if(!Timer1)<br />{<br />Timer1 = 100;//100 * 10ms = 1s<br />LED_TOG;<br />}<br />}<br />else if(3 == tryb)<br />{<br />if(!Timer1)<br />{<br />Timer1 = 10;//10 * 10ms = 100ms<br />LED_TOG;<br />}<br />}<br /><br />}//end while<br />}//end main<br /><br />void zmien_tryb(void)<br />{<br />tryb++;<br />if(tryb &gt; 3) tryb = 0;<br />}<br /><br /><br />ISR(TIMER2_COMP_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */<br />if (n) Timer1 = --n;<br /><br />}<br /><br /><br />void key_press(uint16_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) )<br />{<br />        register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br />        if( !*klock &amp;&amp; !key_press )<br />        {<br />                *klock=50000;<br /><br />                // reakcja na PRESS (wcinięcie przycisku)<br />                if(kfun) kfun();<br /><br />        } else if( *klock &amp;&amp; key_press ) (*klock)++;<br />}[/syntax]<br /><br />Do obsługi klawisza zastosowałem funkcję, którą Mirek opisał na swoim blogu. Zamiast opóźnień typu delay zastosowałem timery programowe.<br /><br />Potraktuj ten program jako zachętę do własnych eksperymentów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> Miłej zabawy <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=204">jacekk232</a> — 28 maja 2014, o 10:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[VDR]]></name></author>
<updated>2014-05-27T00:11:32+01:00</updated>
<published>2014-05-27T00:11:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=144&amp;p=82501#p82501</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=82501#p82501"/>
<title type="html"><![CDATA[Re: Obsługa klawisza]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=144&amp;p=82501#p82501"><![CDATA[
Troszke naprowadzenia masz tutaj:<br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/10/drgania-stykow-to-bajki-wiec-jak-to.html" >http://mirekk36.blogspot.com/2012/10/dr ... ak-to.html</a><!-- m --><br />To taka wedka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Zamiast wylaczania,wlaczania diody zrob po prostu zwiekszanie/zmniejszanie czestotliwosci <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />W BlueBooku o ile pamietam to w okolicy opisywania SuperDebouncer troche bylo na ten temat (ale moge sie mylic <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=601">VDR</a> — 27 maja 2014, o 00:11</p><hr />
]]></content>
</entry>
</feed>