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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-05-03T23:52:03+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=6956&amp;mode</id>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-05-03T23:52:03+01:00</updated>
<published>2014-05-03T23:52:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=80002#p80002</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=80002#p80002"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania - wyzwalacz aparatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=80002#p80002"><![CDATA[
<div class="quotetitle">Zaba napisał(a):</div><div class="quotecontent"><br />Ja tylko mogę podziękować <br />Super dzięki<br /></div><br />Cieszę się, że się przydało. W sumie o to chodzi w tym forum. Jeden problem, zagadnienie może dać wiedzę wielu ludziom dlatego trzeba się pytać. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />W końcu to nie jakaś tam Anoda czy katoda <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 3 maja 2014, o 23:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2014-05-03T23:46:17+01:00</updated>
<published>2014-05-03T23:46:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=80001#p80001</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=80001#p80001"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania - wyzwalacz aparatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=80001#p80001"><![CDATA[
@sq8dsr za takie wytłumaczenie tematu <br />jak bym mógł to bym wcisnął &quot;POMÓGŁ&quot;,<br />no ale to w gestii kogoś innego leży <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Ja tylko mogę podziękować <br />Super dzięki<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 3 maja 2014, o 23:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Julass]]></name></author>
<updated>2014-05-03T22:40:12+01:00</updated>
<published>2014-05-03T22:40:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79997#p79997</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79997#p79997"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania - wyzwalacz aparatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79997#p79997"><![CDATA[
No i pięknie. Wydaję mi się, że już to rozumiem. Jutro spróbuję napisać stosowny kod i dam znać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1771">Julass</a> — 3 maja 2014, o 22:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-05-03T13:37:35+01:00</updated>
<published>2014-05-03T13:37:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79927#p79927</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79927#p79927"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania - wyzwalacz aparatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79927#p79927"><![CDATA[
Wystarczy Ci jeden timer <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Zresztą 16 bitowy Timer1 marnotrawiony do takich rzeczy to grzech <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />Twój problem wynika z tzw. liniowego podejścia do programowania. Najpierw zadaj sobie pytanie co robi kluczowa dla Twojego projektu funkcja _delay_ms(). Ano nie robi ona NIC. To jest jej istotą. Robienie niczego. Zatrzymuje pracę procesora na określony czas. I tyle. Oczywiście wejście w przerwanie spowoduje wyskoczenie z tej funkcji i obsługę przerwania, ale po zakończeniu obsługi przerwania procesor wróci do wykonywania _delay_ms() czyli do nierobienia nic.<br />Nie da się w ten sposób zakończyć pracy tej funkcji. Procesor po obsłużeniu przerwania wraca w to miejsce na którym przerwał i nic na to nie można poradzić.<br /><br />Trzeba podejść inaczej. Zerwać z liniowym pisaniem programu. Mechanizm wygląda tak:<br /><br />1. Uruchamiamy sobie Timer sprzętowy w trybie CTC ( w AT8 najlepiej chyba będzie Timer2)<br />2. Włączamy przerwanie typu Compare dla tego timera. Tak by wykonywało się np. co 1 ms. (bit OCIE2x w rejetrze TIMSK)<br />3. Włączamy przerwania  globalne - sei()<br />4. Deklarujemy sobie globalną zmienną typu uint16_t np. Timer_programowy i zaopatrujemy ją w specyfikator volatile<br />5. W procedurze obsługi przerwania zwiększamy te zmienną o jeden za każdym razem - Timer_programowy++;<br />6. W pętli głównej programu kontrolujemy &quot;wątki&quot; przez użycie warunku IF np.<br />[syntax=c]if ( Timer_programowy == 5000) {<br />        zpal_diodę();<br />        Timer_programowy = 0;<br />     {[/syntax]<br /><br />Czy widzisz co się teraz będzie działo?<br />Program startuje. Przelatuje przez pętlę główną while(1). I widzi warunek. Czy Timer_programowy jest równy 5000? Nie, oczywiście, że nie jest bo jest równy zero (zmienna globalna jest inicjalizowana zerem). Nie zapala więc diody.<br />Ale nagle nadchodzi przerwanie od Timera2 (sprzętowego). Co się dzieje w jego procedurze? Zwiększa się wartość zmiennej Timer_programowy. Teraz wynosi ona już 1. Ale warunek w pętli głównej dalej jest niespełniony.<br />Po wystąpieniu 5000 przerwań zmienna uzyska wartość 5000 i warunek się spełni. Dioda się zaświeci. A skoro przerwania występują co 1 ms to stanie się to dokładnie 5 sekund po uruchomieniu programu.<br /><br />Może wydaje Ci się to dziwne, i pokręcone. Ale to bardzo uproszczony przykład, zobacz:<br />1. W żadnym miejscu program nie czeka. <br />2. W pętli głównej możesz w ten sposób sprawdzać dziesiątki najróżniejszych warunków.<br />3. Możesz powołać sobie dowolną ilość zmiennych podobnych do timer_programowy i każda będzie sterowała innym procesem.<br />4. To samo przerwanie możesz użyć do multipleksowania wyświetlaczy.<br /><br />Najpierw oswój się z tym mechanizmem. Obsługa klawiszy to następny krok.<br />Przyciski można obsłużyć też timerem. Po prostu rośnięcie zmiennej odmierza czas. I służy do niwelacji drgań styków i nie tylko. <br />Dlatego przeczytaj poradnik Mirka o drganiach styków. OK ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 3 maja 2014, o 13:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Julass]]></name></author>
<updated>2014-05-03T12:26:22+01:00</updated>
<published>2014-05-03T12:26:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79924#p79924</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79924#p79924"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania - wyzwalacz aparatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79924#p79924"><![CDATA[
Układ jest pisany pod Atmega8. Chciałbym, aby jeden przycisk włączał i wyłączał pracę przekaźnika, którego praca polega na załączaniu migawki aparatu w określonych odstępach. <br /><br />W omawianym przeze mnie przykładowym kodzie, przycisk podłączony miałem między masą a pinem PB0. Przekaźnik sterowany był z pinu PC5. Podanie stanu niskiego na ten pin wyzwalało migawkę. Do określenia czasu przerwania między kolejnym wyzwoleniem migawki korzystałem z _delay_ms. Wciśnięcie przycisku powodowało zmianę zmiennej pressed i uruchomienie przerwania INT0. Po uruchomienia przerwania, mimo ponownego wciśnięcia przycisku, program nie wracał do pętli głównej.<br /><br /><br /><strong>sq8dsr</strong> teraz rozumiem, że proponowane przeze mnie rozwiązanie było błędne. Rozumiem, że przycisk i przekaźnik mogą pozostać na swoich miejscach. Muszę tylko zmienić sposób pozbywania się drgań styków. Jaką zmianę powinien powodować wciśnięty przycisk? Załączać cały proces czy tak jak poprzednio zmieniać wartość zmiennej? Timer mam wykorzystać do opóźnień między kolejnymi wyzwoleniami migawki. Czy do tego celu mogę skorzystać z 16bitowego Timera1 w trybie CTC (Timer2 mam zarezerwowany do multipleksowania wyświetlacza)? Nie rozumiem jak powinienem skorzystać z przerwania? Co ma ono zawierać? Możesz napisać na jakiej zasadzie działa przerwanie w twoim projekcie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1771">Julass</a> — 3 maja 2014, o 12:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2014-05-03T03:17:42+01:00</updated>
<published>2014-05-03T03:17:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79909#p79909</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79909#p79909"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79909#p79909"><![CDATA[
Nie potrzebujesz zewnętrznego przerwania do obsługi przycisku. <br />Nawet jeśli ma przerwać działający proces.<br />Jeden Timer sprzętowy w trybie CTC + plus przerwanie z tego timera. <br />Dodatkowo uzyskasz bardzo dokładną podstawę czasu, co przy projekcie, o którym piszesz będzie dodatkowym atutem.<br />I ani razu nie użyjesz funkcji _delay_ms().<br /><br />Obecnie sam projektuję dwa bardzo podobne urządzenia. <br /><br />Na początek:<br /><a href="http://mirekk36.blogspot.com/2012/10/drgania-stykow-to-bajki-wiec-jak-to.html"  class="postlink">http://mirekk36.blogspot.com/2012/10/drgania-stykow-to-bajki-wiec-jak-to.html</a><br /><br />Wszystkie 3 części. Obowiązkowo <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=1589">sq8dsr</a> — 3 maja 2014, o 03:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Juffre]]></name></author>
<updated>2014-05-03T00:12:29+01:00</updated>
<published>2014-05-03T00:12:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79906#p79906</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79906#p79906"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79906#p79906"><![CDATA[
Ale co wywoluje to przerwanie bo nie rozumiem za bardzo tego. Jak masz to wrzuć schemat układu, będzie nam łatwiej pomóc.<br /><br />Nie trzeba zerować bitu w rejestrze DDRB. Domyślnie po resecie bity w rejestrach DDRX mają wartość zero zatem są one wejściami. Jedyne o czym trzeba pamiętać to o włączeniu rezystorów podciągających, a za to odpowiadają rejestry PORTX.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=473">Juffre</a> — 3 maja 2014, o 00:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kaka0204]]></name></author>
<updated>2014-05-03T00:10:49+01:00</updated>
<published>2014-05-03T00:10:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79905#p79905</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79905#p79905"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79905#p79905"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />kaka0204 wydaję mi się, że w przypadku wejścia nie muszę tego robić. Ale dla bezpieczeństwa poprawię.<br /></div><br />Musisz, musisz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Jeżeli nie zadeklarujesz jaki stan będzie na danym pinie, to zapewne będzie tam stan nie ustalony (Hi-Z) <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=889">kaka0204</a> — 3 maja 2014, o 00:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Julass]]></name></author>
<updated>2014-05-03T00:06:46+01:00</updated>
<published>2014-05-03T00:06:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79904#p79904</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79904#p79904"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79904#p79904"><![CDATA[
<strong>kaka0204</strong> wydaję mi się, że w przypadku wejścia nie muszę tego robić. Ale dla bezpieczeństwa poprawię.<br /><br /><strong>Juffre</strong>, też o tym myślałem. Jak już wspominałem jest to moje pierwsze spotkanie z przerwaniami i jeszcze nie bardzo potrafię z nich korzystać. Zaraz to usuwa, ale nie wiem co mogę wstawić w zamian <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />Początkowo chciałem w przerwaniu umieścić tylko pressed=!pressed, ale miałem problem z drganiem styków. Może cała koncepcja programu jest zła?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1771">Julass</a> — 3 maja 2014, o 00:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Juffre]]></name></author>
<updated>2014-05-03T00:08:40+01:00</updated>
<published>2014-05-02T23:58:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79903#p79903</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79903#p79903"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79903#p79903"><![CDATA[
Tak na szybko, nie sprawdzałem całości<br />W funkcji przekaznik masz delaya. A nastepnie ladujesz te funcje do przerwania. Oj nie ładnie, wszystko się zaczyna sypać po takim czymś.<br /><br />Obsługa klawiatury też jest zrobiona jak na mój gust dziwnie. Z częstotliwością obiegu pętli głównej sprawdzasz przycisk.<br />I jezeli byl przycisniety to odbrazu zerujesz pressed, by w kolejnej petli  znowu ja  ustawic.<br /><br />Opowiedz nieco o tym przerwaniu, co je wywoluje?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=473">Juffre</a> — 2 maja 2014, o 23:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kaka0204]]></name></author>
<updated>2014-05-02T23:55:49+01:00</updated>
<published>2014-05-02T23:55:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79902#p79902</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79902#p79902"/>
<title type="html"><![CDATA[Re: Drganie styków w funkcji przerwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79902#p79902"><![CDATA[
Dodaj:<br />[syntax=c]DDRB &amp;= ~(1&lt;&lt;PB0);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=889">kaka0204</a> — 2 maja 2014, o 23:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Julass]]></name></author>
<updated>2014-05-03T11:13:33+01:00</updated>
<published>2014-05-02T23:24:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79901#p79901</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79901#p79901"/>
<title type="html"><![CDATA[Drganie styków w funkcji przerwania - wyzwalacz aparatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6956&amp;p=79901#p79901"><![CDATA[
Witam<br /><br />Po kilku testowych programach zabrałem się za pisanie swojego pierwszego projektu, którym jest czasowy wyzwalacz aparatu (interwalometr). Układ działa na zasadzie zmiany stanu przekaźnika, który jest podłączony do wyzwalacza migawki.<br /><br />Przedstawiony poniżej kod jest jedynie fragmentem całości, odpowiadającym jedynie za samo włączenie funkcji wykonywania zdjęć w określonych odstępach. Funkcja ta powinna się włączać/wyłączać przyciskiem podłączonym między pinem PB0 a masą i trwać aż do ponownego wciśnięcia przycisku.<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 /><br />volatile uint8_t pressed; // sprawdzenie stany przycisku<br />uint8_t klawisz(void); // przycisk wł/wył wykonywanie zdjęć<br />uint8_t przekaznik(void); // funkcja odpowiadająca za wykonywanie zdjęć<br /><br />int main(void)<br />{<br />        PORTB |= (1&lt;&lt;PB0); // pull-up w przycisku wł/wył<br /><br />//przerwania<br />MCUCR |= (1&lt;&lt;ISC01) | (1&lt;&lt;ISC00); // reakcja na zbocze narastające<br />GICR |= (1&lt;&lt;INT0); // zezwolenie na przerwanie, przerwanie na pinie PD2<br /><br />//przekaźnik<br />DDRC |= (1&lt;&lt;PC5);<br />PORTC |= (1&lt;&lt;PC5);<br /><br />sei(); // włączenie globalnego zezwolenia na przerwania<br /><br />while(1)<br />{<br />if(klawisz()){<br />if(pressed==1)<br />pressed=0;<br />else<br />pressed=1;<br />}<br />}<br />}<br /><br />//definicje przerwań i funkcji<br />ISR(INT0_vect){<br />if(pressed==1)<br />przekaznik();<br />else<br />break; // nie kompiluje się z tym (wstawiłem dla lepszej interpretacji kodu<br />}<br /><br />uint8_t klawisz(void){<br />if(!(PINB &amp; 1&lt;&lt;PB0)){<br />_delay_ms(80); // czas drgania styków<br />if(!(PINB &amp; 1&lt;&lt;PB0)) return 1;<br />}<br />return 0;<br />}<br /><br />uint8_t przekaznik(void){<br />PORTC &amp;= ~(1&lt;&lt;PC5); // wyzwolenie migawki<br />_delay_ms(1000); //czas na wykonanie zdjęcia<br />PORTC |= (1&lt;&lt;PC5); // powrót przekaźnika do stanu jałowego<br />for(int i=0;i&lt;interwal;i++){ // zmienna interwal nieokreślona w przykładowym programie<br />_delay_ms(1000);<br />}<br />}[/syntax]<br /><br />Problem polega na tym, że w powyższym programie nie wiem jak wykorzystać funkcję przerwań. Program nie działa jak należy - wpada w nieskończoną pętlę i nie da się wyłączyć funkcji przekaźnik(). Jest to moje pierwsze spotkanie z przerwaniami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1771">Julass</a> — 2 maja 2014, o 23:24</p><hr />
]]></content>
</entry>
</feed>