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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-02-26T21:46:45+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=21988&amp;mode</id>
<entry>
<author><name><![CDATA[karlowic]]></name></author>
<updated>2019-02-26T21:46:45+01:00</updated>
<published>2019-02-26T21:46:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216930#p216930</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216930#p216930"/>
<title type="html"><![CDATA[Re: Przerwanie zewnetrzne INT0 a funkcja _delay_ms]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216930#p216930"><![CDATA[
<div class="quotetitle">miki53 napisał(a):</div><div class="quotecontent"><br />może w ten sposób ( piszę bez sprawdzania kodu - sprawdz sam )<br /></div><br />Właśnie złożyłem układ na ATB 1.05 i sprawdziłem. Działa jak napisałeś. Najprostsze rozwiązania są najlepsze.<br />Opóźnienie 500ms jest niewidoczne dla oka ale wystarczające, żeby przełącznik działał jak należy.<br />Wszystkim dziękuję za pomoc. Problem rozwiązany.<br /><div class="quotetitle">miki53 napisał(a):</div><div class="quotecontent"><br />sprubuj zamienić miejscami _delay_ms(100); z PORTB ^= OUT;<br /></div><br />Sprawdziłem program bez zamiany miejscami tych linii i też działa prawidłowo.<br /><div class="quotetitle">zubik napisał(a):</div><div class="quotecontent"><br />Poza tym 100mS to może być trochę mało.<br /></div><br />Kluczowym problemem był za krótki czas opóźnienia. Po wprowadzeniu 500ms program działa prawidłowo.<br />INT0 jeśli nawet przerywa działanie funkcji _delay_ms() (a przerywa na pewno) to i tak wraca do niej z powrotem i nic się nie zmienia (flaga dalej będzie równa 1). <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=9685">karlowic</a> — 26 lut 2019, o 21:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2019-02-24T22:06:06+01:00</updated>
<published>2019-02-24T22:06:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216878#p216878</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216878#p216878"/>
<title type="html"><![CDATA[Re: Przerwanie zewnetrzne INT0 a funkcja _delay_ms]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216878#p216878"><![CDATA[
Witam,<br />może spróbuj tak:<br />[syntax=c]#define CZEKANIE 200 // odstep ms, pomiedzy realizacja zadań zawartych w przerwaniu INT[/syntax]<br />włącz przerwanie co 1ms,<br />w przerwaniu timera co 1 ms dekrementuj zmienną np: [syntax=c]{if(czekanie) czekanie--;} // czas od ostatniego przerwania INT.[/syntax] co 1 ms zmienna dąży do '0' od zadanej wartości.<br />a w kodzie obslugi realizacjii INT'a : [syntax=c]{ if(!czekanie) PORTB^=OUT;<br /> czekanie=CZEKANIE; // odwlekanie wykonania powyższego ifa.<br />}[/syntax] jeżeli jest przerwanie od INT'a, to <strong>zawartość ifa</strong> wykona sie dopiero wtedy gdy uplynie określony w 'CZEKANIE' czas od poprzedniego przerwania INT'a. jeżeli nie uplynął (przesuwane palce), to za każdym razem ustawi się czas oczekiwania na zadaną wartosć, a zadanie będzie odwleczone o następne 'CZEKANIE'_ms pomimo powtórnego wywolania przerwania INT.<br /><br /><strong>Przesuwane palce będą wywoływać przerwanie INT, ale też będą odwlekać wykonanie poleceń w nim zawartych.</strong><br /><br />oczywiściew możnaby uformować to w funkcję prostą do używania w kolejnych liniach kodu- kolejnych zadaniach.<br />[syntax=c]zadanie_czujnika(odstep_czasu_ms, fun );// wymagany odstęp czasu pomiędzy eventem, callback jeżeli zdążyl uplynąć czas.[/syntax]<br /><br />trochę nagryźmoliłem, ale finalnie to kilka linijek kodu.<br />taka myśl. <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=11549">Daro69</a> — 24 lut 2019, o 22:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Szofer]]></name></author>
<updated>2019-02-24T21:11:55+01:00</updated>
<published>2019-02-24T21:11:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216876#p216876</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216876#p216876"/>
<title type="html"><![CDATA[Re: Przerwanie zewnetrzne INT0 a funkcja _delay_ms]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216876#p216876"><![CDATA[
Poco zamrażać wejście, ustawiasz flage na 1 i nie ważne ile razy w ciagu 1sekundy bo caly czas bedzie 1, ważne aby stan wyjścia się nie zmieniał tyle razy co wejście w czasie np 1 sekundy, dlatego zeruj flage na samym końcu. Lub np licznikiem w innym if-ie<br /><br />if ( tnc ==100 &amp;&amp; flaga ==1) flaga = 0 ;<br /><br />Tak można zerować globalną flagę np od wszystkich przerwań.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7664">Szofer</a> — 24 lut 2019, o 21:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miki53]]></name></author>
<updated>2019-02-22T18:13:31+01:00</updated>
<published>2019-02-22T18:13:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216832#p216832</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216832#p216832"/>
<title type="html"><![CDATA[Re: Przerwanie zewnetrzne INT0 a funkcja _delay_ms]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216832#p216832"><![CDATA[
Czujnik Ci wariuje gdy rozszerzysz palce ręki bo każdy palec czujnik odbiera jako przeszkodę<br />a przestrzeń między palcami jako wolną przestrzeń , w ten sposób szybko ( 4 krotnie )<br />wysterowujesz czujnik który włącza i włącza Ci przekażnik i żarówa mruga zamiast się <br />włączyć lub wyłączyć<br /><br />Zamknięta dłoń jest odbierana przez czujnik jako 1 przeszkoda a palce jako 4 przeszkody <br /><br />w tym tempie wywołujesz przerwanie <br />teraz trzeba zrobić tak aby to szybkie przełączanie wywołane palcami nie miało wpływu <br />na przekażnik<br /><br />może w ten sposób ( piszę bez sprawdzania kodu - sprawdz sam )<br /><br />[syntax=c]#define IN  (1&lt;&lt;PB1)<br />    #define OUT (1&lt;&lt;PB2)<br />     <br />    volatile uint8_t flaga;<br />     <br />    int main(void)<br />    {<br />      DDRB |= OUT;          // ustawienie pinów jako wyjście<br />      PORTB &amp;= ~OUT;        // ustawienie przekaźnika na pozycji wyłącz<br />     <br />      GIMSK |= (1&lt;&lt;INT0);   // aktywacja przerwania INT0<br />      MCUCR |= (1&lt;&lt;ISC01);  // przerwanie na fali opadającej<br />      PORTB |= IN;          // pull-up wejścia INT0<br />     <br />      sei();                // globalne włączenie przerwań<br />     <br />      while(1)<br />        {<br />          if ( flaga == 1 ) <br />            {<br />              _delay_ms(500);       //odczekac 100ms, aby przeczekac niepożądaną zmianę stanu czujnika   ( PRZESUNIĘCIE RĘKI )<br />              PORTB ^= OUT;         //zmiana pozycji przekaźnika<br />              flaga = 0;            //ustawienie flagi na stan czuwania<br />            }<br />        }<br />    }<br />     <br />    ISR (INT0_vect)<br />    {<br />            flaga = 1;      //zmiana flagi przy<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18503">miki53</a> — 22 lut 2019, o 18:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[uksta1024]]></name></author>
<updated>2019-02-22T13:45:26+01:00</updated>
<published>2019-02-22T13:45:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216818#p216818</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216818#p216818"/>
<title type="html"><![CDATA[Re: Przerwanie zewnetrzne INT0 a funkcja _delay_ms]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216818#p216818"><![CDATA[
Wyłącz zezwolenie na globalne przerwania po if , włącz je przy wyjściu z If.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19660">uksta1024</a> — 22 lut 2019, o 13:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[karlowic]]></name></author>
<updated>2019-02-22T10:33:20+01:00</updated>
<published>2019-02-22T10:33:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216814#p216814</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216814#p216814"/>
<title type="html"><![CDATA[Re: Przerwanie zewnetrzne INT0 a funkcja _delay_ms]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216814#p216814"><![CDATA[
<div class="quotetitle">miki53 napisał(a):</div><div class="quotecontent"><br />w tym układzie nigdy nie będziesz miał zwłoki bo PIERW WŁĄCZASZ PRZEKAŻNIK A POTEM CZEKASZ<br /></div><br />Nie chodzi mi o zwłokę w działaniu włącznika ale co dzieje się po tym działaniu.<br /><br /><div class="quotetitle">zubik napisał(a):</div><div class="quotecontent"><br />blokujesz sobie program na te 100ms<br /></div><br />Właśnie o to mi chodzi w tym programie.<br />Światło zapala się po machnięciu ręką. Jeśli palce przylegają do siebie, jest jeden długi impuls  i wszystko jest w porządku.Jeśli palce nie przylegają do siebie następuje seria 4 impulsów i włącznik głupieje. Myślałem, że funkcja _delay_ms() zatrzyma działanie procesora na chwilę(czas wystąpienia niepotrzebnych impulsów). Teraz nie wiem, czy 100ms to za mało, czy INT0 przerywa i tak funkcję _delay_ms() czyli wydłużenie czasu nic nie da.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9685">karlowic</a> — 22 lut 2019, o 10:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miki53]]></name></author>
<updated>2019-02-21T13:49:35+01:00</updated>
<published>2019-02-21T13:49:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216800#p216800</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216800#p216800"/>
<title type="html"><![CDATA[Re: Przerwanie zewnetrzne INT0 a funkcja _delay_ms]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216800#p216800"><![CDATA[
Witaj karlowic<br /><br />Nie jestem orłem w te klocki ale na mój rozum<br />to wywołujesz przerwanie zewnętrzne w obsłudze przerwania<br />ustawiasz flagę na 1 <br /><br />dalej sprawdzasz czy flaga ma 1 jeśli tak to najpierw przełączasz przekażnik<br />potem czekasz 100 ms a następnie zerujesz flagę<br /><br />w tym układzie nigdy nie będziesz miał zwłoki bo PIERW WŁĄCZASZ PRZEKAŻNIK A POTEM CZEKASZ<br /><br />sprubuj zamienić miejscami _delay_ms(100); z PORTB ^= OUT; <br /><br />wtedy będziesz miał oczekiwanie 100 ms a po nim dopiero włączenie przekażnika <br />i będziesz mógł regulować delayem czas po jakim ma się załączyć przekażnik<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18503">miki53</a> — 21 lut 2019, o 13:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[karlowic]]></name></author>
<updated>2019-02-21T12:22:27+01:00</updated>
<published>2019-02-21T12:22:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216799#p216799</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216799#p216799"/>
<title type="html"><![CDATA[Przerwanie zewnetrzne INT0 a funkcja _delay_ms]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21988&amp;p=216799#p216799"><![CDATA[
Witam<br />Wykonałem prosty włącznik oświetlenia wykorzystując czujnik zbliżeniowy i ATtiny13.<br />Napisałem do niego kod:<br />[syntax=c]#define IN  (1&lt;&lt;PB1)<br />#define OUT (1&lt;&lt;PB2)<br /><br />volatile uint8_t flaga;<br /><br />int main(void)<br />{<br />  DDRB |= OUT; // ustawienie pinów jako wyjście<br />  PORTB &amp;= ~OUT;// ustawienie przekaźnika na pozycji wyłącz<br /><br />  GIMSK |= (1&lt;&lt;INT0);// aktywacja przerwania INT0<br />  MCUCR |= (1&lt;&lt;ISC01);// przerwanie na fali opadającej<br />  PORTB |= IN;// pull-up wejścia INT0<br /><br />  sei();// globalne włączenie przerwań<br /><br />  while(1)<br />    {<br />      if(flaga == 1)<br />{<br />  PORTB ^= OUT;//zmiana pozycji przekaźnika<br />  _delay_ms(100);//odczekac 100ms, aby przeczekac niepożądaną zmianę stanu czujnika<br />  flaga = 0;//ustawienie flagi na stan czuwania<br />}<br />    }<br />}<br /><br />ISR (INT0_vect)<br />{<br />flaga = 1;//zmiana flagi przy<br />}[/syntax]<br />Program działa, ale nie wiem czy do końca tak jakbym chciał. Wydaje mi sie, że za szybko się przełącza. Wystarczy zwiększyć argument  _delay_ms(), czy INT0 przerywa działanie _delay_ms(100) i nic to nie zmieni. Jeśli przerywa to jak opóźnić przełączanie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9685">karlowic</a> — 21 lut 2019, o 12:22</p><hr />
]]></content>
</entry>
</feed>