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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-01-23T11:48:54+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=2175&amp;mode</id>
<entry>
<author><name><![CDATA[jan mazur]]></name></author>
<updated>2013-01-23T11:48:54+01:00</updated>
<published>2013-01-23T11:48:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25635#p25635</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25635#p25635"/>
<title type="html"><![CDATA[Re: Timer programowy zamiast _delay_ms() i PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25635#p25635"><![CDATA[
Dziękuję Bardzo R.L. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> będę próbował i mam nadzieję, że uda mi się zrealizować to co zamierzam. Jak coś to dam znać czy się udało <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=566">jan mazur</a> — 23 sty 2013, o 11:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lemosek]]></name></author>
<updated>2013-01-22T22:40:18+01:00</updated>
<published>2013-01-22T22:40:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25612#p25612</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25612#p25612"/>
<title type="html"><![CDATA[Re: Timer programowy zamiast _delay_ms() i PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25612#p25612"><![CDATA[
Witam,<br />bardzo się cieszę, że moja sugestia się komuś przydała <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />.<br />Nie przejmuj się niepowodzeniami, ja też kiedyś jak zaczynałem to próbowałem podobnych wynalazków i jakoś nie chciało działać. <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />. <br /><br />Jak programujesz to pamiętaj, że nigdy nie używaj delay w przerwaniach i pętli głównej. W pętli głównej na podstawie timerów programowych wywołuj dane zdarzenia np. obsługa LCD, IR itp. w zależności od potrzeb. Pętla główna ma się &quot;kręcić&quot; bez zbędnych przerw.<br /><br />Odnośnie PWM programowego to nie łatwiej i pewniej wykorzystać przerwanie od timera.  Pomyśl jak działa PWM ( f jest stałe, zmienia się współczynnik wypełnienia). Jeśli więc w przerwaniu przeanalizujesz wartość zmiennej dajmy na to pwm (zawierającej zadany współczynnik wypełnienia) i przez taki czas będziesz utrzymywał stan wysoki a prze resztę niski. Powinno działać. <br /><br />Odp. dokładnie tak <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Spójrz wyżej, co napisałem na temat pętli głównej. Nie możesz jej zbędnie zatrzymywać np. prze delay. Bo wtedy nici z pseudo działania równoległego.<br /><br />Jeszcze taki mały przykładzik<br />[syntax=c]   void timer_irq() <br />{ <br />    set_timer1(preload); <br />    <br />   if (Intcount &lt; 255) <br />    { <br />      if (Intcount == red_duty) <br />       { <br />         output_low(red); <br />       }    <br />      if (Intcount == green_duty) <br />       { <br />         output_low(green); <br />       }    <br />      if (Intcount == blue_duty) <br />       { <br />         output_low(blue); <br />       }    <br />    } <br />    <br />   else if(Intcount == 255) <br />    { <br />      Intcount = 0; <br />      output_high(red); <br />      output_high(green); <br />      output_high(blue);    <br />    }    <br />    Intcount++; <br />}   [/syntax]<br />który powinien rozjaśnić <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Pozdrawiam<br />R.L.<br /><br /><span style="color: #FF0000">Kod wstawiamy przy pomocy &quot;[syntax=c] &quot; - Zielony J.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=426">Lemosek</a> — 22 sty 2013, o 22:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jan mazur]]></name></author>
<updated>2013-01-22T22:06:45+01:00</updated>
<published>2013-01-22T22:06:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25609#p25609</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25609#p25609"/>
<title type="html"><![CDATA[Re: Timer programowy zamiast _delay_ms() i PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25609#p25609"><![CDATA[
Dzięki <em>Lemosek</em>, też już po napisaniu mego posta doszedłem do wniosku, że raczej to nie zadziała tak jak sugerowałem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Tak jak sugerujesz będę to musiał przepisać i dokładniej przeanalizować działanie.<br /><br />Bardzo Dziękuję za wstępne rozjaśnienie!<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 17 minutach ]</span></strong><br /><br />Tak więc widzę, że raczej to co napisałem na początku nie zadziała... jednak w czasie przepisywania nasunęła mi się jedna myśl. Jeśli mamy pętlę <em>while(1)</em>, a w niej np:<br /><br />[syntax=c]while(1) {<br />  if(!Timer1) {<br />       Timer1 = 1;    //  np. 1 * 10ms<br />       LED_TOGGLE;  //  dla LED_1<br />  }<br /><br />  _delay_ms(500);<br />  LED_ON;    //  włącz LED_2<br />  _delay_ms(500);<br />  LED_OFF;    //  wyłącz LED_2<br />}[/syntax]<br />To i tak LED_1 nie będzie migała z częstotliwością 100Hz, bo nastąpi &quot;zawieszenie&quot; tej procedury na rzecz opóźnień 2 x 500ms. Czyli mój plan na &quot;wielozadaniowość&quot; nie zadziała... tak? <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=566">jan mazur</a> — 22 sty 2013, o 22:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lemosek]]></name></author>
<updated>2013-01-22T21:46:28+01:00</updated>
<published>2013-01-22T21:46:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25607#p25607</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25607#p25607"/>
<title type="html"><![CDATA[Re: Timer programowy zamiast _delay_ms() i PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25607#p25607"><![CDATA[
Witam, <br />kolego Jan Mazur przede wszystkim musisz zrozumieć na czym polega różnica między programowaniem zdarzeniowym z wykorzystaniem timerów programowych a programowaniem liniowym z delay. Chodzi głównie o to, że przy wykorzystaniu timerów programowych pętla główna nie zatrzymuje się, a krąży czekając na zdarzenie. Dzięki temu możemy obsługiwać wiele zdarzeń pseudo jednocześnie. Twój kod będzie działał jedynie z delay bo tak został napisany. Musisz go przepisać aby dobrze działał z timerami programowymi. Musisz tak go napisać aby inkrementacja pętli np. for itp. następowała raz prze wywołanie danej funkcji, po odliczeniu timera.<br />Mam nadzieje, że trochę rozjaśniłem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam<br />R.L.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=426">Lemosek</a> — 22 sty 2013, o 21:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jan mazur]]></name></author>
<updated>2013-01-22T21:17:16+01:00</updated>
<published>2013-01-22T21:17:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25603#p25603</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25603#p25603"/>
<title type="html"><![CDATA[Timer programowy zamiast _delay_ms() i PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2175&amp;p=25603#p25603"><![CDATA[
Witam,<br /><br />W miarę wolnego wieczoru, zasiadłem do przetestowania programowego timer'a, który został zaprezentowany przez Mirka w rozdziale o 'systemie czasu rzeczywistego' - przy okazji - za każdym razem jak wracam do tej książki to odkrywam ją na nowo <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Wykorzystałem T/C0 w mojej ATMega8 (16MHz) i zadziałał bez zarzutu, tak więc poszedłem dalej i pomyślałem, że zastąpię tym funkcję <em>_delay_ms()</em>. Tak więc na szybko skorzystałem z części kodu do PWM programowego i w miejscach gdzie jest <em>_delay_ms(N)</em> wstawiłem:<br /><br />[syntax=c]if(!Timer2) {<br />     Timer2 = N;<br />}[/syntax]<br />Moja konfiguracja przerwania jest następująca:<br /><br />[syntax=c]//  ustawienia dla Timer0 (8b NORMAL)<br />//  preskaler - 1024<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);<br />//  16MHz / 1024 / 1kHz = 15 =&gt; 255 - 15 = 240: czyli 1ms<br />TCNT0 = 240;<br />//  zezwolenie na przerwanie od TC0<br />TIMSK |= (1&lt;&lt;TOIE0);<br /><br />sei();[/syntax]<br />Tak wiec w pętli <em>while(1)</em> wstawiam te opóźnienia:<br /><br />[syntax=c]//  PWM programowy, ktory dziala niezaleznie<br />        for(i = 0; i &lt; 255; i++){<br />            pwm = i;<br /><br />            if(i &gt; 10) {<br />                //_delay_ms(3);<br />                if(!Timer2) {<br />                    Timer2 = 3;<br />                }<br />            } else {<br />                //_delay_ms(15);<br />                if(!Timer2) {<br />                    Timer2 = 15;<br />                }<br />            }<br />            <br />        }<br />        //  calkowite rozjasnienie<br />        pwm = 255;<br />        //_delay_ms(500);<br />        if(!Timer2) {<br />            Timer2 = 500;<br />        }<br />        <br />        for(i = 255; i; i--){<br />            pwm = i;<br />            if(i &gt; 10) {<br />                //_delay_ms(3);<br />                if(!Timer2) {<br />                    Timer2 = 3;<br />                }<br />            } else {<br />                //_delay_ms(15);<br />                if(!Timer2) {<br />                    Timer2 = 15;<br />                }<br />            }<br />        }<br />        //  calkowite sciemnienie<br />        pwm = 0;<br />        //_delay_ms(500);<br />        if(!Timer2) {<br />            Timer2 = 500;<br />        }[/syntax]<br /><br />Jednak raczej to nie działa, bo dioda się cały czas pali.<br />Kod w przerwaniach dla:<br /><br />- <strong>TimerN</strong>:<br />[syntax=c]ISR(TIMER0_OVF_vect)<br />{<br />    uint8_t x;<br />    x = Timer1;<br />    if(x) Timer1 = --x;<br />    x = Timer2;<br />    if(x) Timer2 = --x;<br /><br />}[/syntax]<br />- <strong>PWM</strong>:<br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br />    static uint8_t counter;<br />    <br />    //  sterowanie kanalem PWM<br />    if(counter &gt;= pwm) {<br />        PORTD |= LED_1;<br />    } else {<br />        PORTD &amp;= ~(LED_1);<br />    }<br /><br />    counter++;<br />}[/syntax]<br />Od razu chcę nadmienić, że PWM działa jeśli <em>_delay_ms()</em> są od komentowane, a elementy z <em>Timer2</em> usunięte. Także, jak pisałem wcześniej, &quot;timer programowy&quot; też działa - po usunięciu kodu z PWM i wstawieniu LED_TOGGLE z wywołanie Timer2 = 1, dioda miga bardzo szybko.<br /><br />Tutaj głównie  proszę o podpowiedź, jak zastąpić <em>_delay_ms()</em> &quot;timerem programowym&quot;... jakieś sugestie?<br /><br />Bardzo Dziękuję,<br />Jan<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=566">jan mazur</a> — 22 sty 2013, o 21:17</p><hr />
]]></content>
</entry>
</feed>