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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-07-18T21:07:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=5208&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-07-18T21:07:32+01:00</updated>
<published>2016-07-18T21:07:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=164256#p164256</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=164256#p164256"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=164256#p164256"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />jest tożsame (oczywiście &quot;na oko&quot; działa tak samo) z przykładem z książki?<br /></div><br />Pewnie, że jest tożsame tylko działa o wiele gorzej i wolniej i to na zasadzie im więcej dodajesz timerów programowych tym gorzej z twoim sposobem. Oczywiście sama przeróbka absolutnie będzie działać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Jeśli chcesz wiedzieć dlaczego gorzej jest twoim sposobem to weź sobie podejrzyj plik *.lss po kompilacji i zobacz jaka masakra się dzieje gdy porównasz dwa sposoby. Dlaczego dużo korzystniej jest to zrobić tak jak pokazałem jednak w książce.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 18 lip 2016, o 21:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QDark]]></name></author>
<updated>2016-07-18T10:48:13+01:00</updated>
<published>2016-07-18T10:48:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=164217#p164217</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=164217#p164217"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=164217#p164217"><![CDATA[
Witam, ze względu na to, iż jest to pierwszy mój post proszę o wybaczenie kolegów ewentualnych błędów. <br />Mam pytanie (zgodnie z sugestią P.Mirka by samemu kombinować)odnośnie podobnego przykładu z książki BB. Otóż czy utworzenie timerów w ten sposób:<br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br />if (Timer1) --Timer1;<br />if (Timer2) --Timer2;<br />if (Timer3) --Timer3;<br />if (Timer4) --Timer4;<br /><br />}[/syntax]<br /><br />jest tożsame (oczywiście &quot;na oko&quot; działa tak samo) z przykładem z książki? <br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br /> uint16_t x;<br /> x=Timer1;<br /> if (x) Timer1 = --x;<br /> x=Timer2;<br /> if (x) Timer2 = --x;<br /> x=Timer3;<br /> if (x) Timer3 = --x;<br /> x=Timer4;<br /> if (x) Timer4 = --x;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14462">QDark</a> — 18 lip 2016, o 10:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AndreAs]]></name></author>
<updated>2013-12-22T21:41:38+01:00</updated>
<published>2013-12-22T21:41:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62090#p62090</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62090#p62090"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62090#p62090"><![CDATA[
Miałem problem z drugim kodem który mi w ogóle nie działał , więc postanowiłem poprawić pierwszy , ponieważ nie działał tak do końca tak  jakbym sobie życzył , a mianowicie gdy działała jedna dioda to druga powinna być wyłączona  ,a tak nie było i przy pracy jednej czasami działała druga . Ale  go poprawiłem ku mojej radości we własnym zakresie . Poniżej poprawiony prawidłowo działający kod.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 29-11-2013<br /> *      Author: AndreAs<br /> *<br /> *<br /> *<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />//#include &lt;avr/iom32.h&gt;<br /><br /><br />#define L1_PIN (1&lt;&lt;PC7)<br />#define L2_PIN (1&lt;&lt;PC6)<br />#define L3_PIN (1&lt;&lt;PC5)<br />#define L4_PIN (1&lt;&lt;PC4)<br />#define L1_TOG PORTC ^= L1_PIN<br />#define L1_ON  PORTC &amp;= ~L1_PIN<br />#define L1_OFF PORTC |= L1_PIN<br />#define L2_TOG PORTC ^= L2_PIN<br />#define L2_ON  PORTC &amp;= ~L2_PIN<br />#define L2_OFF PORTC |= L2_PIN<br />#define L3_TOG PORTC ^= L3_PIN<br />#define L4_TOG PORTC ^= L4_PIN<br /><br />volatile uint16_t Timer1,Timer2,Timer3,Timer4;<br />uint16_t i;<br /><br />int main(void)<br /><br />{<br /><br />        DDRC |= L1_PIN|L2_PIN|L3_PIN|L4_PIN;<br />        PORTC &amp;= ~  L1_PIN|L2_PIN|L3_PIN|L4_PIN;<br /><br />       //  TIMER1 dla F_CPU=11,0592MHz */<br />        TCCR1B |= (1&lt;&lt;WGM12);/* tryb CTC */<br />        TCCR1B |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10);  /* preskaler = 1024 */<br />        OCR1A = 107;/* podział przez 108  */<br />        TIMSK |= (1&lt;&lt;OCIE1A);/* przerwanie CompareMatch */<br />           // tyknięcie 10ms<br /><br />        sei(); //procedura przerwania<br /><br />        while(1)<br /><br />       {<br /><br />                        if (( i &lt; 99) &amp;&amp; (!Timer1 )) //Funkcja działania diody 1  czas ok. 10 s<br />                        {<br />                        if(i &lt; 99)L2_OFF;<br />                            L1_TOG;                       // Mruganie diody 100 ms<br />                        Timer1 = 10;<br /><br />                        }<br /><br />                        if  ((i &gt; 99) &amp;&amp; (!Timer2 ) )   //Funkcja działania diody 2  czas ok. 10 s<br />                        {<br />                        if(i &gt; 99)L1_OFF;<br />                            L2_TOG;             // Mruganie diody 50 ms<br />                        Timer2 = 5;<br /><br />                        }<br /><br />                        if (!Timer4)<br /><br />                           {<br /><br />                             i++;<br />                             L4_TOG;                   // Funkcja generatora przełączania diody 1 i 2<br />                             Timer4 = 10;             // Tyknięcie generatora 0,1 s<br />                             if (i &gt; 199) i = 0;<br /><br />                             }<br /><br /><br />           if( !Timer3 )// Funkcja działania diody 3<br /><br />           {<br />                Timer3=40;      // Mruganie diody 400 ms<br />                L3_TOG;<br />           }<br /><br />     }<br /><br />}<br /><br />ISR(TIMER1_COMPA_vect)<br /><br />      {<br />         uint16_t n;<br /><br />          n = Timer1;<br />          if (n) Timer1 = --n;<br /><br />          n = Timer2;<br />          if (n) Timer2 = --n;<br /><br />          n = Timer3;<br />          if (n) Timer3 = --n;<br /><br />          n = Timer4;<br />         if (n) Timer4 = --n;<br />     }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2092">AndreAs</a> — 22 gru 2013, o 21:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2013-12-22T20:38:12+01:00</updated>
<published>2013-12-22T20:38:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62079#p62079</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62079#p62079"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62079#p62079"><![CDATA[
Witam<br />przeanalizuj co robi poniższy fragment Twojego drugiego programu<br /><br />[syntax=c]if (( i &lt; 99) &amp;&amp; (!Timer1 )) //Tu sprawdzasz czy minął czas Timera1<br /> {<br />     L1_OFF;   //wyłączasz diodę<br /><br />     Timer1 = 10;//Nakręcasz Timer1  (nie ma wpływu na czas timera dla tego że<br />                      // nie sprawdzasz czy Timer1 doszedł do zera)<br />                     // możesz tą linię usunąć i nie będzie miało to wpływu na działanie<br /><br />     L1_ON;      // włączasz diodę od czasu jej wyłączenia minęło tak mało casu<br />                    // że chyba nawet nie widać jej wyłączenia :)<br /><br />     Timer1 = 10; // Ponownie nakręcasz Timer1 i teraz dopiero w następnym sprawdzeniu<br />                       // if-a będzie on zauważony[/syntax]<br /><br />to nie oto Ci chodziło <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />w pierwszym programie masz to dobrze zrobione<br /><br />[syntax=c]if (( i &lt; 99) &amp;&amp; (!Timer1 )) //Sprawdzasz czy minął czas Timer1<br />     {<br />          L1_TOG;       // Przełączasz diodę<br />          Timer1 = 10; //nakręcasz Timer1 i przy ponownym sprawdzeniu<br />                            // if-a kiedy Timer1 będzie =0 apiać to samo<br />      }[/syntax]<br /><br />Jeśli coś pokiełbasiłem to przepraszam ale się uczę <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 22 gru 2013, o 20:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AndreAs]]></name></author>
<updated>2013-12-22T19:50:53+01:00</updated>
<published>2013-12-22T19:50:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62075#p62075</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62075#p62075"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=62075#p62075"><![CDATA[
Tak jak mi zasugerował Mirek postanowiłem zrobić ćwiczenie opisane niebieskim drukiem. I tak działa pierwszy kod , a drugi nie , powiedzcie mi dlaczego? Pozdrowienia.<br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />//#include &lt;avr/iom32.h&gt;<br /><br /><br />#define L1_PIN (1&lt;&lt;PC7)<br />#define L2_PIN (1&lt;&lt;PC6)<br />#define L3_PIN (1&lt;&lt;PC5)<br />#define L4_PIN (1&lt;&lt;PC4)<br />#define L1_TOG PORTC ^= L1_PIN<br />#define L1_ON  PORTC &amp;= ~L1_PIN<br />#define L1_OFF PORTC |= L1_PIN<br />#define L2_TOG PORTC ^= L2_PIN<br />#define L2_ON  PORTC &amp;= ~L2_PIN<br />#define L2_OFF PORTC |= L2_PIN<br />#define L3_TOG PORTC ^= L3_PIN<br />#define L4_TOG PORTC ^= L4_PIN<br /><br />volatile uint16_t Timer1,Timer2,Timer3,Timer4;<br />uint16_t i;<br /><br />int main(void)<br /><br />{<br /><br />        DDRC |= L1_PIN|L2_PIN|L3_PIN|L4_PIN;<br /><br /><br />       //  TIMER1 dla F_CPU=11,0592MHz */<br />        TCCR1B |= (1&lt;&lt;WGM12);/* tryb CTC */<br />        TCCR1B |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10);  /* preskaler = 1024 */<br />        OCR1A = 107;/* podział przez 108  */<br />        TIMSK |= (1&lt;&lt;OCIE1A);/* przerwanie CompareMatch */<br />           // tyknięcie 10ms<br /><br />        sei(); //procedura przerwania<br /><br />        while(1)<br /><br />       {<br /><br /><br />                        if (( i &lt; 99) &amp;&amp; (!Timer1 )) //Funkcja działania diody 1  czas ok. 10 s<br />                        {<br />                            L1_TOG;       // Mruganie diody 50 ms<br />                        Timer1 = 10;<br /><br />                        }<br /><br /><br />                        if  ((i &gt; 99) &amp;&amp; (!Timer2 )) // Funkcja działania diody 2 czas ok. 10 s<br />                        {<br />                            L2_TOG;             // Mruganie diody 100 ms<br />                        Timer2 = 5;<br /><br />                        }<br /><br />                        if (!Timer4)<br /><br />                           {<br /><br />                             i++;<br />                             L4_TOG;                   // Funkcja generatora przełączania diody 1 i 2<br />                             Timer4 = 10;             // Tyknięcie generatora 0,1 s<br />                             if (i &gt; 199) i = 0;<br /><br />                             }<br /><br /><br />           if( !Timer3 )// Funkcja działania diody 3<br /><br />           {<br />                Timer3=40;      // Mruganie diody 400 ms<br />                L3_TOG;<br />           }<br /><br />     }<br /><br />}<br /><br />ISR(TIMER1_COMPA_vect)<br /><br />      {<br />         uint16_t n;<br /><br />          n = Timer1;<br />          if (n) Timer1 = --n;<br /><br />          n = Timer2;<br />          if (n) Timer2 = --n;<br /><br />          n = Timer3;<br />          if (n) Timer3 = --n;<br /><br />          n = Timer4;<br />         if (n) Timer4 = --n;<br />     }[/syntax]<br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />//#include &lt;avr/iom32.h&gt;<br /><br /><br />#define L1_PIN (1&lt;&lt;PC7)<br />#define L2_PIN (1&lt;&lt;PC6)<br />#define L3_PIN (1&lt;&lt;PC5)<br />#define L4_PIN (1&lt;&lt;PC4)<br />#define L1_TOG PORTC ^= L1_PIN<br />#define L1_ON  PORTC &amp;= ~L1_PIN<br />#define L1_OFF PORTC |= L1_PIN<br />#define L2_TOG PORTC ^= L2_PIN<br />#define L2_ON  PORTC &amp;= ~L2_PIN<br />#define L2_OFF PORTC |= L2_PIN<br />#define L3_TOG PORTC ^= L3_PIN<br />#define L4_TOG PORTC ^= L4_PIN<br /><br />volatile uint16_t Timer1,Timer2,Timer3,Timer4;<br />uint16_t i;<br /><br />int main(void)<br /><br />{<br /><br />        DDRC |= L1_PIN|L2_PIN|L3_PIN|L4_PIN;<br /><br /><br />       //  TIMER1 dla F_CPU=11,0592MHz */<br />        TCCR1B |= (1&lt;&lt;WGM12);/* tryb CTC */<br />        TCCR1B |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10);  /* preskaler = 1024 */<br />        OCR1A = 107;/* podział przez 108  */<br />        TIMSK |= (1&lt;&lt;OCIE1A);/* przerwanie CompareMatch */<br />           // tyknięcie 10ms<br /><br />        sei(); //procedura przerwania<br /><br />        while(1)<br /><br />       {<br /><br /><br />                        if (( i &lt; 99) &amp;&amp; (!Timer1 )) //Funkcja działania diody 1  czas ok. 10 s<br />                        {<br />                            L1_OFF;   // Mruganie diody 50 ms<br />                        Timer1 = 10;<br />                        L1_ON;<br />                        Timer1 = 10;<br />                        }<br /><br /><br />                        if  ((i &gt; 99) &amp;&amp; (!Timer2 )) // Funkcja działania diody 2 czas ok. 10 s<br />                        {<br />                            L2_OFF;         // Mruganie diody 100 ms<br />                        Timer2 = 5;<br />                        L2_ON;           // Mruganie diody 100 ms<br />                        Timer2 = 5;<br />                        }<br /><br />                        if (!Timer4)<br /><br />                           {<br /><br />                             i++;<br />                             L4_TOG;                   // Funkcja generatora przełączania diody 1 i 2<br />                             Timer4 = 10;             // Tyknięcie generatora 0,1 s<br />                             if (i &gt; 199) i = 0;<br /><br />                             }<br /><br /><br />           if( !Timer3 )// Funkcja działania diody 3<br /><br />           {<br />                Timer3=40;      // Mruganie diody 400 ms<br />                L3_TOG;<br />           }<br /><br />     }<br /><br />}<br /><br />ISR(TIMER1_COMPA_vect)<br /><br />      {<br />         uint16_t n;<br /><br />          n = Timer1;<br />          if (n) Timer1 = --n;<br /><br />          n = Timer2;<br />          if (n) Timer2 = --n;<br /><br />          n = Timer3;<br />          if (n) Timer3 = --n;<br /><br />          n = Timer4;<br />         if (n) Timer4 = --n;<br />     }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2092">AndreAs</a> — 22 gru 2013, o 19:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-12-19T17:25:08+01:00</updated>
<published>2013-12-19T17:25:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61806#p61806</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61806#p61806"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61806#p61806"><![CDATA[
A! no i super - teraz jest krótki przejrzysty kod - zwróć uwagę - że twoje polecenie LEDx_TOG; jest jakby &quot;procesem&quot; który odbywa się co określoną ilość czasu, pomimo że pętla główna while(1) .... zapiernicza (sorki za wyrażenie) nadal jak motorek - czyli mamy odpalane procesy bez delaya i w sposób nieblokujący ...<br /><br />no to teraz z tego punktu widzenia pomyśl jak taki mechanizm - takiego IF() zastosować dalej .... o ile do końca i w PEŁNI rozumiesz jak on działa .... i nie ma w razie czego wstydzić się przyznać - że jeszcze nie do końca np czegoś rozumiesz ...<br /><br />ale dobra dalej ....<br /><br />teraz chciałbyś mieć opóźnienie w pętli .... czyli mamy np taki przypadek:<br /><br />[syntax=c]for(i=0; i&lt;10; i++ ) {<br />   // coś tam coś tam<br />   _delay_ms( 100 );<br />}[/syntax]<br />i chciałbyś to zamienić na użycie z timerem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... no to przecież nie tak jak to wcześniej próbowałeś robić bo to wskazywało właśnie że gdzieś czegoś nie rozumiesz i dlatego prosiłem o powrót do początków czyli timera programowego z diodą ...<br /><br />a zatem można to zrobić np tak (podkreślam - na przykład - co oznacza że można jeszcze na milion innych sposobów - żeby nie urodził się w głowie pomysł że tylko tak! ... ja chcę po prostu naprowadzić jak najprostszymi przykładami na dalsze już samodzielne myślenie i <br />kombinowanie w tym zakresie a nie wciskanie komuś (jak to robią na innych blogach) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> że TYLKO tak się programuje<br /><br />[syntax=c]uint8_t i;<br /><br /><br />if( !Timer1 ) {<br /><br />   i++;<br />   // coś tam coś tam<br />   if( i &gt; 9 ) i=0;<br /><br />   Timer1 = 50;<br />}[/syntax]<br /><br />oczywiście musisz pamiętać o tym, że jeśli to będzie działo się w pętli głównej to ładnie co jakiś czas wykona się ta operacja &quot;coś tam coś tam&quot; tak jak wyżej w pętli for .... ale !!! ale w międzyczasie po każdym wykonaniu mogą się jeszcze równolegle odbyć kolejne działania z innego timera programowego - a zatem już CAAAAAŁKIEM inaczej trzeba zacząć podchodzić do pisania kodu<br /><br />a nie że weźmiesz sobie przykładowy kod z delayami - wpiszesz sobie w te miejsca jakiś tam Timer1 .... i co ? to tak jakbyś chciał zastąpić delaya innym delayem - czyli zatrzymać na chwilę wykonywanie innych procesów - a pewnie docelowo nie o to ci chodzi<br /><br />więc jak widzisz - warto jeszcze troszkę poćwiczyć z diodami - bo one dają lepszy obraz - po prostu wymyślać sobie zadania dla takich 2-3 albo i 10 diod ... i kombinować np<br /><br /><strong><span style="color: #0040FF">chcę żeby najpierw mi migała pierwsza dioda LED co 100ms na timerze programowym 1, a gdy skończy to wtedy druga ma pomigać co 50ms na timerze 2, a w międzyczasie trzecia ma non stop migać co 400ms na timerze 3</span></strong><br /><br />widzisz ? .... o taką metodą ćwiczymy sobie w najprostszy sposób timery programowe, trzeba sobie zacząć wyznaczać mniejsze cele i je ogarniać - a nie od razu rzucić się na przerobienie nawet niewielkiego kodu - ale bez zrozumienia jak to działa (albo gdy wydaje ci się tylko że wiesz jak to działa) bo nawet ten niewielki kod będzie wtedy dla ciebie za dużym głazem do podniesienia z tą technologią którą na razie znasz ok?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 19 gru 2013, o 17:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AndreAs]]></name></author>
<updated>2013-12-19T16:54:16+01:00</updated>
<published>2013-12-19T16:54:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61804#p61804</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61804#p61804"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61804#p61804"><![CDATA[
Mirku skoro mamy zacząć od dwóch migających diód , to żaden problem , bo i tak jestem wdzięczny tobie i wszystkim innym osobom na tym forum , za poświęcony czas .<br />Dobra no to krótko -diody z timerem programowym mi działają , ale czekam na uwagi i sugestie co można tym kodzie poprawić Dzięki i Pozdrawiam.<br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />//#include &lt;avr/iom32.h&gt;<br /><br /><br /><br />#define LED1_PIN (1&lt;&lt;PC7)<br />#define LED2_PIN (1&lt;&lt;PC6)<br />#define LED1_TOG PORTC ^= LED1_PIN<br />#define LED2_TOG PORTC ^= LED2_PIN<br /><br />volatile uint16_t Timer1 ,Timer2 ;<br /><br />int main(void){<br /><br />        DDRC |= LED1_PIN|LED2_PIN;   // pin diody na wyjscie<br /><br /><br /><br />       //  TIMER1 dla F_CPU=11,0592MHz */<br />        TCCR1B |= (1&lt;&lt;WGM12);/* tryb CTC */<br />        TCCR1B |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10);  /* preskaler = 1024 */<br />        OCR1A = 107;/* podział przez 108  */<br />        TIMSK |= (1&lt;&lt;OCIE1A);/* przerwanie CompareMatch */<br />           // tyknięcie 10ms<br /><br />        sei(); //procedura przerwania<br /><br />        while(1)<br />        {<br />        if( !Timer1 )<br /><br />        {<br />                Timer1=50;<br />                LED1_TOG;<br />        }<br /><br />        if( !Timer2)<br /><br />        {<br />                Timer2=100;<br />                LED2_TOG;<br />        }<br />        }<br /><br />}<br /><br />ISR(TIMER1_COMPA_vect)<br /><br />      {<br />         uint16_t n;<br /><br />          n = Timer1;<br />          if (n) Timer1 = --n;<br /><br />          n = Timer2;<br />          if (n) Timer2 = --n;<br />      }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2092">AndreAs</a> — 19 gru 2013, o 16:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-12-18T23:56:03+01:00</updated>
<published>2013-12-18T23:56:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61742#p61742</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61742#p61742"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61742#p61742"><![CDATA[
Ja w ogóle nie rozumiem - jak można aż TAK MOCNO utrudniać sobie życie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />no jeśli ja bym nie rozumiał timerów programowych jeszcze (a tak też miałem kiedyś przecież!) ... to nigdy bym nie wpadł na pomysł żeby sobie je (przepraszam za określenie) &quot;wklepać&quot; razem z jakimś ogromnym kodem do testowania gdzie np do końca nie rozumiem jak w ogóle sobie organizować na różne sposoby opóźnienia i już nie ważne czy z delayami czy bez.<br /><br />AndreAs ---&gt; wiesz od czego ja zaczynałem trenowanie timerów programowych ? Od migania za ich pomocą diodami LED. Kod krótki, prosty i łatwy do ogarnięcia po to aby do bólu zrozumieć istotę timerów programowych .... I taką drogę pokazuję w Bluebooku ...<br /><br />tymczasem ty - nagle próbujesz wplatać timery programowe w kod, który i bez nich sprawia ci nieco kłopotu ... po co ?<br /><br />Już nie wspomnę - że nawet jak zadajesz pytanie to komu - sam się zastanów będzie się chciało analizować jakiś tasiemiec - zamiast precyzyjnie zadanego pytania ze wskazaniem na kłopot w kodzie, wskazania fragmentu, który sprawia ci problem ....<br /><br />tymczasem wklejasz hektolitr kodu - po raz kolejny zresztą nie w znacznikach<br /><br />[ syntax = c ]<br /><br />tylko z uporem w<br /><br />[ code ]<br /><br />co powoduje kolejny problem żeby wygodnie analizować kod tym którym zadajesz pytanie ....<br /><br />Warto pomyśleć i tego też staram się uczyć na tym forum, jak dobrze zadawać pytania aby uzyskać szybko dobre i precyzyjne odpowiedzi, a nie wkleić mnóstwo kodu i zapytać  - &quot;powiedzcie mi co tu jest źle z tym timerem&quot;<br /><br />tak jak kolega wyżej mówił - no wszystko jest źle z timerem programowym dlatego proszę<br /><br />wklej, krótki kod np z miganiem dwoma diodami LED w różnym tempie za pomocą dwóch timerów programowych - jak to okiełznasz - do końca to zobaczysz że dalej już pójdzie ci z górki ok ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br /><div class="quotetitle">Juffre napisał(a):</div><div class="quotecontent"><br />W BB masz to dokładnie opisane, wczytaj się.<br /></div><br /><br />DOKŁADNIE - wczytaj się, wypróbuj tamtejszy przykład z diodą LED a gdy czegoś nie zrozumiesz to pytaj .... bo uwierz mi - staram się prowadzić od podstaw ... ale jak ktoś chce je pominąć i skoczyć od radu na za głęboką wodę - to nie ma co się dziwić że się sam podtapia<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 18 gru 2013, o 23:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Juffre]]></name></author>
<updated>2013-12-18T23:12:15+01:00</updated>
<published>2013-12-18T23:12:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61735#p61735</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61735#p61735"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61735#p61735"><![CDATA[
Całkowicie źle podchodzisz do opóznień generowanych za pomocą timera sprzętowego. Chodzi tutaj o sprawdzaniu w if-ie czy timer już odliczył zadany odcinek czasu.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Wpisanie w programie [syntax=c]Timer=500;[/syntax] nie powoduje wygenerowania opóźnienia 500ms. To nie działa dokładnie tak samo jak zwykły delay. W BB masz to dokładnie opisane, wczytaj się.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=473">Juffre</a> — 18 gru 2013, o 23:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AndreAs]]></name></author>
<updated>2013-12-18T22:51:47+01:00</updated>
<published>2013-12-18T22:51:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61729#p61729</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61729#p61729"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61729#p61729"><![CDATA[
Procek ATmega 32 , Timer0 - sprzętowy PWM , Timer2 - programowy PWM , Timer1 -  programowy timer , do obsługi opóźnień . <br /> i właśnie timerem1 mam problem , wszystko działa jak za timer1 w kodzie wstawię delay-e , tak jak to opisane w BB.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2092">AndreAs</a> — 18 gru 2013, o 22:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-12-18T22:45:54+01:00</updated>
<published>2013-12-18T22:45:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61726#p61726</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61726#p61726"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61726#p61726"><![CDATA[
Gdzieś ktoś kiedyś napisał, że aby pozbyć się delay'ów w PWM to &quot;naj sam wpierw&quot;  należy się zastanowić czym jest PWM jako taki. Jak działa, kiedy działa jak wygląda.<br /><br />W ten sposób raczej nie zadziała ( chociaż mam nadzieję, że Ci się uda). Ja ostatnio sporo czasu spędziłem nad tym żeby coś takiego zrobić i się ..... udało, ale na razie tylko częściowo. Pwm jest co prawda, ale mam jeszcze problem z rozjasnianiem i ściemnianiem i pewnie jeszcze do tego wrócę jak się z innymi rzeczami ogarnę. Na razie kod nie nadaje się do publikacji .... ( Mirek kazałby mi pewnie ze 10 ...... e100 pompek zrobić ... ) <br /><br />Z trzeciej strony to po co się w to bawić ? Są dedykowane układy PWM ( PCA9685) - czytaj u SunRiviera na stronce.<br /><br />A Do prostego wysterowania kilku kilkunastu &quot;schodów&quot; w zupełności wystarczy PWM programowy.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />Przepraszam za taki demotywujący post ale może chociaż Ty oszczędzisz trochę czasu .....<br /><br />Ja jak już mniej więcej skumałem co i jak to ogarnąłem się że nie było warto ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 18 gru 2013, o 22:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Juffre]]></name></author>
<updated>2013-12-18T22:40:32+01:00</updated>
<published>2013-12-18T22:40:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61725#p61725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61725#p61725"/>
<title type="html"><![CDATA[Re: Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61725#p61725"><![CDATA[
1. Kod wrzucamy w syntax-ie ale bez dodatkowych znaczników code.<br />2. Opisz dokładniej co nie działa. Nie piszesz nawet jaki masz procesor. Nie wiem czy dobrze konfigurujesz bity konfiguracyjne timerów.<br />3. Jeżeli chcesz korzystać ze sprzętowego PWM z timer-a to i tak musisz skonfigurować piny timera jako wyjścia.<br />4. Na pierwszy rzut oka wydaje mi się, że nieprawidłowo używasz timera programowego. Ale temu się jeszcze przyglądne<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=473">Juffre</a> — 18 gru 2013, o 22:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AndreAs]]></name></author>
<updated>2013-12-18T22:18:39+01:00</updated>
<published>2013-12-18T22:18:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61712#p61712</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61712#p61712"/>
<title type="html"><![CDATA[Timer do PMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5208&amp;p=61712#p61712"><![CDATA[
Próbuje dojść do ładu z timerem1 dla PWM , zamiast delay-ów , ale mam za mało doświadczenia w programowaniu , dlatego mam prośbę koledzy rzućcie okiem na kod gdzie jest błąd . Dodam że na delay-ach działa. Dzięki z góry i Pozdrawiam.<br /><br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">&#91;syntax=c&#93;#include &lt;avr/io.h&gt;<br />//#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />// definicje zmiennych do sterowania 4 kanałami programowych PWM<br />// zmienne typu uint8_t, rozdzielczość 8-bitowa<br />volatile uint8_t pwm1, pwm2, pwm3, pwm4;<br />volatile uint16_t Timer1;<br /><br />// główna funkcja programu main()<br />int main(void)<br />{<br /><br />   //***** PROGRAMOWY PWM - 4 KANAŁY*******<br />   // ustawienie pinów kanałów programowych PWM jako WYJŚCIA<br />   DDRC |= (1&lt;&lt;PC7)|(1&lt;&lt;PC6)|(1&lt;&lt;PC5)|(1&lt;&lt;PC4);<br /><br />   // wyłączenie diod LED podłączonych katodami do wyjść<br />   PORTC |= (1&lt;&lt;PC7)|(1&lt;&lt;PC6)|(1&lt;&lt;PC5)|(1&lt;&lt;PC4);<br /><br /><br />   //***** SPRZĘTOWY PWM - *******<br />   // ustawienia TIMER2 w Fast PWM<br />   TCCR0 |= (1&lt;&lt;WGM01)|(1&lt;&lt;WGM00);      // tryb Fast PWM<br />   TCCR0 |= (1&lt;&lt;COM01);            // clear at TOP<br />   TCCR0 |= (1&lt;&lt;CS00);               // preskaler = 1<br />   OCR0=255;                     // wygaszenie diody w kanale PWM<br /><br /><br />    //  TIMER1 dla F_CPU=11,0592MHz */<br />     TCCR1B |= (1&lt;&lt;WGM12);            /* tryb CTC */<br />     TCCR1B |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10);  /* preskaler = 1024 */<br />     OCR1A = 9;                       /* podział przez 10  */<br />     TIMSK |= (1&lt;&lt;OCIE1A);            /* przerwanie CompareMatch */<br />        // tyknięcie 1ms<br /><br /><br /><br />   // ustawienia TIMER2 w tryb CTC<br />   TCCR2 |= (1&lt;&lt;WGM21);   // tryb  CTC<br />   TCCR2 |= (1&lt;&lt;CS20);      // preskaler = 1<br />   OCR2 = 199;            // dodatkowy podział częsttotliwości przez 200<br />   TIMSK |= (1&lt;&lt;OCIE2);   // zezwolenie na przerwanie CompareMatch<br /><br /><br /><br /><br />   sei();            // odblokowanie globalne przerwań<br /><br />   uint8_t i;         // definicja zmiennej i na potrzeby pętli for()<br /><br /><br />   while(1)<br />   {<br />      // pętla rozjaśniająca 4 diod LED<br />      for(i=0;i&lt;255;i++)<br />      {<br />         OCR0=i;      // ta dioda będzie ulegała ściemnianiu w tej pętli<br />         pwm1=i;<br />         pwm2=i;<br />         pwm3=i;<br />         pwm4=i;<br /><br /><br />         // W związku z dużą nieliniowością zależności prądu diod LED<br />         // i jasności świecenia, wprowadzone jest zmienne opóźnienie<br />         // przy wartościach bliskich zera aby zminimalizować ten efekt<br />         if(i&gt;50) Timer1=3;<br />         else Timer1=10;<br />      }<br />      // całkowite rozjaśnienie diody LED przez 100ms<br />      OCR0=255;<br />      // rozświetlenie na maksimum przez 100ms<br />      pwm1=255;<br />      pwm2=255;<br />      pwm3=255;<br />      pwm4=255;<br /><br />      Timer1=500;<br /><br />      // pętla stopniowo ściemniająca 4 diod LED<br />      for(i=255;i;i--)<br />      {<br />         OCR0=i;      // ta dioda będzie ulegała rozjaśnianiu w tej pętli<br />         pwm1=i;<br />         pwm2=i;<br />         pwm3=i;<br />         pwm4=i;<br /><br /><br />         // W związku z dużą nieliniowością zależności prądu diod LED<br />         // i jasności świecenia, wprowadzone jest zmienne opóźnienie<br />         // przy wartościach bliskich zera aby zminimalizować ten efekt<br />         if(i&gt;50) Timer1=3;<br />         else Timer1=10;<br />      }<br />      // całkowite rozjaśnienie diody LED przez 100ms<br />      OCR0=0;<br />      // całkowite wygaszenie diod LED przez 100ms<br />      pwm1=0;<br />      pwm2=0;<br />      pwm3=0;<br />      pwm4=0;<br /><br />      Timer1=500;<br />   }<br /><br />}<br /><br />ISR( TIMER1_COMPA_vect )<br /><br /><br />      {<br />            uint16_t n;<br /><br />             n = Timer1;<br />             if (n) Timer1 = --n;<br /><br />     }<br /><br />// ciało procedury obsługi przerwania Compare Match Timera2<br />ISR( TIMER2_COMP_vect )<br />{<br />   static uint8_t cnt; // definicja naszego licznika PWM<br /><br />   // bezpośrednie sterowanie wyjściami kanałów PWM<br />   if(cnt&gt;=pwm1) PORTC |= (1&lt;&lt;PC7); else PORTC &amp;= ~(1&lt;&lt;PC7);<br />   if(cnt&gt;=pwm2) PORTC |= (1&lt;&lt;PC6); else PORTC &amp;= ~(1&lt;&lt;PC6);<br />   if(cnt&gt;=pwm3) PORTC |= (1&lt;&lt;PC5); else PORTC &amp;= ~(1&lt;&lt;PC5);<br />   if(cnt&gt;=pwm4) PORTC |= (1&lt;&lt;PC4); else PORTC &amp;= ~(1&lt;&lt;PC4);<br /><br /><br />   cnt++;   // zwiększanie licznika o 1<br /><br />}&#91;/syntax&#93;</div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2092">AndreAs</a> — 18 gru 2013, o 22:18</p><hr />
]]></content>
</entry>
</feed>