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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-08-06T09:42:08+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12546&amp;mode</id>
<entry>
<author><name><![CDATA[sternick]]></name></author>
<updated>2015-08-06T09:42:08+01:00</updated>
<published>2015-08-06T09:42:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136540#p136540</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136540#p136540"/>
<title type="html"><![CDATA[Re: Obsługa przycisku w przerwaniu PCINT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136540#p136540"><![CDATA[
<strong>Krauser</strong>, dziękuję serdecznie za przedstawienie powyższego sposobu i zwrócenie uwagi na błąd. <br /><br />Pozdrawiam!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10300">sternick</a> — 6 sie 2015, o 09:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-08-05T20:57:45+01:00</updated>
<published>2015-08-05T20:57:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136514#p136514</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136514#p136514"/>
<title type="html"><![CDATA[Re: Obsługa przycisku w przerwaniu PCINT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136514#p136514"><![CDATA[
Jak nie będzie drgań styków to nie zadziała. Spróbuj takiego podejścia:<br /><br />[syntax=c]ISR ( PCINT2_vect ) {<br /><br />if (KEY_DOWN &amp; !licznik) {<br />licznik = 10;<br />LED_TOG;<br />}<br />}[/syntax]<br />Zmienną licznik należy z wykorzystaniem timera programowego zmniejszać co 10 ms.<br />[syntax=c]if(licznik) licznik--; //co 10 ms[/syntax] <br /><br />PS.<br />Masz błąd w kodzie:<br />[syntax=c]#define KEY_DOWN ( !( PINC &amp; PC0 ))[/syntax]<br />zamień na:<br />[syntax=c]#define KEY_DOWN ( !( PINC &amp; KEY_PIN ))[/syntax]<br />Działało bo !(coś &amp; 0) jest zawsze prawdą<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 5 sie 2015, o 20:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sternick]]></name></author>
<updated>2015-08-05T14:48:03+01:00</updated>
<published>2015-08-05T14:48:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136495#p136495</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136495#p136495"/>
<title type="html"><![CDATA[Obsługa przycisku w przerwaniu PCINT]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12546&amp;p=136495#p136495"><![CDATA[
Witam,<br /><br />Poniżej zamieszczam dwa kody programu. W pierwszym z nich funkcja załącz/wyłącz realizowana jest pomyślnie za 20-21 razem (zapewne drgania styków i wielokrotne przełączanie). Napisałem więc drugi program, wprowadzając dodatkową zmienną licznik, co rozwiązało problem niepewnego przełączania. Czy takie podejście jak w kodzie nr 2, przy obsłudze klawiszy wykorzystujących przerwanie PCINT, bez delayów, jest właściwe? Z góry dziękuję za odpowiedź.<br /><br />(Mikrokontroler: ATmega 328P)<br /><br />Kod nr 1:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />//definicje LED<br />#define LED_PIN (1&lt;&lt;PD2)<br />#define LED_TOG PORTD ^= LED_PIN//neguj bity<br /><br />//przycisk<br />#define KEY_PIN(1&lt;&lt;PC0)//przerwanie PCINT8<br />#define KEY_DOWN ( !( PINC &amp; PC0 ))<br /><br />int main(void)<br />{<br />PORTB = 0xFF;<br />PORTC = 0xFF;<br />PORTD = 0xFF;<br /><br />DDRD |= LED_PIN;<br />PORTD |= LED_PIN;<br /><br />DDRC &amp;= ~KEY_PIN;<br />PORTC |= KEY_PIN;<br /><br />//konfiguracja PCINT8<br />PCICR |= (1&lt;&lt;PCIE1);<br />PCMSK1 |= (1&lt;&lt;PCINT8);<br /><br />sei();//globalne zezwolenie na obsluge przerwan<br /><br />while(1)<br />{<br />//program<br />}<br />}<br /><br />ISR ( PCINT1_vect )<br />{<br />LED_TOG;<br />}[/syntax]<br /><br />Kod nr 2:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />//definicje LED<br />#define LED_PIN (1&lt;&lt;PD2)<br />#define LED_TOG PORTD ^= LED_PIN//neguj bity<br /><br />//przycisk<br />#define KEY_PIN(1&lt;&lt;PC0)//przerwanie PCINT8<br />#define KEY_DOWN ( !( PINC &amp; PC0 ))<br /><br />int main(void)<br />{<br />PORTB = 0xFF;<br />PORTC = 0xFF;<br />PORTD = 0xFF;<br /><br />DDRD |= LED_PIN;<br />PORTD |= LED_PIN;<br /><br />DDRC &amp;= ~KEY_PIN;<br />PORTC |= KEY_PIN;<br /><br />//konfiguracja PCINT8<br />PCICR |= (1&lt;&lt;PCIE1);<br />PCMSK1 |= (1&lt;&lt;PCINT8);<br /><br />sei();//globalne zezwolenie na obsluge przerwan<br /><br />while(1)<br />{<br />//program<br />}<br />}<br /><br />ISR ( PCINT1_vect )<br />{<br />static uint8_t licznik;<br /><br />if ( KEY_DOWN ){<br />licznik++;<br />if ( licznik == 2 ){<br />LED_TOG;<br />licznik = 0;<br />}<br /><br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10300">sternick</a> — 5 sie 2015, o 14:48</p><hr />
]]></content>
</entry>
</feed>