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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-03-08T17:58:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=10980&amp;mode</id>
<entry>
<author><name><![CDATA[Pan Ziemniak]]></name></author>
<updated>2015-03-08T17:58:29+01:00</updated>
<published>2015-03-08T17:58:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122623#p122623</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122623#p122623"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy za pomocą przerwań]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122623#p122623"><![CDATA[
<div class="quotetitle">elerbe napisał(a):</div><div class="quotecontent"><br />Dziękuję za bieżące podpowiedzi, jednak ciągle program nie działa jak należy- poprawiłem błędy wskazane przez wwojtek, jednak ciągle coś nie tak. Myślę, że problem jest w przerwaniach od timer0, ponieważ jeżeli wrzucę zmianę diody w przerwaniu to dioda miga co jakąś sekundę- a z mojej logiki: 1MHz z procka / 1024 z preskalera to jakieś 0,001 sekundy.... przez to , że nie zlicza czasu nie inkrementuje zmiennej flag, i program nie rusza. Gdzie może być błąd? Źle policzyłem czas wywołania przerwania?<br /></div><br /><br />Procesor wchodzi w przerwanie z częstotliwościę 1Mhz/1024(prescaler)/256, czyli jakieś 4Hz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8755">Pan Ziemniak</a> — 8 mar 2015, o 17:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-03-08T17:53:17+01:00</updated>
<published>2015-03-08T17:53:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122621#p122621</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122621#p122621"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy za pomocą przerwań]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122621#p122621"><![CDATA[
<div class="quotetitle">elerbe napisał(a):</div><div class="quotecontent"><br />jeżeli wrzucę zmianę diody w przerwaniu to dioda miga co jakąś sekundę<br /></div>A nie &quot;wrzucasz&quot; czasem wewnątrz warunku ze zmienną &quot;flag&quot;? Wtedy by pasowało <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez Gość — 8 mar 2015, o 17:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elerbe]]></name></author>
<updated>2015-03-08T17:39:55+01:00</updated>
<published>2015-03-08T17:39:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122618#p122618</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122618#p122618"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy za pomocą przerwań]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122618#p122618"><![CDATA[
Dziękuję za bieżące podpowiedzi, jednak ciągle program nie działa jak należy- poprawiłem błędy wskazane przez wwojtek, jednak ciągle coś nie tak. Myślę, że problem jest w przerwaniach od timer0, ponieważ jeżeli wrzucę zmianę diody w przerwaniu to dioda miga co jakąś sekundę- a z mojej logiki: 1MHz z procka / 1024 z preskalera to jakieś 0,001 sekundy.... przez to , że nie zlicza czasu nie inkrementuje zmiennej flag, i program nie rusza. Gdzie może być błąd? Źle policzyłem czas wywołania przerwania?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5342">elerbe</a> — 8 mar 2015, o 17:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-03-08T16:06:13+01:00</updated>
<published>2015-03-08T16:06:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122591#p122591</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122591#p122591"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy za pomocą przerwań]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122591#p122591"><![CDATA[
Tak na szybko:<br />1. Bity &quot;ISC<strong>1</strong>0&quot; i &quot;ISC<strong>1</strong>1&quot; dotyczą przerwania INT<strong>1</strong> nie INT0. <br />2. W rejestrze GIFR nie ma bitu INT0. <br />3. Flaga przerwania czyści się &quot;z automatu&quot; po wejściu w jego obsługę. Gdybyś z jakiś względów potrzebował zrobić to &quot;ręcznie&quot; to zerowanie następuje po wpisaniu <strong>jedynki</strong>.<br />4. Najpierw skonfiguruj wejście PD potem włącz przerwanie zewnętrzne.<br />5. Wyłączanie timera, włączanie INT0 i zerowanie flagi powinno być chyba poza wyrażeniem warunkowym związanym z PIND (w przerwaniu timera). Wydaje mi się, że miałoby to wtedy &quot;większe&quot; ręce i nogi.<br /><br />@<strong>Ds3</strong> - jak to gdzie? Może trochę pokręcona ale jak najbardziej jest (oparta o przerwanie timera).<p>Statystyki: Napisane przez Gość — 8 mar 2015, o 16:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Pan Ziemniak]]></name></author>
<updated>2015-03-08T15:50:36+01:00</updated>
<published>2015-03-08T15:50:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122586#p122586</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122586#p122586"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy za pomocą przerwań]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122586#p122586"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />GIFR &amp;=~ (1&lt;&lt;INT0);     // zeruj flagę timera<br /></div><br /><br />Do czego służy ta linia?<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">while (1)<br />        {<br />                PORTA |= 0x0f;                  // wyzerowanie stanu diod <br />                PORTA &amp;=~ i;                    // wyświetl wartosc na diodach <br />        }</div><br />Wie Pan jak to działa? I tak używa Pan timera, nie lepiej to tam umieścić? Zdarzenia są tak rzadko, że nie ma co męczyć uC.<br /><br />Ogólnie to bym proponował Panu zacząć od metody dużo prostszej. Czyli ustawienie timera w tryb CTC, przerwanie co około 10ms. Co te 10ms porównywać stan klawisza ze stanem poprzednim, jeśli będzie inny, to rozpocząć zliczanie do 50ms i dopiero wtedy sygnalizować zmianę stanu przycisku. Koncepcyjnie dość proste.<br /><br /><br /><div class="quotetitle">Ds3 napisał(a):</div><div class="quotecontent"><br />A gdzie eliminacja drgań styków klawisza?<br />Może spróbuj do obsługi klawisza wykorzystać kod z tej strony: <!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html" >http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html</a><!-- m --><br /><br /><br />Pozdrawiam!<br /></div><br />To tam akurat jest zaszyte. Proszę zerknąć w przerwanie timera.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8755">Pan Ziemniak</a> — 8 mar 2015, o 15:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ds3]]></name></author>
<updated>2015-03-08T15:46:44+01:00</updated>
<published>2015-03-08T15:46:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122584#p122584</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122584#p122584"/>
<title type="html"><![CDATA[Re: Obsługa klawiszy za pomocą przerwań]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122584#p122584"><![CDATA[
A gdzie eliminacja drgań styków klawisza?<br />Może spróbuj do obsługi klawisza wykorzystać kod z tej strony: <!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html" >http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html</a><!-- m --><br /><br /><br />Pozdrawiam!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1783">Ds3</a> — 8 mar 2015, o 15:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elerbe]]></name></author>
<updated>2015-03-08T14:56:49+01:00</updated>
<published>2015-03-08T14:56:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122573#p122573</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122573#p122573"/>
<title type="html"><![CDATA[Obsługa klawiszy za pomocą przerwań]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10980&amp;p=122573#p122573"><![CDATA[
Witam, chciałem dokonać obsługi klawisza bez delay'ów. Wciśnięcie klawisza miało wywoływać zewnętrzne przerwanie, które zezwalało na pracę przerwania wewnętrznego (od Timer0). Oto mój kod: <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br />volatile uint8_t i;<br /><br />int main (void){<br /><br /><br />// zewnętrzne przerwanie INT0 - PD2<br />MCUCR |= (1&lt;&lt;ISC11);<br />MCUCR &amp;=~ (1&lt;&lt;ISC10);<br />GICR |= (1&lt;&lt;INT0); // zezwolenie na przerwanie<br /><br />// utawienia przerwania NORMAL od Timer0,<br />TCCR0 &amp;=~ ((1&lt;&lt;WGM00) | (1&lt;&lt;WGM01)); // przerwanie normal<br />TCCR0 |= (1&lt;&lt;CS00) | (1&lt;&lt;CS02);<br />TCCR0 &amp;=~ (1&lt;&lt;CS01); // preskaler 1024, przerwanie co około 0,001 s<br /><br /><br /><br />sei();<br /><br />DDRA |= (1&lt;&lt;PA0) | (1&lt;&lt;PA1) | (1&lt;&lt;PA2) | (1&lt;&lt;PA3); // KIERUNEK PORTU- wyjscie- diody<br /><br />DDRD &amp;=~ (1&lt;&lt;PD2); // KIERUNEK PORTU- wejscie - klawisz<br />PORTD |= (1&lt;&lt;PD2); // podciagniecie do VCC<br /><br /><br /><br />while (1)<br />{<br />PORTA |= 0x0f;// wyzerowanie stanu diod<br />PORTA &amp;=~ i;// wyświetl wartosc na diodach<br />}<br /><br />}<br /><br /><br />ISR (INT0_vect)<br />{<br />TIMSK |= (1&lt;&lt;TOIE0);// zezwolenie na przerwanie od Timera<br />GICR &amp;=~ (1&lt;&lt;INT0);// wyłączenie przerwań zewnętrznych<br />GIFR &amp;=~ (1&lt;&lt;INT0); // zeruj flagę timera<br />}<br /><br /><br /><br /><br />ISR (TIMER0_OVF_vect)<br />{<br />static uint8_t flag;<br /><br />flag++;// inkrementuj zmienną<br />if (flag==100)// jeżeli zmienna = 100 (0,1s) sprawdź stan klawisza<br />{<br />if (! (PIND &amp; (1&lt;&lt;PD2)))<br />{<br />i++;// inkrementuj i<br />if(i&gt;15)i=0;<br />flag = 0;// zeruj flagę<br />TIMSK &amp;=~ (1&lt;&lt;TOIE0);// wyłącz przerwanie od TIMER0<br />GICR |= (1&lt;&lt;INT0);// zezwolenie na przerwanie zewnętrzne<br />}<br />}<br />}[/syntax]<br /><br />Wartość binarna zmiennej 'i' ma być wyświetlana na diodach, to działa i jest dobrze- problem jest z obsługą klawisza, a tak właściwie nieumiejętnie posłużyłem się przerwaniami i nie wiem co się dzieje. Otóż po wciśnięciu klawisza nic się nie dzieje. Jeżeli dodam inkrementację i w każdym przerwaniu to stan wzrasta, co jakaś sekundę? Czyli coś nie tak... na dodatek jeżeli trzymam klawisz to inkrementacjna ciągle zachodzi chociaż nie powinna (bo przerwanie zewnętrze wywoływane jest opadającym zboczem).<br />Może ktoś widzi błąd jaki popełniłem?<br />Dodam, że procesor to ATmega16 taktowana wewnętrznym zegarem 1MHz (takie polecenie).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5342">elerbe</a> — 8 mar 2015, o 14:56</p><hr />
]]></content>
</entry>
</feed>