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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-01-31T00:44:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23565&amp;mode</id>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-31T00:44:44+01:00</updated>
<published>2021-01-31T00:44:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230843#p230843</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230843#p230843"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230843#p230843"><![CDATA[
Dziękuję za podpowiedź. Mam tylko jeszcze pytanie co do tematu drgań styków. Rozumiem, że są one eliminowane przez przepełnienie się zmiennej. Ale czy kiedy będę miał dłuższy program to będzie to działać? Czas w jakim pętla znowu wróci to miejsca, w którym zmienna jest inkrementowana będzie wtedy dłuższy?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 31 sty 2021, o 00:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-01-30T15:45:04+01:00</updated>
<published>2021-01-30T15:45:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230837#p230837</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230837#p230837"/>
<title type="html"><![CDATA[Re: Timer programowy nie działa tak jak chcę.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230837#p230837"><![CDATA[
nie mnóż wątków skoro dalej o to samo pytasz - przecież w poprzednim ci odpowiedziałem - poza tym w przerwaniu robisz MASAKRĘ amerykańską piłą tarczową - odejmując wartość 10 ! ... nie możesz zajrzeć do Bluebooka żeby zobaczyć jak działa mechanizm timera programowego - tylko tak na czuja coś sobie zmieniasz na zasadzie, że może wyjdzie albo nie wyjdzie ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 30 sty 2021, o 15:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-30T14:58:05+01:00</updated>
<published>2021-01-30T14:58:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230836#p230836</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230836#p230836"/>
<title type="html"><![CDATA[Timer programowy nie działa tak jak chcę.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230836#p230836"><![CDATA[
Witam, próbuję wykorzystać timer programowy do eliminacji drgań styków [zmienna Timer2]. Chciałbym aby sprawdzanie czy przycisk jest nacisnięty występowało co 60ms, dlatego do warunku dodałem jeszcze &quot;!Timer2&quot;. Przerwanie sprzętowego timera0  (10ms), tam właśnie odejmuję od zmiennej liczbę 10 i kiedy wartość tej zmiennej równa jest zero to dzięki warunkowi, o którym wspomniałem wcześniej powinny zostać wyeliminowane drgania styków. Co prawda drgań styków raczej nie doświadczam natomiast, kiedy naciskam przycisk bardzo szybko to dioda led zmienia swój stan o wiele wolniej. Dziwi mnie to, bo przy poprzednim programie usuwałem drgania styków sprawdzając czy przycisk jest wciśnięty w przerwaniu (60ms) timera sprzętowego i wszystko działało poprawnie. Gdzie mam tutaj błąd? Mikrokontroler, którego używam to Atmega328PU. Dodam jeszcze, że czasami przy puszczaniu klawisza dioda zmienia swój stan, ale to chyba wynika bardziej z jego mechanicznej budowy niż jakiegoś błędu w programie.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define LED1 (1 &lt;&lt; PD7)<br />#define LED2 (1 &lt;&lt; PC5)<br />#define KEY1 (1 &lt;&lt; PB0)<br /><br />volatile uint16_t Timer1 = 0;<br />volatile uint8_t Timer2 = 60;<br /><br />int main(void)<br />{<br /><br />uint8_t lkey = 0;<br />uint8_t flag = 0;<br /><br />DDRD |= LED1;<br />DDRC |= LED2;<br />DDRB &amp;= ~KEY1;<br /><br />PORTB |= KEY1;<br />   <br />TCCR0A |= (1 &lt;&lt; WGM01);<br />TCCR0B |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00);<br />TIMSK0 |= (1 &lt;&lt; OCIE0A);<br />OCR0A = 156;<br /><br />sei();<br />   <br />    while (1)<br />    {<br />if(!lkey &amp;&amp; !(PINB &amp; KEY1) &amp;&amp; !Timer2)<br />{<br />lkey = 1;<br />PORTD ^= LED1;<br />Timer1 = 300;<br />Timer2 = 60;<br />flag = 1;<br />}<br />else if(lkey &amp;&amp; PINB &amp; KEY1)<br />{<br />lkey=0;<br />flag = 0;<br />Timer1 = 0;<br />if(!lkey) Timer1 = 0; flag = 0;<br />}<br />else if(flag &amp;&amp; !Timer1)<br />{<br />PORTC ^= LED2;<br />flag = 0;<br />}<br />    }<br /><br />return 0;<br />}<br /><br />ISR(TIMER0_COMPA_vect)<br />{<br />if(Timer2) Timer2 -= 10;<br /><br />uint16_t n;<br /><br />n = Timer1;<br />if (n) Timer1 -= 10;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 30 sty 2021, o 14:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-01-30T14:55:31+01:00</updated>
<published>2021-01-30T14:55:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230835#p230835</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230835#p230835"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230835#p230835"><![CDATA[
tylko zastanów się - bo ta linijka oznaczona na czerwono jest kompletnie niepotrzebna w tym twoim kodzie. Co więcej po warunku ID jeśli nie ma nawiasów klamrowych to wykona ci się zawsze tylko pierwsze polecenie - nie WAŻNE że w jednej linii sobie wpiszesz kilka. Ale i tak warunek jest kompletnie niepotrzebny skoro nad nim i tak zerujesz flagę i i tak zerujesz Timer1<br /><br /><br /><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />else if(lkey &amp;&amp; PINB &amp; KEY1)<br />                {<br />                        lkey++;<br />                        flag = 0;<br />                        Timer1 = 0;<br />                        <span style="color: #FF0000">if(!lkey) Timer1 = 0; flag = 0;</span><br />                }<br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 30 sty 2021, o 14:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-30T13:56:58+01:00</updated>
<published>2021-01-30T13:56:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230833#p230833</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230833#p230833"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230833#p230833"><![CDATA[
Problem udało mi się rozwiązać kodem jak poniżej. Wzorowałem się na tym co przedstawił Pan Mirek na swoim blogu.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define LED1 (1 &lt;&lt; PD7)<br />#define LED2 (1 &lt;&lt; PC5)<br />#define KEY1 (1 &lt;&lt; PB0)<br /><br />volatile uint16_t Timer1 = 0;<br /><br />int main(void)<br />{<br /><br />uint8_t lkey = 0;<br />uint8_t flag = 0;<br /><br />DDRD |= LED1;<br />DDRC |= LED2;<br />DDRB &amp;= ~KEY1;<br /><br />PORTB |= KEY1;<br />   <br />TCCR0A |= (1 &lt;&lt; WGM01);<br />TCCR0B |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00);<br />TIMSK0 |= (1 &lt;&lt; OCIE0A);<br />OCR0A = 156;<br /><br />sei();<br />   <br />    while (1)<br />    {<br />if(!lkey &amp;&amp; !(PINB &amp; KEY1))<br />{<br />lkey = 1;<br />PORTD ^= LED1;<br />Timer1 = 300;<br /><br />flag = 1;<br />}<br />else if(lkey &amp;&amp; PINB &amp; KEY1)<br />{<br />lkey++;<br />flag = 0;<br />Timer1 = 0;<br />if(!lkey) Timer1 = 0; flag = 0;<br />}<br />else if(flag &amp;&amp; !Timer1)<br />{<br />PORTC ^= LED2;<br />flag = 0;<br />}<br />    }<br /><br />return 0;<br />}<br /><br />ISR(TIMER0_COMPA_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;<br />if (n) Timer1 -=10;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 30 sty 2021, o 13:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-29T23:44:49+01:00</updated>
<published>2021-01-29T23:44:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230825#p230825</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230825#p230825"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230825#p230825"><![CDATA[
Próbowałem też z takim kodem wzorowany na kodzie z bloga Pana Mirka, ale nie działa.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define LED1 (1 &lt;&lt; PD7)<br />#define LED2 (1 &lt;&lt; PC5)<br />#define KEY1 (1 &lt;&lt; PB0)<br /><br />volatile uint16_t Timer1 = 0;<br /><br />int main(void)<br />{<br /><br />uint8_t lkey = 0;<br />uint8_t flag = 0;<br /><br />DDRD |= LED1;<br />DDRC |= LED2;<br />DDRB &amp;= ~KEY1;<br /><br />PORTB |= KEY1;<br />   <br />TCCR0A |= (1 &lt;&lt; WGM01);<br />TCCR0B |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00);<br />TIMSK0 |= (1 &lt;&lt; OCIE0A);<br />OCR0A = 156;<br />   <br />sei();<br />   <br />    while (1)<br />    {<br />if(!lkey &amp;&amp; !(PINB &amp; KEY1))<br />{<br />lkey = 1;<br />PORTD ^= LED1;<br /><br />Timer1 = 300;<br />flag = 1;<br />}<br />else if(lkey &amp;&amp; PINB &amp; KEY1)<br />{<br />lkey++;<br />flag = 0;<br />Timer1 = 0;<br />if(!lkey) Timer1 = 0; flag = 0;<br />}<br />else if(flag &amp;&amp; !Timer1)<br />{<br />PORTC ^= LED2;<br />flag = 0;<br />}<br />    }<br /><br />return 0;<br />}<br /><br />ISR(TIMER0_COMPA_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;<br />if (n) Timer1 = --n;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 29 sty 2021, o 23:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-28T21:18:42+01:00</updated>
<published>2021-01-28T21:18:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230801#p230801</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230801#p230801"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230801#p230801"><![CDATA[
<div class="quotetitle">micky napisał(a):</div><div class="quotecontent"><br />Popatrz na superdebounce Mirka na jego blogu.<br /></div><br /><br />Przed chwilą zerknąłem i mam pewien problem. Kod przepisałem z tą różnicą, że zmieniłem porty na, których podłączone mam diody.<br />Reakcja na wciśnięcie klawisza jest poprawna, ale druga dioda nie chce się zaświecić po przytrzymaniu klawisza. Gdzie mam tutaj błąd?<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define LED1 (1 &lt;&lt; PD7)<br />#define LED2 (1 &lt;&lt; PC5)<br />#define KEY1 (1 &lt;&lt; PB0)<br /><br />typedef struct{<br />volatile uint8_t *KPIN;<br />uint8_t key_mask;<br />uint8_t wait_time_s;<br />void (*kfun1)(void);<br />void (*kfun2)(void);<br />uint8_t klock;<br />uint8_t flag;<br />} TBUTTON;<br /><br />volatile uint16_t Timer1, Timer2;<br /><br />void change_led1(void)<br />{<br />PORTD ^= (1 &lt;&lt; PD7);<br />}<br /><br />void change_led2(void)<br />{<br />PORTC ^= (1 &lt;&lt; PC5);<br />}<br /><br />void key_press(TBUTTON *btn);<br /><br />TBUTTON button;<br /><br />int main(void)<br />{<br />DDRD |= LED1;<br />DDRC |= LED2;<br />DDRB &amp;= ~KEY1;<br /><br />PORTB |= KEY1;<br /><br />TCCR1B |= (1 &lt;&lt; WGM12) | (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);<br />OCR1A = 155;<br />TIMSK1 |= (1 &lt;&lt; OCIE1A);<br /><br />button.KPIN = &amp;PINB;<br />button.key_mask = KEY1;<br />button.wait_time_s = 3;<br />button.kfun1 = change_led1;<br />button.kfun2 = change_led2;<br /><br />sei();<br /><br />    while (1) <br />    {<br />key_press(&amp;button);<br /><br />if(!Timer2)<br />{<br />Timer2=50;<br />}<br />    }<br />}<br /><br />void key_press(TBUTTON *btn)<br />{<br />register uint8_t key_press = (*btn-&gt;KPIN &amp; btn-&gt;key_mask);<br /><br />if(!btn-&gt;klock &amp;&amp; !key_press)<br />{<br />btn-&gt;klock=1;<br /><br />// Reakcja na naciśnięcia klawisza<br />if(btn-&gt;kfun1)<br />{<br />btn-&gt;kfun1();<br />btn-&gt;flag = 1;<br />Timer1 = (btn-&gt;wait_time_s*1000)/10;<br />}<br />}<br />else if(btn-&gt;klock &amp;&amp; key_press)<br />{<br />(btn-&gt;klock)++;<br />if(!btn-&gt;klock)<br />{<br />Timer1 = 0;<br />btn-&gt;flag = 0;<br />}<br />}<br />else if(btn-&gt;flag &amp;&amp; !Timer1)<br />{<br />// Dłuższe naciśnięcie klawisza<br />if(btn-&gt;kfun2) btn-&gt;kfun2();<br />btn-&gt;flag = 0;<br />}<br />}<br /><br />ISR(TIMER1_COMPA_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;<br />if(n) Timer1 = --n;<br />n = Timer2;<br />if(n) Timer2 = --n;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 28 sty 2021, o 21:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2021-01-28T11:08:33+01:00</updated>
<published>2021-01-28T11:08:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230793#p230793</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230793#p230793"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230793#p230793"><![CDATA[
Btw - Mirek w YB poruszał kwestię timerów programowych<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 28 sty 2021, o 11:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2021-01-28T10:43:47+01:00</updated>
<published>2021-01-28T10:43:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230792#p230792</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230792#p230792"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230792#p230792"><![CDATA[
Lib Wuenscha jest dosyć kłopotliwy ze względu na alokację dynamiczną więc może coś prostszego. A więc zwykłe dekrementowanie zmiennej w przerwaniu timera i test w pollingu. Dla zachowania jakiejś uniwersalności i nadania cywilizowanego sznytu operacje na zmiennych zostaną zamknięte w funkcjach. Żeby uniknąć narzutu na wywołaniach funkcji, szczególnie z procedur obsługi przerwania, funkcje będą typu inline. Kod (całość jest w pliku ngłówkowym i tak ma być):<br />[syntax=c]/* soft_timer.h */<br /><br />#ifndef SOFT_TIMER_H_<br />#define SOFT_TIMER_H_<br /><br />#include &lt;util/atomic.h&gt;<br />#include &lt;stdint.h&gt;<br /><br />#define TICKS(soft_period,hard_period) ((soft_period)/(hard_period)+(((soft_period)%(hard_period))?1:0))<br /><br />static inline void setInterval(volatile uint16_t *me, uint16_t ticks)<br />{<br />ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />*me = ticks;<br />}<br />}<br /><br />static inline _Bool checkElapsed(volatile uint16_t *me)<br />{<br />_Bool res;<br /><br />ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />res = !*me;<br />}<br />return res;<br />}<br /><br />static inline void doTick(volatile uint16_t *me)<br />{<br />if(*me) {<br />(*me)--;<br />}<br />}<br /><br /><br />#endif /* SOFT_TIMER_H_ */[/syntax]<br /><br />Sposób użycia<br /><br />[syntax=c]/* stałe zdefinowane gdzieś */<br />#define KEY_TICK 10 //czas w milisekundach między sprawdzeniami klawisza<br />#define TIMER_MS 10 //czas przepełnienia timera w milisekundach <br /><br />/* main.c */<br /><br />#include &lt;stdint.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;timer.h&quot;<br /><br /><br />//*********** zmienne *************************<br /><br />volatile uint16_t softTimer0;<br /><br /><br />//*****************************<br />int main()<br />{<br /><br />setInterval(&amp;softTimer0,TICKS(KEY_TICK,TIMER_MS));<br /><br />sei();<br />for(;;)<br />{<br />if(checkElapsed(&amp;softTimer0)) {<br /><br />            /* funkcja wołana co KEY_TICK milisekund */<br />key_service(&amp;key0);<br />setInterval(&amp;softTimer0,TICKS(KEY_TICK,TIMER_MS));<br /><br />}<br />}<br /><br />}<br /><br />/* hardware_timer.c */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;soft_timer.h&quot;<br /><br /><br />uint16_t softTimer0;<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />doTick(&amp;softTimer0);<br />}[/syntax]<br /><br />Gdy odmierzane czasy zmieszczą się w zakresie zmiennej uint8_t (tak jak w podanym przypadku) można zmienną softTimer zrobić ośmiobitową oraz pozbyć się strażników ATOMIC_BLOCK co będzie korzystne wydajnościowo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 28 sty 2021, o 10:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2021-01-27T09:55:27+01:00</updated>
<published>2021-01-27T09:55:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230785#p230785</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230785#p230785"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230785#p230785"><![CDATA[
O busy waits zapomnij. Oczywiście zastosowanie ma timer, ale konkretne implementacje mogą być różne. Poczynając od prymitywnego dekrementowania zmiennej w przerwaniu timera i pollingu w pętli głównej po zastosowanie przepakowanego ficzerami podsystemu w RTOSie lub też coś pomiędzy: <!-- m --><a class="postlink" href="https://www.sax.de/~joerg/avr-timer/" >https://www.sax.de/~joerg/avr-timer/</a><!-- m --> .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 27 sty 2021, o 09:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wonsz]]></name></author>
<updated>2021-01-27T07:22:47+01:00</updated>
<published>2021-01-27T07:22:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230784#p230784</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230784#p230784"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230784#p230784"><![CDATA[
antos, pokaż swój przykładowy kod, pokażemy Ci co jest nie tak, a pomysł przecież jakiś tam podałeś.<br />Jeśli busy loop polega na zawieszeniu działania programu w obsłudze przerwania na 3 sekundy to od razu Ci mówię, że to zła droga.<br />A co do częstości przerwań, nie musisz ich &quot;wołać&quot; co 3 sekundy, przecież wewnątrz przerwania możesz mieć jakąś zmienną static, której wartość będziesz inkrementować w przerwaniu i na jej podstawie będziesz ustalać czy minęły już 3 sekundy, czy nie. <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=2311">wonsz</a> — 27 sty 2021, o 07:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2021-01-26T23:51:00+01:00</updated>
<published>2021-01-26T23:51:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230781#p230781</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230781#p230781"/>
<title type="html"><![CDATA[Re: Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230781#p230781"><![CDATA[
Popatrz na superdebounce Mirka na jego blogu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 26 sty 2021, o 23:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-26T22:53:58+01:00</updated>
<published>2021-01-26T22:53:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230779#p230779</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230779#p230779"/>
<title type="html"><![CDATA[Technika wykrywania długości naciśnięcia przycisku.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23565&amp;p=230779#p230779"><![CDATA[
Witam, w jednym ze swoich projektów chciałbym aby po 3-sekundowym przytrzymaniu przycisku pewna liczba była szybko inkrementowana, a wynik był wyświetlany na LCD. Tutaj pojawia się moje pytanie o technikę wyrywania jak długo dany przycisk jest naciśnięty. No więc pierwszą, rzeczą, która przychodzi mi do głowy jest ustawienie przerwania od timera co sekundę i zapisywanie czasu w sekundach do jakiejś zmiennej. Potem po naciśnięciu przycisku tworzę &quot;busy loop&quot; (tak to się chyba nazywa), sprawdzam czy przycisk dalej jest naciśnięty i czy &quot;czas teraz&quot; - &quot;czas wciśnięcia przycisku&quot; jest większy albo równy 3. Jeżeli tak to wykonuję daną czynność. Drugi sposób, o którym myślałem to kiedy przycisk jest naciśnięty odpalam timer, który po odliczeniu 3 sekund wykonuje daną czynność. Wiem jak ustawić timer aby przerwanie występowało co 3s , ale czy da się ustawić timer w taki sposób aby zaczął odliczać  czas i w momencie odmierzenia 3s wykonał daną czynność? Jakie są jeszcze techniki do wykrywania jak długo klawisz jest naciśnięty (także te bez użycia timera jeżeli taki są)? Jak macie jakiś przykładowy kod w C to nie pogardzę <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />. <br /><br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 26 sty 2021, o 22:53</p><hr />
]]></content>
</entry>
</feed>