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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-09-29T22:47:53+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=4334&amp;mode</id>
<entry>
<author><name><![CDATA[kidcowboy]]></name></author>
<updated>2013-09-29T22:47:53+01:00</updated>
<published>2013-09-29T22:47:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4334&amp;p=51369#p51369</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4334&amp;p=51369#p51369"/>
<title type="html"><![CDATA[Re: Obsługa Klawiszy Eliminacja drgań styków i ognia piekiel]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4334&amp;p=51369#p51369"><![CDATA[
hmm w sensie jak Timer obsługiwał klawisze ??bo już tego za bardzo nie rozumiem <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=313">kidcowboy</a> — 29 wrz 2013, o 22:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kidcowboy]]></name></author>
<updated>2013-09-29T22:01:07+01:00</updated>
<published>2013-09-29T22:01:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4334&amp;p=51366#p51366</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4334&amp;p=51366#p51366"/>
<title type="html"><![CDATA[Obsługa Klawiszy Eliminacja drgań styków i ognia piekielnego]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4334&amp;p=51366#p51366"><![CDATA[
Witam, mam taki problem z którego nie za bardzo wiem jak wybrnąć otóż :<br />Mam 5 klawiszy które mają realizować 5 funkcji - na zasadzie po naciśnięciu odpowiedniego załącz diode 1 na np.7 sekund a następnie zapal diodę 2 ( na 5 min) i wyłącz diodę 1. Przeczytałem artykuły o drganiu styków i superskoczka ( superdebounce z BlueBiblioBooka ) - ale w moim przypadku moja modyfikacja nie działa .. hmmm i chyba nawet wiem gdzie ale TONĘ !! brakuje mi pomysłu - otóż wydaje mi się że moja funkcja led1_xor &quot; nie rebiota&quot; gdyż jest wykonywana w momencie gdy klawisz jest wciśnięty a przestaje gdy jest zwolniony ? ( tu mam wątpliwości ) - z góry dziękuję za pomoc ( wskazówkę cokolwiek ) <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />init.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;init.h&quot;<br /><br />ISR(TIMER0_COMP_vect)<br />{<br />uint16_t n1,n2;<br /><br />n1 = Timer1;/* 100Hz Timer1 */<br />if (n1) Timer1 = --n1;<br />n2 = Timer2;/* 100Hz Timer2 */<br />if (n2) Timer2 = --n2;<br />}<br /><br /><br /><br />void key_press(uint8_t * klock, volatile uint8_t *KPIN, uint8_t key_mask, void (*fun)(void) )<br /><br />{<br /><br />    register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br />    if(!*klock &amp;&amp; !key_press)<br />    {<br /><br />    *klock=1;<br />    if(fun)fun();<br /><br />    }<br />    else if (*klock &amp;&amp; key_press)(*klock)++;<br /><br />}<br /><br />void key_init(void) {<br />    PORTA |= KEY_1|KEY_2|KEY_3|KEY_4|KEY_5|KEY_6;<br />}<br />void led_init(void){<br />DDRB |= LED_1|LED_2|LED_3|LED_4|LED_5|LED_6|LED_7|LED_8;<br />PORTB|=LED_1|LED_2|LED_3|LED_4|LED_5|LED_6|LED_7|LED_8;<br />}<br />void timer_init (void){<br />/* Timer0 – inicjalizacja przerwania co 10ms */<br />TCCR0 |= (1&lt;&lt;WGM01);// tryb pracy CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1024<br />OCR0 = 77;// przerwanie porównania co 10ms (100Hz) 108<br />TIMSK |= (1&lt;&lt;OCIE0);// Odblokowanie przerwania CompareMatch<br />sei();<br />}[/syntax] <br /><br />init.h<br />[syntax=c]#include &lt;avr/io.h&gt;<br /><br />#ifndef INIT_H_<br />#define INIT_H_<br /><br />void key_init(void);<br />#define KEY_1 (1&lt;&lt;PA0)<br />#define KEY_2 (1&lt;&lt;PA1)<br />#define KEY_3 (1&lt;&lt;PA2)<br />#define KEY_4 (1&lt;&lt;PA3)<br />#define KEY_5 (1&lt;&lt;PA4)<br />#define KEY_6 (1&lt;&lt;PA5)<br /><br />#define LED_1  (1&lt;&lt;PB0)<br />#define LED_2  (1&lt;&lt;PB1)<br />#define LED_3  (1&lt;&lt;PB2)<br />#define LED_4  (1&lt;&lt;PB3)<br />#define LED_5  (1&lt;&lt;PB4)<br />#define LED_6  (1&lt;&lt;PB5)<br />#define LED_7  (1&lt;&lt;PB6)<br />#define LED_8  (1&lt;&lt;PB7)<br /><br /><br />void key_press(uint8_t * klock, volatile uint8_t *KPIN, uint8_t key_mask, void (*fun)(void) );<br /><br />void key_init(void);<br />void led_init(void);<br />void timer_init(void);<br /><br /><br />volatile uint16_t Timer1, Timer2;/* timery programowe 100Hz */<br /><br /><br />#endif /* INIT_H_ */[/syntax]<br /><br />main.c<br />[syntax=c]#include &quot;init.h&quot;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />uint8_t key1_lock,key2_lock,key3_lock,key4_lock,key5_lock,key6_lock;<br /><br />// oczywicie wiem że zgodnie z zasadą dobrego pisania powinienem tu zrobić deklarację f(x) a nie definicję ale to tak na szybko - wiem też wbrew zasady<br />void led1_xor(void)<br />{<br /><br />if(!Timer2)<br />{<br />Timer2=100;<br />PORTB ^=LED_2;<br />PORTB ^=LED_1;<br />}<br />if(!Timer1)<br />{<br />Timer1=200;<br />PORTB ^=LED_5;<br />}<br />}<br /><br /><br />int  main(void)<br />{<br /><br />key_init();<br />led_init();<br />timer_init();<br /><br />while(1)<br />{<br /><br /><br />key_press(&amp;key1_lock,&amp;PINA,KEY_1,led1_xor);<br /><br /><br />}<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=313">kidcowboy</a> — 29 wrz 2013, o 22:01</p><hr />
]]></content>
</entry>
</feed>