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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-11-05T21:15:28+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=19547&amp;mode</id>
<entry>
<author><name><![CDATA[JackeyBoy]]></name></author>
<updated>2017-11-05T21:15:28+01:00</updated>
<published>2017-11-05T21:15:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198390#p198390</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198390#p198390"/>
<title type="html"><![CDATA[Re: Problem z obsługą klawiszy [ATmega 328P]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198390#p198390"><![CDATA[
Zgadza się, dzięki wielkie. Lecę zatem analizować swoją wariację, w razie problemów umieszczę ją tutaj z zapytaniem.<br />Pozdrawiam <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=14941">JackeyBoy</a> — 5 lis 2017, o 21:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2017-11-05T20:21:04+01:00</updated>
<published>2017-11-05T20:21:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198380#p198380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198380#p198380"/>
<title type="html"><![CDATA[Re: Problem z obsługą klawiszy [ATmega 328P]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198380#p198380"><![CDATA[
WGM12 nie znajduje się w rejestrze TCCR1A tylko w TCCR1B dlatego powinieneś napisać tak:<br />[syntax=c]TCCR1B  |= (1&lt;&lt;WGM12); // tryb pracy CTC[/syntax]<br />Drobny błąd i w tym momencie timer ten pracuje w trybie normal zamiast CTC.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 5 lis 2017, o 20:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JackeyBoy]]></name></author>
<updated>2017-11-05T19:21:22+01:00</updated>
<published>2017-11-05T19:21:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198376#p198376</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198376#p198376"/>
<title type="html"><![CDATA[Problem z obsługą klawiszy [ATmega 328P]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19547&amp;p=198376#p198376"><![CDATA[
Witajcie, <br /><br />śledząc poradnik P. Mirka nt. obsługi klawiszy ze zwłoką czasową skopiowałem program, implementując tylko zmiany związane z innymi nazwami rejestrów i użytkowaniem innych pinów w ATmega 328P. <br /><br />Funkcja obsługująca cyklicznie mruganie diodą niezależnie od programu działa, funkcja reakcji na krótkie kliknięcie również, natomiast zwłoka czasowa już nie działa tak, jak powinna. Co może byc przyczyną? <br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2012-10-05<br /> *       Autor: Mirosław Kardaś<br /> *       ATmega32: F_CPU = 11,0592 MHz<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#define LED2 (1&lt;&lt;PD7)<br />#define LED3 (1&lt;&lt;PD6)<br />#define LED4 (1&lt;&lt;PD5)<br />#define LEDT (1&lt;&lt;PD3)<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 />// timery programowe<br />volatile uint16_t Timer1, Timer2;<br /><br />// własne funkcje użytkownika<br />void change_led1(void) {<br />PORTD ^= LED2;<br />}<br /><br />void change_led2(void) {<br />PORTD ^= LED4;<br />}<br /><br />void test(void)<br />{<br />PORTD ^= LEDT;<br /><br />}<br />// funkcja obsługi pojedynczych klawiszy<br />void key_press( TBUTTON * btn );<br /><br /><br />TBUTTON button; // definicja KLAWISZA<br /><br />//------------------------------------------------------------------<br />int main(void) {<br /><br />PORTB |= KEY1; // podciągamy linie klawiszy do VCC<br />DDRD |= LED2 | LED3 | LED4;  // piny LED jako WYjścia<br /><br />/* Timer2 – konfigurcajca silnika timerów programowych */<br />TCCR1A  |= (1&lt;&lt;WGM12); // tryb pracy CTC<br />TCCR1B  |= (1&lt;&lt;CS11)|(1&lt;&lt;CS10); // preskaler = 64<br />OCR1A = 1249; // przerwanie porównania co 10ms (100Hz)<br />TIMSK1 = (1&lt;&lt;OCIE1A); // Odblokowanie przerwania CompareMatch<br /><br />button.KPIN = &amp;PINB;<br />button.key_mask = KEY1;<br />button.wait_time_s = 1;<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 />// przykładowy niezależny i nieblokujący proces<br />if( !Timer2 ) {<br />Timer2=50;<br />PORTD ^= LED3;<br />}<br /><br />}<br /><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 />btn-&gt;klock=1;<br /><br />// reakcja na PRESS krótkie wcinięcie klawisza<br />if(btn-&gt;kfun1) 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 />(btn-&gt;klock)++;<br />if( !btn-&gt;klock ) {<br />Timer1=0;<br />btn-&gt;flag=0;<br />}<br />} else if( btn-&gt;flag &amp;&amp; !Timer1 ) {<br />// reakcja na dłuższe wcinięcie klawisza<br />if(btn-&gt;kfun2) btn-&gt;kfun2();<br />btn-&gt;flag=0;<br />}<br />}<br /><br />//*** przerwanie Timer2 CompareM<br />ISR(TIMER1_COMPA_vect) {<br /><br />uint16_t n;<br />n = Timer1;   /* 100Hz Timer1 */<br />if (n) Timer1 = --n;<br />n = Timer2;   /* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />}[/syntax]<br /><br />Wygląda to trochę tak, jakby nie dochodziło nigdzie do [Uruchamiania / Dekrementacji] licznika programowego odpowiedzialnego za zliczanie zwłoki czasowej. <br /><br />Proszę o pomoc <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=14941">JackeyBoy</a> — 5 lis 2017, o 19:21</p><hr />
]]></content>
</entry>
</feed>