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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-10-05T21:42:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=21370&amp;mode</id>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-10-05T21:42:35+01:00</updated>
<published>2018-10-05T21:42:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212312#p212312</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212312#p212312"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212312#p212312"><![CDATA[
Pewnie, że jestem usatysfakcjonowany <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Dzięki za wyjaśnienia i poświęcony czas - sporo się dowiedziałem ;]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 5 paź 2018, o 21:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-10-05T19:37:15+01:00</updated>
<published>2018-10-05T19:37:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212301#p212301</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212301#p212301"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212301#p212301"><![CDATA[
Tak jak napisałem, chciałem przy okazji coś sprostować, potraktowałem to jako temat poboczny i się po prostu nad tym nie zastanowiłem dokładnie. Chodziło mi raczej o kolejność podciągania i przełączenia bitów Input Sense Control w rejestrze MCUCR. Ich zmiana z &quot;low level&quot; na &quot;edge&quot; w sytuacji, kiedy pin INT jest w stanie nieustalonym (wejście niepodciągnięte do żadnego potencjału) z dużym prawdopodobieństwem może spowodować ustawienie flagi tego przerwania w efekcie czego po włączeniu zezwolenia na nie (czy też włączenie globalne przerwań) następuje niezamierzone wejście w procedurę jego obsługi. Zachowanie odpowiedniej kolejności może przed tym uchronić. Ewentualnie można przed włączeniem przerwań wyzerować tę flagę.<br /><br />Pamiętałem, że w jakimś projekcie miałem z tym problem, tylko nie pamiętałem dokładnie. Ostatecznie i tak doszedłem do wniosku, że przed zezwoleniem na przerwanie zewnętrzne wyzwalane zboczem i tak najlepiej wyzerować jego flagę (tak dla pewności), chyba że to nie stanowi problemu. Teraz pisząc odpowiedź coś mi tam zaświtało, poprawiłem na szybko i stąd to zamieszanie.<br /><br />Niemniej brawa za czujność i dociekliwość. Mimo tego, że postawiłeś mnie tu do kąta, lubię odpowiadać ludziom, którzy czytają uważnie i analizują odpowiedzi, bo to raczej niezbyt częste zjawisko. Myślę, że każdemu zdarza się pomylić. Dzięki takim dociekaniom można ewentualnie skorygować pewne błędy czy nieścisłości.<br /><br />Mam nadzieję, że tym razem będziesz usatysfakcjonowany <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> A może - zachęcony pochwałą - będziesz mnie nadal egzaminował... <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=14165">andrews</a> — 5 paź 2018, o 19:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-10-05T18:43:51+01:00</updated>
<published>2018-10-05T18:43:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212298#p212298</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212298#p212298"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212298#p212298"><![CDATA[
Nie boje się, nie boję <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Dotychczas właśnie z nich korzystałem ale chciałem się upewnić, czy nie ma innej drogi. Dzięki za udzielone odpowiedzi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Andrews<br />[syntax=c]Zdecydowanie częściej stosuje się przerwania wyzwalane zboczem i wtedy kolejność ma znaczenie.[/syntax]<br />Możesz to wyjaśnić, bo wydaje mi się, że kolejność nie ma znaczenia dla żadnego ze sposobów wyzwalania, jeżeli instrukcja sei(); znajduje się po inicjalizacji pinu i załączeniu INT0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 5 paź 2018, o 18:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-10-05T17:48:48+01:00</updated>
<published>2018-10-05T17:48:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212295#p212295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212295#p212295"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212295#p212295"><![CDATA[
Bo tak naprawdę to, jak już pisałem, przerwanie tylko do wybudzenia, a dalsza obsługa przycisku w pętli głównej programu. Co innego gdybyś zaliczał jakieś wyższe częstotliwości ze stabilnym zboczem wtedy jak najbardziej kod można umieścić w przerwaniu.<br />I swoją drogą nie rozumiem dlaczego tak panicznie boisz się użyć timera do wspomagania całego procesu??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 5 paź 2018, o 17:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-10-05T17:45:40+01:00</updated>
<published>2018-10-05T17:45:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212294#p212294</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212294#p212294"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212294#p212294"><![CDATA[
<div class="quotetitle">MateuszS napisał(a):</div><div class="quotecontent"><br />No tak, z delayami/timerami/sprzętowym debouncingiem to będzie śmigać. Zastawiałem się, czy istnieje sposób np. na tą przykładową inkrementacje zmiennej bez użycia wymienionych możliwości.<br /></div><br />Problem drgań styków znany jest praktycznie od początku powstania elektroniki cyfrowej i (o ile wiem) do dzisiaj nie znaleziono sposobu na ich eliminację &quot;bez użycia wymienionych możliwości&quot; (choć mogę się mylić). Myślę, że człowiek, który taki sposób by znalazł, ma szansę zarobić ogromne pieniądze, o ile nikt wcześniej nie okradnie go z pomysłu (myślę, że każdy się domyśli, o kogo chodzi).<br /><br />Wprawdzie znam rozwiązanie bez opóźnień, <a href="http://www.learnabout-electronics.org/Digital/dig52.php"  class="postlink">na przerzutniku RS</a>, ale wymaga ono z kolei styku przełącznego (czyli potrzebne by też były zapewne dwa piny mikrokontrolera), ale osobiście nie spotkałem się, aby ktoś w technice mikroprocesorowej takie rozwiązanie stosował.<br /><br /><div class="quotetitle">MateuszS napisał(a):</div><div class="quotecontent"><br />Andrews pisałeś:[syntax=c]// lepiej najpierw włączyć podciąganie<br />PORTD |= (1&lt;&lt;PD2);<br />// dopiero później włączyć zezwolenie na przerwanie<br />// (można nawet dać kilka NOP opóźnienia)<br />GICR |= (1&lt;&lt;INT0);<br /><br />//lcd init<br /><br />sei();[/syntax]<br />W jakim celu, skoro przerwania załączasz dopiero później?<br /></div><br />Masz rację, trochę się rozpędziłem. Zdecydowanie częściej stosuje się przerwania wyzwalane zboczem i wtedy kolejność ma znaczenie. W tym przypadku faktycznie kolejność może być dowolna.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 5 paź 2018, o 17:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-10-05T16:43:02+01:00</updated>
<published>2018-10-05T16:43:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212293#p212293</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212293#p212293"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212293#p212293"><![CDATA[
No tak, z delayami/timerami/sprzętowym debouncingiem to będzie śmigać. Zastawiałem się, czy istnieje sposób np. na tą przykładową inkrementacje zmiennej bez użycia wymienionych możliwości.<br />Gdybyśmy chcieli tylko inkrementować zmienną w przerwaniu INT0 wyzwalanym nawet zboczem opadającym to i tak złapią nas drgania styków, które będzie trzeba pominąć poprzez zrobienie jakiegoś opóźnienia, ponieważ inaczej raz na 'n' razy zliczy nam zmienną niepoprawnie. Dlatego gdy stosuję już w programie jakiś timer(który w miarę często się wykonuje) to przy okazji w jego obsłudze umieszczam obsługę takiej zmiennej w sytuacji wykrycia wciśnięcia przycisku i INT0 odstawiam w niepamięć, bo w 'pojedynkę' jego działanie bywa błędne. <br /><br />Andrews pisałeś:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />// lepiej najpierw włączyć podciąganie<br />    PORTD |= (1&lt;&lt;PD2);<br />    // dopiero później włączyć zezwolenie na przerwanie<br />    // (można nawet dać kilka NOP opóźnienia)<br />    GICR |= (1&lt;&lt;INT0);<br /> <br />    //lcd init<br />   <br />    sei();<br /></div><br /><br />W jakim celu, skoro przerwania załączasz dopiero później?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 5 paź 2018, o 16:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-10-05T15:23:57+01:00</updated>
<published>2018-10-05T15:23:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212292#p212292</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212292#p212292"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212292#p212292"><![CDATA[
Proponuję spróbować tak:[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />volatile uint8_t zmienna;<br /><br />//--------------------------------------------------------------------------<br />int main(void){<br /><br />    // lepiej najpierw włączyć podciąganie<br />    PORTD |= (1&lt;&lt;PD2);<br />    // dopiero później włączyć zezwolenie na przerwanie<br />    // (można nawet dać kilka NOP opóźnienia)<br />    GICR |= (1&lt;&lt;INT0);<br /><br />    //lcd init<br />    <br />    sei();<br />    <br />    while(1)<br />    {<br />        // jeśli przerwanie wyłączone<br />        if( !(GICR &amp; (1&lt;&lt;INT0)) )<br />        {<br />            // sprawdź czy na pinie INT0 jest stan wysoki<br />            if(PIND &amp; (1&lt;&lt;PD2))<br />            {<br />                // jeśli jest stan wysoki odczekaj 10ms<br />                _delay_ms(10);<br />                // jeśli nadal jest wysoki<br />                if(PIND &amp; (1&lt;&lt;PD2))<br />                {<br />                    // włącz zezwolenie na przerwanie<br />                    GICR |= (1&lt;&lt;INT0);<br />//                  lcd_cls();<br />//                  lcd_int(zmienna);<br />                } // if INT0 still high<br />            } // if INT0 high<br />        } // if interrupt not enabled<br />    } // while(1)<br />} //main<br /><br /><br />ISR(INT0_vect){<br />    // wyłącz zezwolenie na przerwanie<br />    // zapobiegnie to niezamierzonemu<br />    // zwiększaniu zmiennej<br />    GICR &amp;= ~(1&lt;&lt;INT0);<br />    zmienna++;<br />}[/syntax]<br />Powinno działać prawidłowo nawet przy szybkim naciskaniu, chyba że masz mocno zabrudzone styki lub potrafisz naciskać szybciej niż 100 razy na sekundę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ewentualnie masz jakieś zakłócenia na tym pinie.<br /><br />Wprawdzie została użyta funkcja _delay_ms(), jednak opóźnienie nie jest duże, nie jest wewnątrz procedury obsługi przerwania i będzie uruchamiane tylko raz (no może 2, 3 razy) po puszczeniu przycisku.<br /><br />Włączanie przed uśpieniem możesz sobie dodać sam, tak jak to wcześniej pokazałeś.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 5 paź 2018, o 15:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tprzemko]]></name></author>
<updated>2018-10-05T14:01:24+01:00</updated>
<published>2018-10-05T14:01:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212291#p212291</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212291#p212291"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212291#p212291"><![CDATA[
Witam<br />Tak logicznie czy to będzie sprzętowy czy programowy debouncing, zawsze gdzieś będziesz miał jakieś opuźnienie. Nie ma co bać się tego debouncingu i go gdzieś zrobić. Iść można dalej czekając na puszczenie klawisza.<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4743">tprzemko</a> — 5 paź 2018, o 14:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-10-05T10:58:52+01:00</updated>
<published>2018-10-05T10:58:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212279#p212279</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212279#p212279"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212279#p212279"><![CDATA[
Podejdź do tego z innej strony. Przerwanie niech tylko wybudza, a liczenie (badanie przycisku) zrób w pętli głównej. Może tak będzie ci łatwiej. Nie ma tak, że czegoś się nie da zrobić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> Nie wiem co to za urządzenie i na ile sprzętowo idzie to uprościć (czasem takie działanie uniemożliwia dalszą rozbudowę urządzenia!), ale obstawał bym przy programowej eliminacji drgań.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 5 paź 2018, o 10:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-10-05T10:59:29+01:00</updated>
<published>2018-10-05T10:56:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212278#p212278</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212278#p212278"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212278#p212278"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />A w czym jest problem żeby dodatkowo po wybudzeniu procka przestawić INT na zbocze, a przy usypianiu z powrotem na stan niski? Nadal przycisk będzie wtedy blokował?<br /></div><br />Tak też można, ja nie napisałem, że to jedyne słuszne rozwiązanie, tylko w czym problem, żeby wyłączyć obsługę przerwania? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Uważasz, że to złe rozwiązanie?<br />Nie mam w tej chwili czasu rozpisywać się na temat zalet i wad obu rozwiązań (choć rozwiązanie z wyłączeniem obsługi przerwania jest moim zdaniem prostsze, choćby dlatego, że tak naprawdę nie wymaga dodatkowej zmiennej volatile o nazwie flaga. Tak czy inaczej problem drgań styków dotyczy obu metod, pytanie tylko który sposób pozwoli na jego łatwiejsze rozwiązanie.<br />Czasami jednak najprostszym rozwiązaniem jest rozbudowanie układu o debouncing sprzętowy i sporo problemów znika.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 5 paź 2018, o 10:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-10-05T10:42:53+01:00</updated>
<published>2018-10-05T10:42:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212277#p212277</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212277#p212277"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212277#p212277"><![CDATA[
Dzięki za zaangażowanie chłopaki:)<br />Rzeczywiście przy ustawieniu na wykrywanie zboczem efekt jest trochę lepszy ale dalej nie zdaje to egzaminu, ponieważ procedura jest ta sama. Bez użycia timera albo zezwolenia na przerwanie w pętli głównej dopiero po jakiejś chwili od wyłączenia przerwania, program nadal czasem wchodzi do przerwania. <br /><br />Dlatego problemu tego bez &quot;odczekania&quot; albo sprzętowego debouncingu nie umiem rozwiązać.<br /><br />Natomiast w sytuacji, gdy zmienna miałaby być zwiększana tylko jednokrotnie to tego typu rozwiązanie się nadaje, więc pomysł z wyłączaniem przerwania uważam za dobry :<br /><br />[syntax=c]int main{<br /><br />GICR |= (1&lt;&lt;INT0);<br />PORTD |= (1&lt;&lt;PD2);<br /><br />while(1){<br />if(PIND &amp; (1&lt;&lt;PD2)){<br />if(flag1 == 1){<br />lcd_cls();<br />lcd_int(zmienna);<br />flag1 = 0;<br />}<br />}<br />               if(warunek_na_sleepa){<br /><br />        sleep_enable();<br />        GICR |= (1&lt;&lt;INT0);<br />        sleep_cpu();<br />        sleep_disable();<br /><br />                }<br /><br />          }<br />}<br />//---------------------------------------<br />ISR( INT0_vect){<br /><br />GICR &amp;= ~(1&lt;&lt;INT0);<br /><br />if(!flag1){<br />flag1 = 1;<br />zmienna++;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 5 paź 2018, o 10:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-10-05T09:27:12+01:00</updated>
<published>2018-10-05T09:27:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212274#p212274</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212274#p212274"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212274#p212274"><![CDATA[
A w czym jest problem żeby dodatkowo po wybudzeniu procka przestawić INT na zbocze, a przy usypianiu z powrotem na stan niski? Nadal przycisk będzie wtedy blokował? <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=1922">SylwekK</a> — 5 paź 2018, o 09:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-10-05T09:08:17+01:00</updated>
<published>2018-10-05T09:08:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212273#p212273</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212273#p212273"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212273#p212273"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Po co wyłączać przerwania? Niech sobie pracują... to flaga nie pozwoli na zwiększenie wartości zmiennej.<br /></div><br />Tylko że wtedy program w pętli głównej będzie wykonywany bardzo wolno, a kod innych przerwań może nawet wcale, bo mikrokontroler będzie prawie cały czas siedział w procedurze obsługi przerwania (do momentu puszczenia przycisku).<br /><br />... i nie miałem na myśli wyłączenia przerwań w ogóle, tylko tego konkretnego <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />EDIT:<br />Dodam, że flagą sprzętową przerwania nie należy się przejmować, czy też jej zerować, ponieważ mechanizm obsługi przerwania zewnętrznego <strong>wyzwalanego poziomem</strong> jest nieco inny, niż w przypadku wyzwalania zboczem, i flaga ta w tym przypadku <strong>wcale nie zostaje ustawiona</strong>.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 5 paź 2018, o 09:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-10-05T07:43:19+01:00</updated>
<published>2018-10-05T07:43:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212269#p212269</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212269#p212269"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212269#p212269"><![CDATA[
Po co wyłączać przerwania? Niech sobie pracują... to flaga nie pozwoli na zwiększenie wartości zmiennej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 5 paź 2018, o 07:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-10-05T06:59:20+01:00</updated>
<published>2018-10-05T06:59:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212268#p212268</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212268#p212268"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212268#p212268"><![CDATA[
Moim zdaniem pomysł z wyłączaniem zezwolenia na przerwanie wewnątrz procedury obsługi przerwania i włączaniem w pętli głównej programu po zwolnieniu przycisku jest dobry, tylko problemem tutaj mogą być właśnie (jak już sam autor wątku podejrzewał) drgania styków.<br />Aby to sprawdzić spróbowałbym zastosować sprzętowy debouncing ewentualnie podwójne sprawdzanie stanu wysokiego na pinie INT0 po jakimś opóźnieniu (rzędu około 10ms), i dopiero wtedy ponowne włączenie zezwolenia na przerwanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 5 paź 2018, o 06:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-10-05T06:26:36+01:00</updated>
<published>2018-10-05T06:26:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212267#p212267</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212267#p212267"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212267#p212267"><![CDATA[
Jeśli korzystasz z przycisku to do prawidłowego działania bez jakiegoś czasomierza (najlepiej sprzętowego timera) ciężko będzie to przyzwoicie zrobić. Można bez timera, ale wtedy zaliczasz w pętli głównej inna zmienną, która posłuży za odliczanie czasu (mniej dokładne dla przycisku bez większego znaczenia).<br />Każde przerwanie od INT zwiększa twoją zmienną wystawiając flagę, która blokuje dalszą inkrementację. W pętli głównej jeśli ta flaga jest rozpoznana to zaczyna odliczać licznik, który po odpowiednim czasie (dopuszczalna częstotliwość wciskania przycisku) wyzeruje ta flagę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 5 paź 2018, o 06:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-10-05T06:11:06+01:00</updated>
<published>2018-10-05T06:11:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212266#p212266</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212266#p212266"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212266#p212266"><![CDATA[
nie można flagi zerować tak<br /><br />[syntax=c]GIFR |= (1&lt;&lt;INTF0);[/syntax]<br /><br />tylko i wyłącznie tak:<br /><br />[syntax=c]GIFR = (1&lt;&lt;INTF0);[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br /><div class="quotetitle">MateuszS napisał(a):</div><div class="quotecontent"><br />Zgodnie z obrazkiem wyciągniętym z datasheeta powinna się ona sama zerować w przerwaniu<br /></div><br />No bo tak się dzieje i przy wyzwalaniu zboczem nie miałbyś problemu, natomiast przy wyzwalaniu poziomem ... przecież ona znowu będzie ustawiona , i znowu ... cały czas w trakcie poziomu niskiego<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 paź 2018, o 06:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tprzemko]]></name></author>
<updated>2018-10-05T02:29:23+01:00</updated>
<published>2018-10-05T02:29:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212265#p212265</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212265#p212265"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212265#p212265"><![CDATA[
Jak Masz wejście int0 skonfigurowane?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4743">tprzemko</a> — 5 paź 2018, o 02:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-10-04T23:36:59+01:00</updated>
<published>2018-10-04T23:36:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212264#p212264</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212264#p212264"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212264#p212264"><![CDATA[
Nie jestem przekonany, czy poprawnie manewruje tą flagą, bo nie do końca rozumiem jej znaczenie. Zgodnie z obrazkiem wyciągniętym z datasheeta powinna się ona sama zerować w przerwaniu no ale skoro je wyłączam to może dlatego potrzebne jest manualne działanie.<br />Dla ustawień w main:<br />[syntax=c]GICR |= (1&lt;&lt;INT0);[/syntax]<br />zeruje ją w ten sposób <br />[syntax=c]ISR( INT0_vect){<br /><br />GICR &amp;= ~(1&lt;&lt;INT0);<br />GIFR |= (1&lt;&lt;INTF0);<br />if(!flag1){<br />flag1 = 1;<br />zmienna++;<br />}<br />}[/syntax]<br />ale to nic nie pomaga<br /><br /><a href="https://obrazkiforum.atnel.pl/19707/4bb9c810d19998a033fc6604b4ff8c83.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19707/4bb9c810d19998a033fc6604b4ff8c83.jpg" alt="Obrazek" /></a><br /><br />Problem raczej leży gdzie indziej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 4 paź 2018, o 23:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-10-04T22:51:17+01:00</updated>
<published>2018-10-04T22:51:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212263#p212263</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212263#p212263"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212263#p212263"><![CDATA[
po wyłączeniu przerwania - ZERUJ sprzętową flagę przerwania<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 paź 2018, o 22:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-10-04T22:43:25+01:00</updated>
<published>2018-10-04T22:43:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212262#p212262</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212262#p212262"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212262#p212262"><![CDATA[
No zgadza się tylko, że założenie jest takie, że nie chce używać timera, a pętla programu jest taka jak wysłałem. Pytanie gdzie zerować w takim razie tę flagę albo jakie inne podejście mieć do tego programu, ponieważ nie działa poprawnie.<br />Sprawdzałem to analizatorem stanów i do przerwania program wchodzi niekiedy zaraz po jego odblokowaniu(w tym przypadku nic się nie dzieje, bo flaga nie pozwala na inkrementacje zmiennej), a niekiedy po zerowaniu flagi powodując błędne naliczanie.<br /><br />EDIT: oczywiście nie chce stosować żadnych opóźnień w formie _delay_ms<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 4 paź 2018, o 22:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-10-04T21:36:36+01:00</updated>
<published>2018-10-04T21:36:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212258#p212258</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212258#p212258"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212258#p212258"><![CDATA[
Do wybudzania tak - tylko stan niski.<br />Flagę możesz przecież zerować w pętli głównej programu w jakimś tam momencie dogodnym nawet z wykorzystaniem innego timera jeśli taka potrzeba będzie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 4 paź 2018, o 21:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-10-04T20:09:01+01:00</updated>
<published>2018-10-04T20:09:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212251#p212251</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212251#p212251"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212251#p212251"><![CDATA[
Ok, z tego co się orientuje to, żeby wybudzić procka z uśpienia za pomocą INT0/INT1 to nie należy robić tego zboczem i do tego celu to potrzebuje.<br /><br />Aktualnie staram się korzystać z pomysłu tprzemko ale dalej zdarzają się sytuacje, w których naliczy mi nieprawidłowo w momencie, gdy szybko wciskam przycisk:<br /><br />[syntax=c]volatile uint8_t zmienna, flag1 ;<br /><br />//--------------------------------------------------------------------------<br />int main(void){<br /><br />GICR |= (1&lt;&lt;INT0);<br />PORTD |= (1&lt;&lt;PD2);<br /><br />//lcd init<br /><br />sei();<br /><br />while(1){<br /><br />if(PIND &amp; (1&lt;&lt;PD2)){<br />GICR |= (1&lt;&lt;INT0);<br />if(flag1 == 1){<br />lcd_cls();<br />lcd_int(zmienna);<br />flag1 = 0;<br />}<br />}<br />      }<br />}<br />ISR( INT0_vect){<br /><br />GICR &amp;= ~(1&lt;&lt;INT0);<br />if(!flag1){<br />flag1 = 1;<br />zmienna++;<br />}<br />}[/syntax]<br /><br />Nie wiem, czy to te owiane złą sławą drgania styków mogą powodować, że po wyjściu z przerwania warunek w main się wykona i do przerwania znowu program wejdzie?<br />Te warunki z użyciem flag1 wydają się zbyteczne ale bez nich naliczanie niepoprawne występowało częściej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 4 paź 2018, o 20:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-10-04T19:41:21+01:00</updated>
<published>2018-10-04T19:41:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212249#p212249</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212249#p212249"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212249#p212249"><![CDATA[
Możesz ustawić aby zbocze badało, a nie stan. Pokaż jak tą flagę robiłeś, bo akurat nie widzę tu problemu aby to zrobić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 4 paź 2018, o 19:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tprzemko]]></name></author>
<updated>2018-10-04T19:09:56+01:00</updated>
<published>2018-10-04T19:09:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212247#p212247</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212247#p212247"/>
<title type="html"><![CDATA[Re: Inkrementacja zmiennej w przerwaniu INT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21370&amp;p=212247#p212247"><![CDATA[
Witam<br />Po wejściu w przerwanie wyłącz to przerwanie. W pętli głównej jeśli klawisz puszczony to załączamy przerwanie.<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4743">tprzemko</a> — 4 paź 2018, o 19:09</p><hr />
]]></content>
</entry>
</feed>