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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-08-04T06:59:23+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18941&amp;mode</id>
<entry>
<author><name><![CDATA[rafalb]]></name></author>
<updated>2017-08-04T06:59:23+01:00</updated>
<published>2017-08-04T06:59:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193031#p193031</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193031#p193031"/>
<title type="html"><![CDATA[Re: Płynna obsługa klawiszy - zadanie 19. Bluebook]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193031#p193031"><![CDATA[
Niestety to też nie daje odpowiedniego działania. Wpisywałem już także taką samą funkcję zamiast NULL - identycznie.<br />Uprościłem kod do możliwego minimum, aby mogły działać klawisze z diodą. Obecnie kod wygląda jak poniżej.<br />Zamieszczam również klip na którym widać, że początkowo działa to nawet ok, później natomiast nie zawsze jest reakcja na wciśnięte klawisze. <br />Zauważyłem że gdy dany klawisz nie reaguje, należy wcisnąć jeszcze raz drugi po czym temu pierwszemu wraca już życie.<br /><br />Ponieważ używam 8MHz, dla OCR2 ustawiłem 77.<br /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;inttypes.h&gt;<br /><br />#define LED1 (1&lt;&lt;PC3)// zwyk³a dioda LED<br /><br />#define LED1_ON PORTC &amp;= ~LED1<br />#define LED1_OFF PORTC |= LED1<br /><br />#define LED1_DDR DDRC<br /><br />#define KL1 (1&lt;&lt;PD3)<br />#define KL2 (1&lt;&lt;PD4)<br />#define KL_DDR DDRD<br />#define KL_PORT PORTD<br /><br /><br />/************** funkcja SuperDebounce do obs³ugi pojedynczych klawiszy ***************/<br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) );<br /><br />void kl1_press(void);<br />void kl2_press(void);<br /><br /><br /><br />//******************************* definicje zmiennych globalnych i typów<br />volatile uint16_t Timer1;/* timery programowe 100Hz */<br /><br /><br />/*----------------------------- g³ówna funkcja programu  ---------------*/<br />int main(void) {<br /><br /><br />/*----------------------------- inicjalizacja kierunków pinów  ---------------*/<br />// ustalamy kierunki portów klawiszy na wyjœciowe<br />KL_DDR &amp;= ~(KL1|KL2);<br />// w³¹czamy podci¹ganie do VCC<br />KL_PORT |= KL1|KL2;<br /><br />// ustalamy kierunki pinów diod LED<br />LED1_DDR |= LED1;<br />// wy³¹czay diodê<br />LED1_OFF;<br /><br /><br /><br />/*----------------------------- inicjalizacja przerwañ  ---------------*/<br /><br />/* Timer2 – inicjalizacja przerwania co 10ms */<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb pracy CTC<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br />OCR2 = 77;// przerwanie porównania co 10ms (100Hz)<br />TIMSK = (1&lt;&lt;OCIE2);// Odblokowanie przerwania CompareMatch<br /><br /><br />/*----------------------------- inicjalizacja modu³ów programowych  ---------------*/<br /><br />/* globalne  odblokowanie przerwañ */<br />sei();<br /><br /><br />uint8_t k1, k2;<br /><br />while(1) {<br /><br />SuperDebounce(&amp;k1, &amp;PIND, KL1, 0, 500, kl1_press, NULL );<br />SuperDebounce(&amp;k2, &amp;PIND, KL2, 0, 400, kl2_press, NULL );<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 />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) ) {<br /><br />enum {idle, debounce, go_rep, wait_rep, rep};<br /><br />if(!rep_time) rep_time=20;<br />if(!rep_wait) rep_wait=150;<br /><br />uint8_t key_press = !(*KPIN &amp; key_mask);<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 />}<br />}<br />if( *key_state&gt;=3 &amp;&amp; !key_press ) *key_state = idle;<br />}<br /><br /><br />void kl1_press(void) {<br />LED1_ON;<br />}<br /><br />void kl2_press(void) {<br />LED1_OFF;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17569">rafalb</a> — 4 sie 2017, o 06:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2017-08-03T20:59:52+01:00</updated>
<published>2017-08-03T20:59:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193007#p193007</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193007#p193007"/>
<title type="html"><![CDATA[Re: Płynna obsługa klawiszy - zadanie 19. Bluebook]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193007#p193007"><![CDATA[
<div class="quotetitle">rafalb napisał(a):</div><div class="quotecontent"><br />Czy to tak &quot;oryginalnie&quot; ma wyglądać?<br /></div><br />Nie.<br />Argumentami funkcji SuperDebounce są funkcje uruchamiane albo przy wciśnięciu albo przy trzymaniu. Ta pierwsza wykonuje się od razu, a druga cyklicznie. Zobacz czy wstawiłeś odpowiednią funkcję. Jeśli 2 sposób wywołania nie jest używany wpisz NULL.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 3 sie 2017, o 20:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rafalb]]></name></author>
<updated>2017-08-03T20:43:20+01:00</updated>
<published>2017-08-03T20:43:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193005#p193005</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193005#p193005"/>
<title type="html"><![CDATA[Płynna obsługa klawiszy - zadanie 19. Bluebook]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18941&amp;p=193005#p193005"><![CDATA[
Witajcie!<br /><br />Całkiem niedawno ogarnąłem sobie książkę Bluebook i zaczynam programować AVRy. Zacząłem już wymyślać własne projekty, w między czasie czytając dalej książkę. Do pewnego czasu wszystko działało w porządku, ale zatrzymałem się na obsłudze klawiszy we Wstępie do systemów czasu rzeczywistego. Mianowicie chciałbym zrobić tak aby klawisze włączające i wyłączające zwykłą diodę LED działały płynnie w sensie Klik i świeci - Klik i gaśnie. Obecnie sprawa ma się tak, że muszę przytrzymać przycisk ok 1,5 sekundy i świeci - drugi przycisk 1,5 sekundy i gaśnie. Jeżeli zaklikam jakiś krócej, szybciej wtedy już działa jeszcze gorzej.<br /><br />Czy to tak &quot;oryginalnie&quot; ma wyglądać? Wewnętrzny oscylator ustawiłem na 8MHz, JTAG wyłączony. Czy może jednak jako początkujący coś pominąłem? <br /><br />Bardzo proszę o radę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17569">rafalb</a> — 3 sie 2017, o 20:43</p><hr />
]]></content>
</entry>
</feed>