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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-02-01T23:43:23+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23577&amp;mode</id>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-02-01T23:43:23+01:00</updated>
<published>2021-02-01T23:43:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230883#p230883</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230883#p230883"/>
<title type="html"><![CDATA[Re: Dioda zmienia swój stan w nieodpowiednich odstępach czas]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230883#p230883"><![CDATA[
Kolega miał chyba rację <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Zmieniłem trochę kod na taki jak niżej i działa poprawnie dziękuję za pomoc.<br /><br />[syntax=c]/*<br /> * tests.c<br /> *<br /> * Created: 29.01.2021 22:36:56<br /> * Author :<br /> */ <br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define LED1 (1 &lt;&lt; PD7)<br />#define LED2 (1 &lt;&lt; PC5)<br />#define KEY1 (1 &lt;&lt; PB0)<br /><br />volatile uint16_t Timer1 = 0;<br />volatile uint16_t Timer2 = 0;<br />volatile uint16_t Timer3 = 0;<br /><br />int main(void)<br />{<br />uint8_t lkey = 0;<br />uint8_t flag = 0;<br /><br />DDRD |= LED1;<br />DDRC |= LED2;<br />DDRB &amp;= ~KEY1;<br /><br />PORTB |= KEY1;<br />   <br />   TCCR0A |= (1 &lt;&lt; WGM01);<br />   TCCR0B |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00);<br />   TIMSK0 |= (1 &lt;&lt; OCIE0A);<br />   OCR0A = 156;<br />   <br />   TCCR1B |= (1 &lt;&lt; WGM12);<br />   TIMSK1 |= (1 &lt;&lt; OCIE1A);<br />   OCR1A = 3125;<br />   <br />   sei();<br />   <br />    while (1)<br />{<br />if(!Timer2)<br />{<br />if(!lkey &amp;&amp; !(PINB &amp; KEY1) )<br />{<br />lkey = 1;<br />PORTD ^= LED1;<br />Timer1 = 3000;<br />flag = 1;<br />}<br />else if(lkey &amp;&amp; PINB &amp; KEY1)<br />{<br />lkey = 0;<br />flag = 0;<br />Timer1 = 0;<br />TCCR1B &amp;= ~(1 &lt;&lt; CS12);<br />TCCR1B &amp;= ~(1 &lt;&lt; CS10);<br />}<br />else if(flag &amp;&amp; !Timer1)<br />{<br />TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);<br />}<br />}<br />}<br /><br />return 0;<br />}<br /><br />ISR(TIMER0_COMPA_vect)<br />{<br />Timer2++;<br />if(Timer2 &gt;= 6) Timer2 = 0;<br /><br />Timer3++;<br />if(Timer3 &gt;= 20) Timer3 = 0;<br /><br />if (Timer1) Timer1 -= 10;<br />}<br /><br />ISR(TIMER1_COMPA_vect)<br />{<br />PORTC ^= LED2;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 1 lut 2021, o 23:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2021-02-01T20:05:30+01:00</updated>
<published>2021-02-01T20:05:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230876#p230876</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230876#p230876"/>
<title type="html"><![CDATA[Re: Dioda zmienia swój stan w nieodpowiednich odstępach czas]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230876#p230876"><![CDATA[
Co znaczy &quot;nie dzieje się równo co 200ms&quot;? Czyli co ile? Masz może zgrane jakieś przebiegi?<br />Bo tu popatrz, musisz mieć jednocześnie spełniony warunek [syntax=c]if (!Timer2)[/syntax]wcześniej spełniony warunek [syntax=c]if(!lkey &amp;&amp; !(PINB &amp; KEY1) )[/syntax]żeby flag był równy 1, niespełniony warunek [syntax=c]else if(lkey &amp;&amp; PINB &amp; KEY1)[/syntax]oraz spełniony warunek [syntax=c]else if(flag &amp;&amp; !Timer1)[/syntax]Może spróbuj inaczej do tego podejść. W tym momencie masz za dużo zależności.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 1 lut 2021, o 20:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-31T22:31:22+01:00</updated>
<published>2021-01-31T22:31:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230859#p230859</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230859#p230859"/>
<title type="html"><![CDATA[Re: Dioda zmienia swój stan w nieodpowiednich odstępach czas]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230859#p230859"><![CDATA[
<div class="quotetitle">Marhef napisał(a):</div><div class="quotecontent"><br />Linia 50 blokuje program do momentu puszczenia przycisku KEY1 (jeśli dobrze zrozumiałem kod)<br /></div><br />Tak. bo o to mi tutaj chodzi, że jeżeli trzymam przycisk dłużej niż 3s to dioda zmienia swój stan. Nie wiem tylko dlaczego nie dzieje się to równo co 200ms. Jak używam &quot;_delay_ms&quot; to wszystko działa poprawnie, ale wiadomo nie chcę wykorzystywać delayów bo to blokuje mikrokontroler.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 31 sty 2021, o 22:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2021-01-31T20:07:33+01:00</updated>
<published>2021-01-31T20:07:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230853#p230853</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230853#p230853"/>
<title type="html"><![CDATA[Re: Dioda zmienia swój stan w nieodpowiednich odstępach czas]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230853#p230853"><![CDATA[
Linia 50 blokuje program do momentu puszczenia przycisku KEY1 (jeśli dobrze zrozumiałem kod)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 31 sty 2021, o 20:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-31T18:27:50+01:00</updated>
<published>2021-01-31T18:27:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230851#p230851</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230851#p230851"/>
<title type="html"><![CDATA[Dioda zmienia swój stan w nieodpowiednich odstępach czasu.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23577&amp;p=230851#p230851"><![CDATA[
Witam, chcę napisać program, który po przytrzymaniu przycisku dłużej niż 3s będzie ciągle zmieniał stan diody do momentu, kiedy nie puścimy przycisku. Chcę aby zmiana stanu diody występowała w odstępie 200ms i aby nie był to program blokujący. Używam do tego timera0 w trybie CTC gdzie porównanie przerwanie od porównana występuje co 10ms. Nie rozumiem dlaczego kod w liniach 47-55 nie działa tak jak chcę. Dioda gaśnie i zapala się takim seriami. Nie jest to płynna zmiana stanu diody tylko najpierw dioda bardzo szybko zapala się potem gaśnie i znowu zapala się. Co tutaj mam nie tak? Poprzednie timery programowe działają poprawnie.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define LED1 (1 &lt;&lt; PD7)<br />#define LED2 (1 &lt;&lt; PC5)<br />#define KEY1 (1 &lt;&lt; PB0)<br /><br />volatile uint16_t Timer1 = 0;<br />volatile uint16_t Timer2 = 0;<br />volatile uint16_t Timer3 = 0;<br /><br />int main(void)<br />{<br />uint8_t lkey = 0;<br />uint8_t flag = 0;<br /><br />DDRD |= LED1;<br />DDRC |= LED2;<br />DDRB &amp;= ~KEY1;<br /><br />PORTB |= KEY1;<br />   <br />   TCCR0A |= (1 &lt;&lt; WGM01);<br />   TCCR0B |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00);<br />   TIMSK0 |= (1 &lt;&lt; OCIE0A);<br />   OCR0A = 156;<br />   <br />   sei();<br />   <br />    while (1)<br />{<br />if(!Timer2)<br />{<br />if(!lkey &amp;&amp; !(PINB &amp; KEY1) )<br />{<br />lkey = 1;<br />PORTD ^= LED1;<br />Timer1 = 3000;<br />flag = 1;<br />}<br />else if(lkey &amp;&amp; PINB &amp; KEY1)<br />{<br />lkey = 0;<br />flag = 0;<br />Timer1 = 0;<br />}<br />else if(flag &amp;&amp; !Timer1)<br />{<br /><br />while(!(PINB &amp; KEY1))<br />{<br />if(!Timer3) PORTC ^= LED2;<br />flag = 0;<br />}<br />}<br />}<br />}<br /><br />return 0;<br />}<br /><br />ISR(TIMER0_COMPA_vect)<br />{<br />Timer2++;<br />if(Timer2 &gt;= 6) Timer2 = 0;<br /><br />Timer3++;<br />if(Timer3 &gt;= 20) Timer3 = 0;<br /><br />if (Timer1) Timer1 -= 10;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 31 sty 2021, o 18:27</p><hr />
]]></content>
</entry>
</feed>