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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-09-18T12:20:23+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=23920&amp;mode</id>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2021-09-18T12:20:23+01:00</updated>
<published>2021-09-18T12:20:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233585#p233585</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233585#p233585"/>
<title type="html"><![CDATA[Re: timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233585#p233585"><![CDATA[
<div class="quotetitle">krawi92 napisał(a):</div><div class="quotecontent"><br />if(pwm1 == 18)kierunek = 0;<br /></div>To jedno zmieniłbym na if (pwm1 &lt;= 18). Dlaczego? A co, jeśli zmienisz wartość tej zmiennej w innej części programu i będzie mniejsza od 18? Będzie nadal działać, ale chyba nie tak, jakbyś chciał<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 18 wrz 2021, o 12:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-17T18:19:05+01:00</updated>
<published>2021-09-17T18:19:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233580#p233580</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233580#p233580"/>
<title type="html"><![CDATA[Re: timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233580#p233580"><![CDATA[
[syntax=c]if(!timer1){<br />if(!kierunek){<br />pwm1++;<br />if(pwm1 &gt; 99)kierunek = 1;<br />}else{<br />if(kierunek){<br />pwm1--;<br />if(pwm1 == 18)kierunek = 0;<br />}<br />}<br />timer1 = 10;<br />}[/syntax]<br /><br />No, w końcu się udało  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 17 wrz 2021, o 18:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-16T19:40:23+01:00</updated>
<published>2021-09-16T19:40:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233578#p233578</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233578#p233578"/>
<title type="html"><![CDATA[Re: timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233578#p233578"><![CDATA[
Załapałem. W moim kodzie timer1 wykonywał po prostu obieg pętli co taki czas jaki mu zadałem. Miałem ogólnie problem jak zawrócić w drugą stronę, bo zwiększanie to nie problem, wystarczyło pwm1++;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 16 wrz 2021, o 19:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tonygryps]]></name></author>
<updated>2021-09-16T19:19:15+01:00</updated>
<published>2021-09-16T19:19:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233577#p233577</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233577#p233577"/>
<title type="html"><![CDATA[Re: timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233577#p233577"><![CDATA[
No właśnie bez pętli for ustaw tak warunek if żeby wykonywał kod co 50 ms i dodatkowo użyj zmiennej np kierunek np tak<br />[syntax=c]if(!timer){<br /> if(0 == kierunek ){<br /> if(pwm1&lt; 254) pwm1++;<br /> if(pwm1 == 255)kierunek = 1;<br /> }else{<br /> if(pwm1&gt; 0) pwm1--;<br /> if(pwm1 == 0)kierunek = 0;<br /> }<br />timer1 = liczba;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12014">tonygryps</a> — 16 wrz 2021, o 19:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-16T19:01:11+01:00</updated>
<published>2021-09-16T19:01:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233576#p233576</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233576#p233576"/>
<title type="html"><![CDATA[Re: timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233576#p233576"><![CDATA[
Ja utknąłem w pewnym punkcie. Chcę kręcić servem w jedną i w drugą na zmianę. Na początku zrobiłem to na 2 pętlach for<br />(for uint8_t i=0;i&lt;255;i++){<br />pwm1=i;<br />_delay_ms(50);<br />{<br />(for uint8_t i=255;i&gt;1;i--){<br />pwm1=i;<br />_delay_ms(50);<br />{<br /><br />Ale, chce się pozbyć tych delajów i pomyślałem, że mogę to zrobić na timerach programowych, tylko nie wiem właśnie jak do tego podejść.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 16 wrz 2021, o 19:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tonygryps]]></name></author>
<updated>2021-09-16T18:42:51+01:00</updated>
<published>2021-09-16T18:42:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233575#p233575</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233575#p233575"/>
<title type="html"><![CDATA[Re: timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233575#p233575"><![CDATA[
Strasznie mylisz pojęcia (jak masz bluebooka to musisz jeszcze raz poczytać o timerach programowych) timery programowe nie działają jak delay tylko np. ustawiasz jakiś timer w tryb ctc ( u ciebie to timer 1) tak aby jego przerwanie wykonywało się co jakiś określony czas (ustala to taktowanie procka preskaler i wartość wpisana w rejestr OCR tego timera) i w tym przerwaniu robisz np jak Ty [syntax=c]if(timer1)timer1--;[/syntax] później w pętli while programu sprawdzasz [syntax=c]if(!timer1){<br />twój kod który ma się wykonać co jaki czas chcesz.<br />timer1 = liczba <br />}[/syntax] i teraz uważaj ta liczba to właśnie określa czas co jaki wykona się ten warunek if w pętli while programu. np przerwanie wykonuje się co 1s to jak liczba równa się 10 to if wykona się się co 10 s a jak 1 to co sekundę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12014">tonygryps</a> — 16 wrz 2021, o 18:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-16T18:14:06+01:00</updated>
<published>2021-09-16T18:14:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233574#p233574</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233574#p233574"/>
<title type="html"><![CDATA[timery programowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23920&amp;p=233574#p233574"><![CDATA[
Hej, mam problem z korzystania z timerów programowych. Jeśli powiedzmy chcę sobie migać pojedyncza diodą, lub zwiększać wartość np: OCRx to ok. Ale chciałem np: w timerze zwiększać i zmniejszać wartość pwm. Nie bardzo wiem, jak do tego podejść bo gdy w instrukcję timera wrzuce np: pętle for, no to ona kręci się z pełną prędkością. <br /><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 channel1_on PORTD |= (1&lt;&lt;PD6);<br />#define channel1_off PORTD &amp;=~(1&lt;&lt;PD6);<br />#define channel2_on PORTD |= (1&lt;&lt;PD7);<br />#define channel2_off PORTD &amp;=~(1&lt;&lt;PD7);<br /><br />volatile uint8_t pwm1,pwm2;<br />volatile uint8_t timer1,timer2;<br /><br /><br />int main () {<br />// ============ programming pwm init -===== //<br />DDRD |= (1&lt;&lt;PD6)|(1&lt;&lt;PD7); // wyjscia pwm<br />TCCR0A |= (1&lt;&lt;WGM01); // tryb ctc timer0<br />TCCR0B |= (1&lt;&lt;CS00); // prescaler 1<br />TIMSK0 |= (1&lt;&lt;OCIE0A); // zezwlenie na przerwanie<br />OCR0A = 200;<br />// ======== programming timer init ========//<br />TCCR1A |= (1&lt;&lt;WGM12); // ctc timer1<br />TCCR1B |= (1&lt;&lt;CS10);// prescaler 1<br />TIMSK1 |= (1&lt;&lt;OCIE1A); //zezwolenie na przerwanie<br />OCR1A = 100;<br /><br /><br />sei();<br />while(1) {<br /><br />if (!timer1) {<br />for (uint8_t i=0; i &lt; 100; i++){<br />pwm1=i;<br />}<br />timer1 = 10;<br />}<br /> }<br />}<br /><br />ISR(TIMER0_COMPA_vect){<br />static uint8_t cnt;<br /><br />if (cnt&gt;=pwm1) channel1_off else channel1_on<br />if (cnt&gt;=pwm2) channel2_off else channel2_on<br />cnt++;<br />}<br /><br />ISR(TIMER1_COMPA_vect){<br />if(timer1)timer1--;<br />if(timer2)timer2--;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 16 wrz 2021, o 18:14</p><hr />
]]></content>
</entry>
</feed>