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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-03-29T23:39:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=19&amp;t=11223&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-03-29T23:39:37+01:00</updated>
<published>2015-03-29T23:39:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125036#p125036</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125036#p125036"/>
<title type="html"><![CDATA[Re: Błąd w SuperDebounce]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125036#p125036"><![CDATA[
<div class="quotetitle">haloon napisał(a):</div><div class="quotecontent"><br />Odpowiadając: warunek z linii nr.2 nie zostanie spełniony ponieważ key_state zostało z wartością 1.<br /></div><br />tak tak - dlatego skasowałem wcześniejszą wypowiedź zanim napisałeś swoją ... teraz jeszcze patrzę na to i za chwilę napiszę kilka słów<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 13 minutach ]</span></strong><br /><br />Po pierwsze to ogromna radość, że TAK głęboko wszedłeś w tę funkcję ... to mnie bardzo cieszy.<br /><br />Po drugie - rzeczywiście w pewnych sytuacjach może dojść do tego co mówisz - chociaż ja tu założyłem właśnie możliwości REGULACJI tym doborem czasu na różnych etapach .... Nie mniej jednak biorąc pod uwagę aż takie coś:<br /><br /><div class="quotetitle">haloon napisał(a):</div><div class="quotecontent"><br />a w wersji hardcorowej przy kątowym atakowaniu słicza z dużą szybkością, nawet poniżej 10ms.<br /></div><br />No to rzeczywiście .... jak się &quot;postarać&quot; to można. <br /><br />Ja bym może dodał nieco krótszy ten warunek .... bo nie musimy czekać aż Timer1 będzie równy 0, tylko od razu i ZAWSZE gdy klawisz zwolniony a stan jest = debounce to .... zrobiłbym to tak <br /><br />[syntax=&quot;c&quot;]<br />...<br />if( key_press &amp;&amp; !*key_state ) {<br />    *key_state = debounce;<br />    Timer1 = 15;<br />} else<br />if( *key_state  ) {<br />    if (!key_press &amp;&amp; debounce==*key_state ) {<br />        Timer1 = 15;    // zamiast idle - podtrzymujemy czas debounce, dzięki czemu można go chyba fajnie skrócić do minimum<br />    } else<br />    if( key_press &amp;&amp; debounce==*key_state &amp;&amp; !Timer1 ) {<br />        *key_state = 2;<br />        Timer1=5;<br />    } else<br />    if( !key_press &amp;&amp; *key_state&gt;1 &amp;&amp; *key_state&lt;4 ) {<br />        if(push_proc) push_proc();                                              /* KEY_UP */<br />        *key_state=idle;<br />    } else<br />...[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 18 minutach ]</span></strong><br /><br />Generalnie - to powiem tak - CELEM albo inaczej GŁÓWNE CELE jakie mi przyświecały pisząc tę funkcję to:<br /><br />1. Pokazać czytelnikowi jak działają timery programowe<br />2. pokazać jak należałoby próbować podchodzić do obsługi klawisza (szczególnie chodzi o repetycję)<br />3. pokazać jak korzystać w prosty sposób ze wskaźników na funkcje przekazywanych do innej funkcji - czyli pierwsze zetknięcie z TAK WAŻNYMI z mojego punktu widzenia CALLBACKAMI (czyli mechanizmem funkcji zwrotnych)<br />4. pokazać jak pisać funkcje nieblokujące z nieco rozbudowaną tzw maszyną stanów<br />5. Na pewno nie miała to być NAJLEPSZA FUNKCJA na świecie do obsługi klawiszy i nawet pomimo tej poprawki nadal wg mnie nie będzie pretendować do tego tytułu .... bo obsługuje wciskanie tylko pojedynczych klawiszy (dwóch naraz nie da się wykryć) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> a też np by się przydało w wielu sytuacjach<br /><br />Jak dla mnie punkty od 1 do 4 kolega zaliczył na piątkę ! ... dlatego piszę, że to miło słyszeć - że się przydało to co napisałem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 22 minutach ]</span></strong><br /><br />O! nawet jeszcze inaczej nieco bym to zrobił - tego IF'a zabezpieczającego umieściłbym na końcu łańcuszka - aby nie tracić cennego czasu funkcji nieblokującej!<br /><br />[syntax=&quot;c&quot;]<br />...<br />if( key_press &amp;&amp; !*key_state ) {<br />    *key_state = debounce;<br />    Timer1 = 15;<br />} else<br />if( *key_state  ) {<br /><br />if( key_press &amp;&amp; debounce==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = 2;<br />Timer1=5;<br />} else<br />if( !key_press &amp;&amp; *key_state&gt;1 &amp;&amp; *key_state&lt;4 ) {<br />if(push_proc) push_proc();/* KEY_UP */<br />*key_state=idle;<br />} else<br />if( key_press &amp;&amp; go_rep==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = wait_rep;<br />Timer1=rep_wait;<br />} else<br />if( key_press &amp;&amp; wait_rep==*key_state &amp;&amp; !Timer1 ) {<br />*key_state = rep;<br />} else<br />if( key_press &amp;&amp; rep==*key_state &amp;&amp; !Timer1 ) {<br />Timer1 = rep_time;<br />if(rep_proc) rep_proc();/* KEY_REP */<br />} else<br />               if (!key_press &amp;&amp; debounce==*key_state ) {<br />                       Timer1 = 15;    // ***** podtrzymujemy czas debounce na wypadek dłuższej niezamierzonej przerwy *********<br />               } <br /><br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 mar 2015, o 23:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[haloon]]></name></author>
<updated>2015-03-29T23:28:56+01:00</updated>
<published>2015-03-29T23:28:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125035#p125035</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125035#p125035"/>
<title type="html"><![CDATA[Re: Błąd w SuperDebounce]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125035#p125035"><![CDATA[
Dziękuje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> dopiero zaczynam, i nie odpuszczam dopóki czegoś nie zrozumiem; zabawę z Bluebookiem przeprowadzam na ATtiny2313 więc jest dodatkowa, pozytywna zabawa z dopasowywaniem rejestrów.<br /><br />Odpowiadając: warunek z linii nr.2 nie zostanie spełniony ponieważ key_state zostało z wartością 1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9224">haloon</a> — 29 mar 2015, o 23:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-03-29T23:27:40+01:00</updated>
<published>2015-03-29T23:27:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125034#p125034</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125034#p125034"/>
<title type="html"><![CDATA[Re: Błąd w SuperDebounce]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125034#p125034"><![CDATA[
<div class="quotetitle">haloon napisał(a):</div><div class="quotecontent"><br />Lecz co się stanie gdy podczas tego odliczania odpuścimy klawisz? Stan zostanie nadal ten sam, czyli &quot;debounce&quot;, warunek z 7 linii nie zostanie spełniony, ani żaden inny do końca tej funkcji. Warunek z linii 7 zostanie spełniony natychmiast po ponownym naciśnięciu klawisza, bez &quot;debouncigu&quot; tego kolejnego wciśnięcia.<br /></div><br />Nie jest mi prosto po pięciu latach analizować kod <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ale chyba masz rację <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... zaraz dopiszę coś jeszcze - chwilka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 mar 2015, o 23:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[haloon]]></name></author>
<updated>2015-03-29T23:09:34+01:00</updated>
<published>2015-03-29T23:09:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125032#p125032</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125032#p125032"/>
<title type="html"><![CDATA[Błąd w SuperDebounce]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11223&amp;p=125032#p125032"><![CDATA[
Witam,<br /><br />Prawdopodobnie znalazłem pewien drobny błąd. Oczywiście bawię się zaktualizowaną wersją ze strony - o poprawionym błędzie z pierwszego wydania wiem.<br /><br />Konkretnie chodzi o ten kawałek funkcji SuperDebounce:<br />[syntax=c]...<br />if( key_press &amp;&amp; !*key_state ) {<br />    *key_state = debounce;<br />    Timer1 = 15;<br />} else<br />if( *key_state  ) {<br />    if( key_press &amp;&amp; debounce==*key_state &amp;&amp; !Timer1 ) {<br />        *key_state = 2;<br />        Timer1=5;<br />    } else<br />    if( !key_press &amp;&amp; *key_state&gt;1 &amp;&amp; *key_state&lt;4 ) {<br />        if(push_proc) push_proc();/* KEY_UP */<br />        *key_state=idle;<br />    } else<br />...[/syntax]<br /><br />Po wciśnięciu klawisza zmienia się stan na &quot;debounce&quot; i zaczynamy odliczać czas aby wyeliminować ewentualne drgania styków. Po tym czasie następuje spełnienie warunku z 7 linii. Lecz co się stanie gdy podczas tego odliczania odpuścimy klawisz? Stan zostanie nadal ten sam, czyli &quot;debounce&quot;, warunek z 7 linii nie zostanie spełniony, ani żaden inny do końca tej funkcji. Warunek z linii 7 zostanie spełniony natychmiast po ponownym naciśnięciu klawisza, bez &quot;debouncigu&quot; tego kolejnego wciśnięcia.<br /><br />Efekt: podwójne kliknięcie, przy czym pierwsze o czasie trwania poniżej wynikającego z 4 linii powoduje jednokrotne wykonanie callbacku do push_proc() lub rep_proc() (w zależności od czasu drugiego kliknięcia). Pewnym rozwiązaniem może być zmniejszenie czasu oczekiwania na ustabilizowanie się styków, lecz po próbach na stole bezproblemowo udawało się wcisnąć i odpuścić microswitch w czasie poniżej 30ms, a w wersji hardcorowej przy kątowym atakowaniu słicza z dużą szybkością, nawet poniżej 10ms. O ile kojarzę niektórzy producenci podają czas drgania styków do 20ms. Więc drastyczne zmniejszenie wartości z linii 4 nie jest satysfakcjonującym mnie rozwiązaniem.<br /><br />W celu eliminacji tego zjawiska wstawiłem na szybko sprawdzanie po drodze jeszcze jednego warunku, linie 7, 8 i 9:<br /><br />[syntax=c]...<br />if( key_press &amp;&amp; !*key_state ) {<br />    *key_state = debounce;<br />    Timer1 = 15;<br />} else<br />if( *key_state  ) {<br />    if (!key_press &amp;&amp; debounce==*key_state &amp;&amp; !Timer1 ) {<br />        *key_state = idle;<br />    } else<br />    if( key_press &amp;&amp; debounce==*key_state &amp;&amp; !Timer1 ) {<br />        *key_state = 2;<br />        Timer1=5;<br />    } else<br />    if( !key_press &amp;&amp; *key_state&gt;1 &amp;&amp; *key_state&lt;4 ) {<br />        if(push_proc) push_proc();/* KEY_UP */<br />        *key_state=idle;<br />    } else<br />...[/syntax]<br /><br />W tym momencie do funkcji dodano 8 rozkazów maszynowych. Być może jest jakiś bardziej elegancki sposób aby wyeliminować to zjawisko?<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9224">haloon</a> — 29 mar 2015, o 23:09</p><hr />
]]></content>
</entry>
</feed>