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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-06-18T14:42:38+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15567&amp;mode</id>
<entry>
<author><name><![CDATA[kozak0211]]></name></author>
<updated>2016-06-18T14:42:38+01:00</updated>
<published>2016-06-18T14:42:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162527#p162527</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162527#p162527"/>
<title type="html"><![CDATA[Re: Sposoby na kontrolowany reset uC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162527#p162527"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Jeśli dobrze rozumiem, masz dwa detektory (nazwijmy je dolny i górny).<br />Algorytm jest taki, że kiedy dolny detektor zadziała to oświetlenie schodów zostaje załączone i aby je wyłączyć jest potrzebny sygnał z górnego detektora (i odwrotnie, zależy czy ktoś wchodzi czy schodzi).<br />Odliczanie czasu ma na celu wyłączenie oświetlenia po określonym czasie, gdy nastąpi przypadkowe i niezamierzone załączenie jednego z detektorów. Wtedy mikrokontroler nie uzyska sygnału z drugiego detektora i światło będzie włączone cały czas. Odliczanie czasu ma na celu wyłączenie oświetlenia w takim przypadku, niezależnie od tego, czy sygnał z drugiego detektora zostanie wysłany, czy też nie.<br /><br />Nie wiem jak często zdarzają się takie niezamierzone załączenia, ale to nie do końca rozwiązuje problem, bo światło i tak się będzie niepotrzebnie włączać. Może lepiej zainwestować w lepszej jakości czujniki ruchu?<br /><br />No ale prościej mówiąc, światło ma się świecić:<br />od momentu wykrycia ruchu przez pierwszy detektor,<br />do momentu otrzymania impulsu z drugiego detektora<br />lub<br />do momentu odliczenia określonego czasu.<br /><br />Jeśli tak, to nie wiem po co stosujesz dwa mikrokontrolery. Jeden w zupełności wystarczy.<br /><br />Nie napisałeś tego, ale zakładam, że sygnał na PB2 zostaje wyłączony w momencie otrzymania sygnału z drugiego detektora i wygaszenia światła. W tym momencie odliczanie czasu ma zostać przerwane i układ ma oczekiwać na następny stan wysoki na PB2, po otrzymaniu którego ma zacząć odliczanie od początku. Proponowałbym tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /> <br />void odlicz_czas( uint16_t ms);<br /> <br />int main(void)<br />{<br />        //Port B jako wyjścia z wyjątkiem PB2, które jest wejściem<br />        DDRB = 0x2B;<br />        //Stan niski na wyjściach, z wyjątkiem PB4<br />        PORTB = 0x10;      <br /> <br />        //Początek nieskończonej pętli<br />        while(1)<br />        {<br />                //Jeżeli na pin PB2 podany zostanie stan wysoki<br />                if ( PINB &amp; (1&lt;&lt;PB2) )<br />                {<br />                        odlicz_czas(15000);<br />                }<br />        }<br />}<br /> <br />void odlicz_czas( uint16_t ms) {<br /><br />        PORTB |= (1&lt;&lt;PB1); // ustawienie stanu wysokiego na PB1<br />        while( ms-- )<br />        {<br />            _delay_ms(1);<br />            if ( !(PINB &amp; (1&lt;&lt;PB2)) ) break; // jeśli PB2 w stanie niskim, przerwij wykonywanie pętli<br />        }<br />        PORTB &amp;= ~(1&lt;&lt;PB1); // ustawienie stanu niskiego na PB1<br />}[/syntax]<br />Niemniej proponuję zrobić to na jednym mikrokontrolerze, bo to tylko niepotrzebna komplikacja.<br /></div><br /><br />Coś jednak nie działa tak jak powinno. Gdy zaprogramowałem uC i podłączyłem wszystko, to gdy pojawia się stan wysoki na PB2, automatycznie, bez żadnego odliczania pojawia się stan wysoki na PB1. Od razu mówię, że nic nie jest zwarte.<br /><br />@Edit<br /><br />Rozwiązałem sprawę w taki sposób:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /> <br />void mDelay( uint16_t ms);<br /> <br />int main(void)<br />{<br />        //Port B jako wyjścia z wyjątkiem PB2, które jest wejściem<br />        DDRB = 0X2B;<br />        //Stan niski na wyjściach<br />        PORTB = 0x00;      <br /> <br />        //Początek nieskończonej pętli<br />        while(1)<br />        {<br />                //Jeżeli na pin PB2 podany zostanie stan wysoki<br />                if(PINB &amp; 0X04) { <br />mDelay(15000);   <br />                        PORTB = 0X02;      //stan wysoki na PB1<br />                        mDelay(1000);           //opóżnienie 1000 * 1ms = 1000ms = 1s<br />                        PORTB = 0X00;     //stan niski na PB1<br />                }<br />        }<br />}<br /> <br />void mDelay( uint16_t ms) {<br />        while( ms-- )<br />{ <br />    _delay_ms(1);<br />    if( !(PINB &amp; 0x04) ) break; //jeśli PB2 w stanie niskim, przerwij wykonywanie pętli<br />}<br />}[/syntax]<br /><br />Mimo wszystko, dziękuję bardzo za pomoc ta funkcja &quot;if( !(PINB &amp; 0x04) ) break;&quot; była funkcją kluczową, której szukałem <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=13834">kozak0211</a> — 18 cze 2016, o 14:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-06-12T16:43:39+01:00</updated>
<published>2016-06-12T16:43:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162122#p162122</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162122#p162122"/>
<title type="html"><![CDATA[Re: Sposoby na kontrolowany reset uC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162122#p162122"><![CDATA[
Jeśli dobrze rozumiem, masz dwa detektory (nazwijmy je dolny i górny).<br />Algorytm jest taki, że kiedy dolny detektor zadziała to oświetlenie schodów zostaje załączone i aby je wyłączyć jest potrzebny sygnał z górnego detektora (i odwrotnie, zależy czy ktoś wchodzi czy schodzi).<br />Odliczanie czasu ma na celu wyłączenie oświetlenia po określonym czasie, gdy nastąpi przypadkowe i niezamierzone załączenie jednego z detektorów. Wtedy mikrokontroler nie uzyska sygnału z drugiego detektora i światło będzie włączone cały czas. Odliczanie czasu ma na celu wyłączenie oświetlenia w takim przypadku, niezależnie od tego, czy sygnał z drugiego detektora zostanie wysłany, czy też nie.<br /><br />Nie wiem jak często zdarzają się takie niezamierzone załączenia, ale to nie do końca rozwiązuje problem, bo światło i tak się będzie niepotrzebnie włączać. Może lepiej zainwestować w lepszej jakości czujniki ruchu?<br /><br />No ale prościej mówiąc, światło ma się świecić:<br />od momentu wykrycia ruchu przez pierwszy detektor,<br />do momentu otrzymania impulsu z drugiego detektora<br />lub<br />do momentu odliczenia określonego czasu.<br /><br />Jeśli tak, to nie wiem po co stosujesz dwa mikrokontrolery. Jeden w zupełności wystarczy.<br /><br />Nie napisałeś tego, ale zakładam, że sygnał na PB2 zostaje wyłączony w momencie otrzymania sygnału z drugiego detektora i wygaszenia światła. W tym momencie odliczanie czasu ma zostać przerwane i układ ma oczekiwać na następny stan wysoki na PB2, po otrzymaniu którego ma zacząć odliczanie od początku. Proponowałbym tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /> <br />void odlicz_czas( uint16_t ms);<br /> <br />int main(void)<br />{<br />        //Port B jako wyjścia z wyjątkiem PB2, które jest wejściem<br />        DDRB = 0x2B;<br />        //Stan niski na wyjściach, z wyjątkiem PB4<br />        PORTB = 0x10;      <br /> <br />        //Początek nieskończonej pętli<br />        while(1)<br />        {<br />                //Jeżeli na pin PB2 podany zostanie stan wysoki<br />                if ( PINB &amp; (1&lt;&lt;PB2) )<br />                {<br />                        odlicz_czas(15000);<br />                }<br />        }<br />}<br /> <br />void odlicz_czas( uint16_t ms) {<br /><br />        PORTB |= (1&lt;&lt;PB1); // ustawienie stanu wysokiego na PB1<br />        while( ms-- )<br />        {<br />            _delay_ms(1);<br />            if ( !(PINB &amp; (1&lt;&lt;PB2)) ) break; // jeśli PB2 w stanie niskim, przerwij wykonywanie pętli<br />        }<br />        PORTB &amp;= ~(1&lt;&lt;PB1); // ustawienie stanu niskiego na PB1<br />}[/syntax]<br />Niemniej proponuję zrobić to na jednym mikrokontrolerze, bo to tylko niepotrzebna komplikacja.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 12 cze 2016, o 16:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kozak0211]]></name></author>
<updated>2016-06-12T14:24:28+01:00</updated>
<published>2016-06-12T14:24:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162119#p162119</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162119#p162119"/>
<title type="html"><![CDATA[Re: Sposoby na kontrolowany reset uC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162119#p162119"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Zakładam, że chcesz zrobić tak:<br />- światło włącza się, gdy z detektora ruchu otrzyma stan wysoki na pinie PB2 i świeci się przez ustalony czas,<br />- jeśli w tym czasie ponownie pojawi się lub będzie się utrzymywał stan wysoki na pinie PB2, to czas powinien zacząć się odliczać od nowa.<br /> Możesz spróbować tak:[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />void zapal_swiatlo( uint16_t ms);<br /> <br />int main(void)<br />{<br />        //Port B jako wyjścia z wyjątkiem PB2, które jest wejściem<br />        DDRB = 0x2B;<br />        //Stan niski na wyjściach, z wyjątkiem PB4<br />        PORTB = 0x10;      <br /> <br /><br /><br />        //Początek nieskończonej pętli<br />        while(1)<br />        {<br />                //Jeżeli na pin PB2 podany zostanie stan wysoki<br />                if(PINB &amp; 0x04) {<br />                        zapal_swiatlo(15000);<br />                }<br />        }<br />}<br /> <br />void zapal_swiatlo( uint16_t ms) {<br />        uint16_t temp_ms = ms;<br />        PORTB = 0x12;   // zakładam, że to włączenie światła<br />        while( temp_ms-- )<br />        {<br />            _delay_ms(1);<br />            if (PINB &amp; 0x04) temp_ms=ms;<br />        }<br />        PORTB = 0x10; // zakładam, że to wyłączenie światła<br />}[/syntax]<br />W ten sposób światło powinno zgasnąć zadaną ilość czasu po zaniku sygnału z detektora ruchu.<br /></div><br /><br />Dzięki wielkie za pomoc, jednak nie do końca o to mi chodziło, pewnie przez to, że napisałem trochę to wszystko zagmatwanie. <br /><br />Przedstawię od początku jak wygląda sytuacja:<br /><br />Stan wysoki na Pinie PB2 otrzymuję poprzez poprowadzenie przewodu z pinu na ATMedze8, który odpowiada za sterowanie sygnałem jednego stopnia ledowego. Tak więc, gdy detektory wykryją ruch na schodach, zapalą się wszystkie stopnie za pośrednictwem ATMega8, wtedy pojawi się stan wysoki na PB2 na ATTiny13A - co wiąże się z tym, że rozpocznie się odliczanie czasu w ATTiny13A. <br /><br />Teraz przejdę do tego, co chciałem otrzymać:<br /><br />Gdy drugi detektor wykryje ruch, czyli gdy osoba wejdzie na piętro, rozpoczyna się sekwencja wygaszania stopni LED za pośrednictwem ATMega8. I teraz, gdy stopnie LED są wygaszone, program cały czas odlicza zadany czas, a chciałbym, żeby przerwał odliczanie i był w stanie gotowości, by zaczął odliczanie, gdy ponownie ktoś będzie chciał wejść na górę/zejść na dół.<br /><br />Możesz zadać sobie pytanie &quot;a po co mi te odliczanie, skoro stopnie same się gaszą, gdy drugi detektor wykryje ruch?&quot;. Dlatego chciałbym zastosować takie odliczanie, ponieważ czasami gdy nikt nie wchodzi po schodach, stopnie się same zapalają - wynika to z tego, że czasami wystarczy podmuch cieplejszego wiatru, by detektor uznał to za ruch. Dlatego też, gdyby tak się stało, chciałbym by ATTiny13A po odliczeniu czasu, podał stan wysoki na PB4, który będzie odpowiadał za natychmiastowe wygaszenie wszystkich stopni (PB4 jest za pomocą przewodu zwarte z pinem na ATMega8, także gdy ATMega8 otrzyma stan wysoki od PB4, automatycznie wyłącza schody).<br /><br />Mam nadzieję, że mimo zagmatwania jakoś jasno przedstawiłem o co mi chodzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13834">kozak0211</a> — 12 cze 2016, o 14:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-06-11T12:05:53+01:00</updated>
<published>2016-06-11T12:05:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162088#p162088</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162088#p162088"/>
<title type="html"><![CDATA[Re: Sposoby na kontrolowany reset uC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162088#p162088"><![CDATA[
Zakładam, że chcesz zrobić tak:<br />- światło włącza się, gdy z detektora ruchu otrzyma stan wysoki na pinie PB2 i świeci się przez ustalony czas,<br />- jeśli w tym czasie ponownie pojawi się lub będzie się utrzymywał stan wysoki na pinie PB2, to czas powinien zacząć się odliczać od nowa.<br /> Możesz spróbować tak:[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />void zapal_swiatlo( uint16_t ms);<br /> <br />int main(void)<br />{<br />        //Port B jako wyjścia z wyjątkiem PB2, które jest wejściem<br />        DDRB = 0x2B;<br />        //Stan niski na wyjściach, z wyjątkiem PB4<br />        PORTB = 0x10;      <br /> <br />        //Początek nieskończonej pętli<br />        while(1)<br />        {<br />                //Jeżeli na pin PB2 podany zostanie stan wysoki<br />                if(PINB &amp; 0x04) {<br />                        zapal_swiatlo(15000);<br />                }<br />        }<br />}<br /> <br />void zapal_swiatlo( uint16_t ms) {<br />        uint16_t temp_ms = ms;<br />        PORTB = 0x12;   // zakładam, że to włączenie światła<br />        while( temp_ms-- )<br />        {<br />            _delay_ms(1);<br />            if (PINB &amp; 0x04) temp_ms=ms;<br />        }<br />        PORTB = 0x10; // zakładam, że to wyłączenie światła<br />}[/syntax]<br />W ten sposób światło powinno zgasnąć zadaną ilość czasu po zaniku sygnału z detektora ruchu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 11 cze 2016, o 12:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grzeniu 73]]></name></author>
<updated>2016-06-11T11:39:07+01:00</updated>
<published>2016-06-11T11:39:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162084#p162084</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162084#p162084"/>
<title type="html"><![CDATA[Re: Sposoby na kontrolowany reset uC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162084#p162084"><![CDATA[
Nie znam C ale musisz zrobić sobie timer który będzie co 500mA sprawdzał czy ktos jest na schodach jesli jest to światło zapalone czas =0 jeśli nie ma to incr czas.Jak dojdzie do ustawionego pulapu wyłączy światło.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1519">grzeniu 73</a> — 11 cze 2016, o 11:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kozak0211]]></name></author>
<updated>2016-06-11T11:27:30+01:00</updated>
<published>2016-06-11T11:27:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162082#p162082</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162082#p162082"/>
<title type="html"><![CDATA[Sposoby na kontrolowany reset uC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15567&amp;p=162082#p162082"><![CDATA[
Witam, tak jak w temacie - poszukuję sposobów na uzyskanie kontrolowanego resetu mikrokontrolera, w moim przypadku jest to attiny13a.<br /><br />Na początku od razu mówię, że nie jestem jakimś &quot;mózgiem&quot; w sprawach programowania.<br />Głównym problemem, z którym się droczę jest zresetowanie odliczania czasowego, gdy moje schody przestaną świecić. Aktualnie mam taką sytuację, że gdy ATTiny13a wykryje stan wysoki na jednej z jej pinów, to zaczyna odliczać 2 minuty po czym daje na pinie wyjściowym stan wysoki, który jest podany na ATMegę8. Gdy Mega dostanie stan wysoki - gasi wszystkie schody (Tak, wiem, pewnie są prostsze sposoby na uzyskanie takiego wygaszania czasowego, jednak tak jak mówiłem, nie jestem dobry w te klocki, przez co użyłem tego pomysłu, który jako jedyny przyszedł mi na myśl). <br />Jednak problem się pojawia, ponieważ czasami dzieje się tak, że jest &quot;ruch&quot; na schodach, przez co zdarza się tak, że wyłączają się schody, gdy dana osoba dopiero po nich wchodzi - dlatego chciałbym zastosować reset odliczania, za każdym razem, gdy schody zapalą się na nowo. <br />Wpadłem na taki pomysł, żeby podać fizycznie przewodem stan niski z &quot;leda&quot; na reset attiny. Wtedy, gdy schody byłyby zgaszone, to ten stan niski poszedłby na pin resetu i go zresetował - jednak nie wiem, czy jest to zgodne z etyką i to w ogóle ma prawo działać, a nie chcę niczego uszkodzić.<br />Jeżeli mielibyście jakieś inne pomysły jak dokonać resetowania odliczania, przy gaszeniu ledów, to byłoby świetnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Poniżej wstawiam napisany program na ATTiny13A, który odlicza czas.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /> <br />void mDelay( uint16_t ms);<br /> <br />int main(void)<br />{<br />        //Port B jako wyjścia z wyjątkiem PB2, które jest wejściem<br />        DDRB = 0X2B;<br />        //Stan niski na wyjściach, z wyjątkiem PB4<br />        PORTB = 0x10;      <br /> <br />        //Początek nieskończonej pętli<br />        while(1)<br />        {<br />                //Jeżeli na pin PB2 podany zostanie stan wysoki<br />                if(PINB &amp; 0X04) { <br />mDelay(15000);   <br />                        PORTB = 0X12;      //stan wysoki na PB1<br />                        mDelay(1000);           //opóżnienie 1000 * 1ms = 1000ms = 1s<br />                        PORTB = 0X10;     //stan niski na PB1<br />                }<br />        }<br />}<br /> <br />void mDelay( uint16_t ms) {<br />        while( ms-- ) _delay_ms(1);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13834">kozak0211</a> — 11 cze 2016, o 11:27</p><hr />
]]></content>
</entry>
</feed>