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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-02-06T21:58:31+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=20160&amp;mode</id>
<entry>
<author><name><![CDATA[RR AVR]]></name></author>
<updated>2018-02-06T21:58:31+01:00</updated>
<published>2018-02-06T21:58:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203466#p203466</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203466#p203466"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203466#p203466"><![CDATA[
Ok, albo jestem głupi i nie rozumiem ale czy jeśli timer2 (bo PORTB=0) nie zmienia się to i to MoveAndNot też, wiec nie wiem do czego potrzebne jest wiedzieć o zmianie w przerwaniu, być morze dla wielu to oczywiste ale to mój 1 własny projekt, i pierwsze kroki. Co do zmian odnośnie ostatniego wpisu to wygląda to tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />// biblioteki timerow<br /><br />#define KEY_PIN (1&lt;&lt;PD7)<br />#define KEY_DOWN !(PIND &amp; KEY_PIN)<br />#define POWER_1 (1&lt;&lt;PB0)<br />#define POWER_2 (1&lt;&lt;PB2)<br /><br />uint8_t klawisz_wcisniety(void);<br /><br />volatile uint8_t MoveAndNot=0;<br />volatile uint8_t timer2=0;// zmienna do czasu w roletach<br />uint8_t key_lock;// zmienna do funkcji klawisza<br /><br />int main(){<br /><br />// switsch<br />DDRD &amp;= ~KEY_PIN;// kierunek pinu PD7 - wejściowy<br />PORTD |= KEY_PIN;// podciągnięcie pinu do VCC<br /><br />// sygnal<br />DDRB |= POWER_1 | POWER_2; // ustawianie<br /><br /><br />_delay_ms(10);<br />uint8_t start=0;// amienna do startu pętli while()<br /><br /><br /> // Timer2 w ctc<br />TCCR2  |= (1&lt;&lt;WGM21);   // tryb pracy CTC<br /> TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // preskaler = 1024<br />OCR2  = 97;   // przerwanie porównania co 0,1 sekundy<br />TIMSK  = (1&lt;&lt;OCIE2); // Odblokowanie przerwania CompareMatch<br /><br />sei(); // zezwolenie na przerwania<br /><br /><br />if( klawisz_wcisniety() )// if dla 1 uruchomienia dala rolety (w pozycji skrajnej musi byc)<br />{<br />PORTB |=POWER_1;<br />start=1;<br />// timer rozpoczyna liczenie<br />}<br /><br /><br /><br /> while(start)<br /> {<br />if( (klawisz_wcisniety() || MoveAndNot) &amp;&amp; (PORTB &amp; POWER_1) ) /* | 150==timer2 */<br />{<br />do {<br />PORTB =0;// i timer OFF bo roleta stoji<br />}<br />while( !( klawisz_wcisniety() ) );<br /><br />timer2=149;                // tutaj dodałem<br />PORTB|=POWER_2;// tu timer start ale timer2--<br /> MoveAndNot=0;<br />}<br />if( (klawisz_wcisniety() || MoveAndNot) &amp;&amp;  (PORTB &amp; POWER_2) )   // | (0==timer2)<br />{<br />do {<br />PORTB =0;// i timer OFF bo roleta stoji<br />}<br />while( !( klawisz_wcisniety() ) );<br /><br />timer2=1;                     // tutaj tez<br />PORTB|=POWER_1;// tu timer start ale timer2++<br /> MoveAndNot=0;<br />}<br /><br /><br /> }<br /><br /><br /><br /><br /><br />} // int main() end<br /><br /><br />uint8_t klawisz_wcisniety(void)<br />{<br /> while(1)<br /> {<br /><br />if( !key_lock &amp;&amp; KEY_DOWN ) {<br />key_lock=1;<br /><br />// reakcja na PRESS (wcinięcie przycisku)<br />return 1;<br /><br />  }<br />  else if( key_lock &amp;&amp; !KEY_DOWN )<br />  {<br /> key_lock++;<br />  }<br /> }<br /><br />}<br /><br />// *** przerwanie Timer2 CompareM...<br />ISR(TIMER2_COMP_vect) {<br /><br /> if(timer2==0) MoveAndNot=1;<br /> if(timer2==150) MoveAndNot=1;<br /> if(PORTB &amp; POWER_1 ) timer2++;<br /> if(PORTB &amp; POWER_2 ) timer2--;<br /><br /><br />}[/syntax]Kolejny raz nie pomaga wiec zastanawiam się czy po prostu nie zmienić całego kodu. Nawet jeśli zadziałało by to nie była by przechowywana wartość timer2 więc nie byłoby idealnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18244">RR AVR</a> — 6 lut 2018, o 21:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2018-02-06T15:12:06+01:00</updated>
<published>2018-02-06T15:12:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203446#p203446</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203446#p203446"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203446#p203446"><![CDATA[
Ale to nie jest związane z przerwaniem.<br />Tak po prostu napisałeś program.<br />Zerknij.<br />Najpierw sprawdzasz CZY klawisz wciśnięty LUB MoveAndNot jest różne od zera<br />jeśli tak to wchodzisz do pętli w której nie sprawdzasz już tego MoveAndNot to niezależnie<br />co będzie się działo w przerwaniu to Ty się w tej pętli o tym nie dowiesz bo czekasz<br />tylko na naciśnięcie klawisza.<br />To raz<br />A dwa <br />Przecież wcześniej zatrzymałeś operacje na zmiennej timer2<br />Bo przecież do całego portu B wpisałeś 0 a to zatrzymuje zliczanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 6 lut 2018, o 15:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RR AVR]]></name></author>
<updated>2018-02-06T14:43:54+01:00</updated>
<published>2018-02-06T14:43:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203444#p203444</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203444#p203444"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203444#p203444"><![CDATA[
Niestety z pętlą while i bez niej atmega sama nie wyłącza diody.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18244">RR AVR</a> — 6 lut 2018, o 14:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2018-02-06T14:40:16+01:00</updated>
<published>2018-02-06T14:40:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203443#p203443</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203443#p203443"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203443#p203443"><![CDATA[
ale po co tak komplikować?<br />Powinny wystarczyć zwykłe if'y po zwiększeniu czy zmniejszeniu.<br />Przecież po if możesz w klamrach umieścić więcej niż jedną instrukcję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 6 lut 2018, o 14:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RR AVR]]></name></author>
<updated>2018-02-06T13:17:07+01:00</updated>
<published>2018-02-06T13:17:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203440#p203440</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203440#p203440"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203440#p203440"><![CDATA[
No tak, co myślisz o tym?<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />// biblioteki timerow<br /><br />#define KEY_PIN (1&lt;&lt;PD7)<br />#define KEY_DOWN !(PIND &amp; KEY_PIN)<br />#define POWER_1 (1&lt;&lt;PB0)<br />#define POWER_2 (1&lt;&lt;PB2)<br /><br />uint8_t klawisz_wcisniety(void);<br /><br />volatile uint8_t MoveAndNot=0;<br />volatile uint8_t timer2=0;// zmienna do czasu w roletach<br />uint8_t key_lock;// zmienna do funkcji klawisza<br /><br />int main(){<br /><br />// switsch<br />DDRD &amp;= ~KEY_PIN;// kierunek pinu PD7 - wejściowy<br />PORTD |= KEY_PIN;// podciągnięcie pinu do VCC<br /><br />// sygnal<br />DDRB |= POWER_1 | POWER_2; // ustawianie<br /><br /><br />_delay_ms(10);<br />uint8_t start=0;// amienna do startu pętli while()<br /><br /><br /> // Timer2 w ctc<br />TCCR2  |= (1&lt;&lt;WGM21);   // tryb pracy CTC<br /> TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // preskaler = 1024<br />OCR2  = 97;   // przerwanie porównania co 0,1 sekundy<br />TIMSK  = (1&lt;&lt;OCIE2); // Odblokowanie przerwania CompareMatch<br /><br />sei(); // zezwolenie na przerwania<br /><br /><br />if( klawisz_wcisniety() )// if dla 1 uruchomienia dala rolety (w pozycji skrajnej musi byc)<br />{<br />PORTB |=POWER_1;<br />start=1;<br />// timer rozpoczyna liczenie<br />}<br /><br /><br /><br /> while(start)<br /> {<br />if( (klawisz_wcisniety() || MoveAndNot) &amp;&amp; (PORTB &amp; POWER_1) ) /* | 150==timer2 */<br />{<br />do {<br />PORTB =0;// i timer OFF bo roleta stoji<br />}<br />while( !( klawisz_wcisniety() ) );<br /><br />PORTB|=POWER_2;// tu timer start ale timer2--<br /> MoveAndNot=0;<br />}<br />if( (klawisz_wcisniety() || MoveAndNot) &amp;&amp;  (PORTB &amp; POWER_2) )   // | (0==timer2)<br />{<br />do {<br />PORTB =0;// i timer OFF bo roleta stoji<br />}<br />while( !( klawisz_wcisniety() ) );<br /><br />PORTB|=POWER_1;// tu timer start ale timer2++<br /> MoveAndNot=0;<br />}<br /><br /><br /> }<br /><br /><br /><br /><br /><br />} // int main() end<br /><br /><br />uint8_t klawisz_wcisniety(void)<br />{<br /> while(1)<br /> {<br /><br />if( !key_lock &amp;&amp; KEY_DOWN ) {<br />key_lock=1;<br /><br />// reakcja na PRESS (wcinięcie przycisku)<br />return 1;<br /><br />  }<br />  else if( key_lock &amp;&amp; !KEY_DOWN )<br />  {<br /> key_lock++;<br />  }<br /> }<br /><br />}<br /><br />// *** przerwanie Timer2 CompareM...<br />ISR(TIMER2_COMP_vect) {<br /><br /> if(timer2==0) MoveAndNot=1;<br /> if(timer2==150) MoveAndNot=1;<br /> while(!MoveAndNot){<br /> if(PORTB &amp; POWER_1 ) timer2++;<br /> if(PORTB &amp; POWER_2 ) timer2--;<br /> }<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18244">RR AVR</a> — 6 lut 2018, o 13:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2018-02-06T12:47:10+01:00</updated>
<published>2018-02-06T12:47:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203438#p203438</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203438#p203438"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203438#p203438"><![CDATA[
A kiedy w przerwaniu ma się wykonywać warunek else?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 6 lut 2018, o 12:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RR AVR]]></name></author>
<updated>2018-02-06T12:12:39+01:00</updated>
<published>2018-02-06T12:12:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203436#p203436</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203436#p203436"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203436#p203436"><![CDATA[
Po poprawkach (pewnie złych) jest ten sam błąd, czy na pewno obsługa przerwania jest ok?<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />// biblioteki timerow<br /><br />#define KEY_PIN (1&lt;&lt;PD7)<br />#define KEY_DOWN !(PIND &amp; KEY_PIN)<br />#define POWER_1 (1&lt;&lt;PB0)<br />#define POWER_2 (1&lt;&lt;PB2)<br /><br />uint8_t klawisz_wcisniety(void);<br /><br />volatile uint8_t MoveAndNot=0;<br />volatile uint8_t timer2=0;// zmienna do czasu w roletach<br />uint8_t key_lock;// zmienna do funkcji klawisza<br /><br />int main(){<br /><br />// switsch<br />DDRD &amp;= ~KEY_PIN;// kierunek pinu PD7 - wejściowy<br />PORTD |= KEY_PIN;// podciągnięcie pinu do VCC<br /><br />// sygnal<br />DDRB |= POWER_1 | POWER_2; // ustawianie<br /><br /><br />_delay_ms(10);<br />uint8_t start=0;// amienna do startu pętli while()<br /><br /><br /> // Timer2 w ctc<br />TCCR2  |= (1&lt;&lt;WGM21);   // tryb pracy CTC<br /> TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // preskaler = 1024<br />OCR2  = 97;   // przerwanie porównania co 0,1 sekundy<br />TIMSK  = (1&lt;&lt;OCIE2); // Odblokowanie przerwania CompareMatch<br /><br />sei(); // zezwolenie na przerwania<br /><br /><br />if( klawisz_wcisniety() )// if dla 1 uruchomienia dala rolety (w pozycji skrajnej musi byc)<br />{<br />PORTB |=POWER_1;<br />start=1;<br />// timer rozpoczyna liczenie<br />}<br /><br /><br /><br /> while(start)<br /> {<br />if( (klawisz_wcisniety() || MoveAndNot) &amp;&amp; (PORTB &amp; POWER_1) ) /* | 150==timer2 */<br />{<br />do {<br />PORTB =0;// i timer OFF bo roleta stoji<br />}<br />while( !( klawisz_wcisniety() ) );<br /><br />PORTB|=POWER_2;// tu timer start ale timer2--<br />MoveAndNot=149; // rowno 149 aby jak się ewentualnie nie zmieni timer2<br />}<br />if( (klawisz_wcisniety() || MoveAndNot) &amp;&amp;  (PORTB &amp; POWER_2) )   // | (0==timer2)<br />{<br />do {<br />PORTB =0;// i timer OFF bo roleta stoji<br />}<br />while( !( klawisz_wcisniety() ) );<br /><br />PORTB|=POWER_1;// tu timer start ale timer2++<br />MoveAndNot=1;// dla bespieczenstwa<br />}<br /><br /><br /> }<br /><br /><br /><br /><br /><br />} // int main() end<br /><br /><br />uint8_t klawisz_wcisniety(void)<br />{<br /> while(1)<br /> {<br /><br />if( !key_lock &amp;&amp; KEY_DOWN ) {<br />key_lock=1;<br /><br />// reakcja na PRESS (wcinięcie przycisku)<br />return 1;<br /><br />  }<br />  else if( key_lock &amp;&amp; !KEY_DOWN )<br />  {<br /> key_lock++;<br />  }<br /> }<br /><br />}<br /><br />// *** przerwanie Timer2 CompareM...<br />ISR(TIMER2_COMP_vect) {<br /><br /> if(PORTB &amp; POWER_1 ) timer2++;<br /> else if(timer2==150) MoveAndNot=1;<br /> if(PORTB &amp; POWER_2 ) timer2--;<br /> else if(timer2==0) MoveAndNot=1;<br />}[/syntax]Prawdopodobnie to przerwanie ponieważ na klawisz jest reakcja, a reakcji na przerwania brak.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18244">RR AVR</a> — 6 lut 2018, o 12:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2018-02-06T12:02:17+01:00</updated>
<published>2018-02-06T12:02:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203435#p203435</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203435#p203435"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203435#p203435"><![CDATA[
To może powołaj sobie 2 zmienne<br />Jedna ruch i druga kierunek<br />Przy naciśnięciu sprawdzasz czy roleta jest w ruchu<br />jeśli tak to zmieniasz na stop i zmieniasz kierunek na przeciwny<br />jeśli roleta się nie przesuwa to uruchamiasz w kierunku jaki określa<br />zmienna kierunek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 6 lut 2018, o 12:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RR AVR]]></name></author>
<updated>2018-02-06T11:46:54+01:00</updated>
<published>2018-02-06T11:46:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203434#p203434</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203434#p203434"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203434#p203434"><![CDATA[
Dzięki za odpowiedź to dobry pomysł, ale chodzi mi o coś trochę innego, mianowicie wymyśliłem sobie że to jest program do sterowania roletami w domu (te rolety mają 3 przewody- neutralny zawsze podłączony, drugi- ruch w górę i trzeci- ruch w dół, przy czym nie można dać jednocześnie stanu wysokiego na przewody odpowiedzialne za ruch) choć czasy podnoszenia i ich opuszczania są różne to pominąłem to i założyłem że są takie same. Kod miał działać tak aby za pomocą przycisku wyłączać roletę (jeśli się przesuwa) a po powtórnym wciśnięciu przesuwała się ale w przeciwnym kierunku, do tego dochodzi moment kiedy roleta będzie w skrajnym położeniu- wtedy chcę kliknąć raz a nie dwa dlatego ten cały timer2. A i na koniec dopowiem że ta roleta jeśli dojdzie do położenia skrajnego to np. na dół to na przewodzie (dla ruchu w dół) może być stan wysoki to rolety nie uszkodzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18244">RR AVR</a> — 6 lut 2018, o 11:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-02-05T22:34:43+01:00</updated>
<published>2018-02-05T22:34:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203421#p203421</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203421#p203421"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203421#p203421"><![CDATA[
Idea jest prosta. O ile Cię dobrze zrozumiałem to czas świecenia drugiej diody ma być czasem zmierzonym między dwoma kliknięciami. Coś podobnego wykorzystałem kiedyś do programowalnych wycieraczek samochodowych i w metronomie gdzie tempo nabiało się tapnięciami w obudowę. <br />Najprościej - powołaj dodatkową zmienną i togluj ją przyciskiem (jego obsługa oczywiście musi być nie blokująca) każdy wcisk to zmiana stanu tej zmiennej. Teraz w zależności od tej zmiennej program przechodzi w tryb mierzenia czasu lub odliczania zmierzonego czasu. Sposób pomiaru pozostawiam Tobie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Myślę, że załapiesz o co mi chodzi w tym prostym algorytmie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 5 lut 2018, o 22:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RR AVR]]></name></author>
<updated>2018-02-05T21:42:37+01:00</updated>
<published>2018-02-05T21:42:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203411#p203411</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203411#p203411"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203411#p203411"><![CDATA[
Dzięki masz rację, dobrze że mi to uświadomiłeś <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Ale nadaj nie wiem jak zapisać warunek (w procedurze obsługi przerwania) aby timer2 zwiększał się kiedy świeci się jedna dioda a zmniejszał kiedy robi to druga.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18244">RR AVR</a> — 5 lut 2018, o 21:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2018-02-05T21:39:03+01:00</updated>
<published>2018-02-05T21:39:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203410#p203410</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203410#p203410"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203410#p203410"><![CDATA[
Wydaje mi się, że nie do kkońca przemyślałeś jak działa Twoja zmienna Timer2.<br />Jest ona inkrementowana lub dekrementowana w przerwaniu &quot;cały czas&quot;.<br />A Ty próbujesz (  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ) wstrzelić się w dwa konkretne momenty kiedy ma ona<br />wartość 0 lub 150. To chyba jak trafienie w totolotka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 5 lut 2018, o 21:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RR AVR]]></name></author>
<updated>2018-02-05T21:23:13+01:00</updated>
<published>2018-02-05T21:23:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203405#p203405</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203405#p203405"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203405#p203405"><![CDATA[
Działa, ale nie tak jak bym chciał, gdy wciskam przycisk to dioda zapala się, kolejne wciśnięcie ją gasi, a 3 wciśnięcie powoduje włączenie drugiej. Brakuje samoczynnego wyłączania po określonym czasie.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br />A co do konstrukcji całego kodu to na pewno jest co najmniej kiepska i zdaję sobie z tego sprawę, stąd też ten cały wątek i wybór działu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18244">RR AVR</a> — 5 lut 2018, o 21:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2018-02-05T21:17:51+01:00</updated>
<published>2018-02-05T21:17:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203403#p203403</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203403#p203403"/>
<title type="html"><![CDATA[Re: Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203403#p203403"><![CDATA[
To Ci w ogóle nie działa, prawda?<br />I to nie w przerwaniu leży główna przyczyna,<br />ale w konstrukcji całego programu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 5 lut 2018, o 21:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RR AVR]]></name></author>
<updated>2018-02-05T19:11:32+01:00</updated>
<published>2018-02-05T19:11:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203384#p203384</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203384#p203384"/>
<title type="html"><![CDATA[Niepoprawnie działający kod.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20160&amp;p=203384#p203384"><![CDATA[
Umieściłem ten temat w dziale &quot;rybny&quot; ponieważ pewnie większość z was zna lepsze sposoby na osiągnięcie zamierzonego efektu. O co chodzi? Chcę napisać program którego zadaniem jest włączać i wyłączać 2 diody led, sterowanych za pomocą jednego przycisku. Zależy mi na tym aby gdy jedna z diod świeci się to po wciśnięciu klawisza gasła a po następnym wciśnięciu zapalała się druga oraz aby po ich włączeniu świeciły określony czas to znaczy że jeśli zapalę pierwszą na sekundę to druga kiedy ją zapalę też świeciła się tyle samo i aby po przekroczeniu określonego czasu (od początku włączenia) dioda gasła. poniżej wklejam mój obecny kod który jak w temacie nie działa (czas po włączeniu nie ma wpływu na stan diody).<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define KEY_PIN (1&lt;&lt;PD7)<br />#define KEY_DOWN !(PIND &amp; KEY_PIN)<br />#define POWER_1 (1&lt;&lt;PB0)<br />#define POWER_2 (1&lt;&lt;PB2)<br /><br />uint8_t klawisz_wcisniety(void);<br />uint8_t pomoc(void);<br /><br />volatile uint8_t timer2=0;// zmienna do czasu<br />uint8_t key_lock;// zmienna do funkcji klawisza<br /><br />int main(){<br /><br />// switsch<br />DDRD &amp;= ~KEY_PIN;// kierunek pinu PD7 - wejściowy<br />PORTD |= KEY_PIN;// podciągnięcie pinu do VCC<br /><br />// sygnal<br />DDRB |= POWER_1 | POWER_2; // ustawianie<br /><br /><br />_delay_ms(10); // aby atmega ustawila to co wyzej<br /><br />uint8_t start=0;// amienna do startu pętli while()<br /><br /><br /> // Timer2 w ctc<br />TCCR2  |= (1&lt;&lt;WGM21);   // tryb pracy CTC<br /> TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // preskaler = 1024<br />OCR2  = 97;   // przerwanie porównania co 0,1 sekundy<br />TIMSK  = (1&lt;&lt;OCIE2); // Odblokowanie przerwania CompareMatch<br /><br />sei(); // zezwolenie na przerwania<br /><br /><br />if( klawisz_wcisniety() )// if dla 1 uruchomienia<br />{<br />PORTB |=POWER_1;<br />start=1;<br />// timer rozpoczyna liczenie<br />}<br /><br /><br /><br /> while(start)<br /> {<br />if( (klawisz_wcisniety() || pomoc()) &amp;&amp; (PORTB &amp; POWER_1) ) /* | 150==timer2 */<br />{<br />do {<br />PORTB =0;// i timer OFF<br />}<br />while( !( klawisz_wcisniety() ) );<br /><br />PORTB|=POWER_2;// tu timer start ale timer2--<br />}<br />if( (klawisz_wcisniety() || pomoc()) &amp;&amp;  (PORTB &amp; POWER_2) )   // | (0==timer2)<br />{<br />do {<br />PORTB =0;// i timer OFF<br />}<br />while( !( klawisz_wcisniety() ) );<br /><br />PORTB|=POWER_1;// tu timer start ale timer2++<br />}<br /><br /><br /> }<br /><br /><br /><br /><br /><br />} // int main() end<br /><br />uint8_t pomoc(void)<br />{<br />if(timer2==0) return 1;<br />if(timer2==150) return 1;<br />else return 0;<br />}<br /><br />uint8_t klawisz_wcisniety(void)<br />{<br /> while(1)<br /> {<br /><br />if( !key_lock &amp;&amp; KEY_DOWN ) {<br />key_lock=1;<br /><br />// reakcja na PRESS (wcinięcie przycisku)<br />return 1;<br /><br />  }<br />  else if( key_lock &amp;&amp; !KEY_DOWN )<br />  {<br /> key_lock++;<br />  }<br /> }<br /><br />}<br /><br />// *** przerwanie Timer2 CompareM...<br />ISR(TIMER2_COMP_vect) {<br /><br /> if(PORTB &amp; POWER_1 ) timer2++;<br /> if(PORTB &amp; POWER_2 ) timer2--;<br /><br />}[/syntax]Myślę że źle skonstruowana jest obsługa przerwania. Bardzo proszę o pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18244">RR AVR</a> — 5 lut 2018, o 19:11</p><hr />
]]></content>
</entry>
</feed>