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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=15746&amp;mode</id>
<entry>
<author><name><![CDATA[stefan_bak]]></name></author>
<updated>2016-07-13T00:58:00+01:00</updated>
<published>2016-07-13T00:58:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163906#p163906</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163906#p163906"/>
<title type="html"><![CDATA[Re: Losowe zachowanie PWM Atmega88PA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163906#p163906"><![CDATA[
Sprawdziłem i faktycznie rozwiązanie z dodatkowym przerwaniem okazało się strzałem w dziesiątkę. <br /><br />Wielkie dzięki za pomoc <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=1827">stefan_bak</a> — 13 lip 2016, o 00:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-07-08T19:18:29+01:00</updated>
<published>2016-07-08T19:18:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163693#p163693</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163693#p163693"/>
<title type="html"><![CDATA[Re: Losowe zachowanie PWM Atmega88PA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163693#p163693"><![CDATA[
<div class="quotetitle">stefan_bak napisał(a):</div><div class="quotecontent"><br />Przez chwilę myślałem, że źródłem problememu jest zbyt duża częstotliwość modyfikowania rejestrów OCR1B oraz ICR1. Rozumiem, że skoro mogę to teoretycznie zmieniać przy każdym przepełnieniu timera1, to moja teoria raczej odpada?<br /></div><br />Raczej nie częstotliwość tu decyduje, a przypadkowość momentu zmiany wartości ICR1. Podejrzewam, że problem będzie podobnej natury jak w tym wątku: <a href="http://forum.atnel.pl/topic15630.html#p162736"  class="postlink">http://forum.atnel.pl/topic15630.html#p162736</a><br />tylko w Twoim przypadku wartość TOP znajduje się w ICR1. Rozwiązanie, które zaproponowałem, polega na tym, że w momencie zmiany ICR1 wartość TCNT1 będzie zawsze bardzo niska, więc ICR1 zawsze będzie większe. W tej chwili moment ten jest dosyć przypadkowy, bo timery 1 i 2 nie pracują synchronicznie, to znaczy mają inne interwały czasowe, które nie są prawdopodobnie podzielne przez siebie bez reszty, tym bardziej, że przecież okres zliczania timera 1 zmienia się po zmianie ICR1.<br /><br /><br /><div class="quotetitle">stefan_bak napisał(a):</div><div class="quotecontent"><br />Dodam, że wykonałem jeszcze jeden test, a mianowicie zmieniłem w przerwaniu timera2, żeby set_frequency nie było wywoływane co 20 przerwań, a co 100 i wtedy problem nie występował przez kilka minut ciągłej pracy.<br /></div><br />Podejrzewam, że zmniejszenie częstotliwości wywołania funkcji <em>set_frequency()</em> to tylko zmniejszenie prawdopodobieństwa, a problem prędzej czy później i tak wystąpi. Chwila, w której to będzie następować może być zależna od melodii, czyli od wartości ICR1 z tablicy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 8 lip 2016, o 19:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[stefan_bak]]></name></author>
<updated>2016-07-08T18:08:21+01:00</updated>
<published>2016-07-08T18:08:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163685#p163685</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163685#p163685"/>
<title type="html"><![CDATA[Re: Losowe zachowanie PWM Atmega88PA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163685#p163685"><![CDATA[
Dzięki za szybkie odpowiedzi. Dopiero jutro sprawdzę jak zachowa mi się kontroler z proponowanymi zmianami, jednak mam pytanie co do rady o volatile. Samo <em>scheme_buffer</em> nie jest volatile, a tylko zmienna <em>prescaler_time</em>. Wydawało mi się, że skoro inkrementuje ją przerwanie oraz resetuje funkcja <em>Play</em>, to jednak trzeba użyć volatile.<br /><br />Przez chwilę myślałem, że źródłem problememu jest zbyt duża częstotliwość modyfikowania rejestrów <strong>OCR1B</strong> oraz <strong>ICR1</strong>. Rozumiem, że skoro mogę to teoretycznie zmieniać przy każdym przepełnieniu timera1, to moja teoria raczej odpada?<br /><br />Dodam, że wykonałem jeszcze jeden test, a mianowicie zmieniłem w przerwaniu timera2, żeby <em>set_frequency</em> nie było wywoływane co 20 przerwań, a co 100 i wtedy problem nie występował przez kilka minut ciągłej pracy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1827">stefan_bak</a> — 8 lip 2016, o 18:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-07-08T17:27:13+01:00</updated>
<published>2016-07-08T17:27:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163683#p163683</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163683#p163683"/>
<title type="html"><![CDATA[Re: Losowe zachowanie PWM Atmega88PA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163683#p163683"><![CDATA[
<div class="quotetitle">doktur napisał(a):</div><div class="quotecontent"><br />Tak na pierwszy rzut oka to tylko to że skoro scheme_bufer jest wykorzystywany i w przerwaniu i nie to powinno być z volatile.<br /></div>Przerwanie używa tylko wskaźnika do 'scheme_buffer', a ten jest stały, więc volatile nie jest potrzebne.<br /><br />Proponowałbym spróbować tak:<br /><br />Zadeklarować dwie zmienne globalne:[syntax=c]volatile uint16_t OCR1B_value = 0xFF;<br />volatile uint16_t ICR1_value = 0xFFFF;[/syntax]<br /><br />Funkcję <em>set_frequency()</em> zmienić na:[syntax=c]void set_frequency(const uint8_t* params)<br />{<br />   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) /* zabezpieczenie, gdyby funkcja była wywoływana */<br />                                     /* nie tylko wewnątrz procedury obsługi przerwania */<br />   {<br />      OCR1B_value = *params;<br />      ICR1_value = *(params + 1);<br />   }<br />}[/syntax]<br /><br />We funkcji <em>Init_buzzer()</em> włączyć przerwanie od przepełnienia timera 1:[syntax=c]TIMSK1 = (1&lt;&lt;TOIE1);[/syntax] i w procedurze obsługi tego przerwania:[syntax=c]ISR (TIMER1_OVF_vect) {<br />   OCR1B = OCR1B_value;<br />   ICR1 = ICR1_value;<br />}[/syntax]<br /><br />Powinno pomóc <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 8 lip 2016, o 17:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[doktur]]></name></author>
<updated>2016-07-08T16:29:32+01:00</updated>
<published>2016-07-08T16:29:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163672#p163672</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163672#p163672"/>
<title type="html"><![CDATA[Re: Losowe zachowanie PWM Atmega88PA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163672#p163672"><![CDATA[
Tak na pierwszy rzut oka to tylko to że skoro  scheme_bufer jest wykorzystywany i w przerwaniu i nie to powinno być z volatile.<br /><br />Może jakaś inna część kodu bruździ?<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14344">doktur</a> — 8 lip 2016, o 16:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[stefan_bak]]></name></author>
<updated>2016-07-08T15:42:25+01:00</updated>
<published>2016-07-08T15:42:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163665#p163665</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163665#p163665"/>
<title type="html"><![CDATA[Losowe zachowanie PWM Atmega88PA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15746&amp;p=163665#p163665"><![CDATA[
Cześć,<br />Mam problem z PWM sterowanym z timera1 używanym do sterowania on buzzerem. Działa to tak, że timer2 odlicza konkretny czas, aby zmienić częstotliwość dla PWM. W tablicy mam zapisane kilka zestawów częstotliwości, na które po kolei ma się przestawiać PWM, co daje w efekcie krótką melodyjkę. Na potrzeby testów zmieniłem program, żeby po wywołaniu funkcji Play wywoływał na przemian tylko dwie częstotliwości i ku memu zdumieniu działa to bardzo losowo. Np. 30 sekund gra tak jak powinien, następnie zawieszą się i przez sekundę w ogóle nie wydaje dźwięku albo nie działa jeden z tonów i efekt jest taki, że na przemian gra i cichnie. Pomierzyłem oscyloskopem i wygląda na to, że winnym jest PWM, licznik timer2 wywołuje się prawidłowo - regularnie, natomiast zachowanie PWM jest totalnie losowe. Poniżej załączam kod obsługujący buzzer oraz krótki film z obrazem z oscyloskopu oraz dźwiękiem buzzera (przyciąłem tak, żeby było widać przejście, ale dzieję się tak za każdym razem inaczej i po kolejnym losowym czasie zestaw sam znowu wraca do tonu z początku). Męczę się już z tym jakiś czas i nie mam pojęcia co tam się może dziać. Funkcja Play jest wywoływana z raspberry pi pi I2C. Ogólnie komunikacja z Atmegą działa i jej inne zadania również, więc wnioskuje, że nie zawiesza (resetuje) się cały procesor, a jedynie PWM.<br /><br />Film:<br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br /><br />#include &quot;buzzer.h&quot;<br />volatile uint16_t prescaler_timer = 0;<br />volatile uint8_t test = 0;<br />uint8_t scheme_buffer&#91;12&#93;;<br /><br />const uint8_t schemes&#91;&#93; PROGMEM = {<br />                            0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,<br />                            0x28, 0x2A, 0xFF, 0xFF, 0x28, 0x2A, 0x28, 0x2A, 0xFF, 0xFF, 0xFF, 0xFF,<br />                            0x28, 0x2A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,<br />                            0x28, 0x2A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,<br />                            0x28, 0xE0, 0xFF, 0xFF, 0x28, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,<br />                            0x28, 0xE0, 0xFF, 0xFF, 0x28, 0xE0, 0xFF, 0xFF, 0x28, 0xE0, 0xFF, 0xFF,<br />                            0x28, 0x2A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,<br />                            0x28, 0x2A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,<br />                            0x28, 0x2A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,<br />                            0x28, 0x2A, 0xFF, 0xFF, 0x28, 0x2A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF<br />                        };<br /><br />void set_frequency(const uint8_t* params)<br />{<br />   OCR1B = *params;<br />   ICR1 = *(params + 1);<br />}<br /><br />ISR (TIMER2_COMPA_vect)<br />{<br />   if(prescaler_timer % 30 == 0)<br />   {<br />      //if(prescaler_timer &lt; 120)<br />         set_frequency(scheme_buffer + ((prescaler_timer / 30) % 2));<br />      //else<br />      //   prescaler_timer = 99;<br />   }<br />   if(prescaler_timer == 300)<br />      prescaler_timer = 0;<br />   prescaler_timer++;<br /><br />}<br /><br />void Init_buzzer()<br />{<br />   DDRB |= (1 &lt;&lt; PB2);<br /><br />   TCCR1A |= (1 &lt;&lt; COM1B1) | (1 &lt;&lt; WGM11);<br />   TCCR1B |= (1 &lt;&lt; WGM12) | (1 &lt;&lt; WGM13);<br />   <br />   TCCR1B |= (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10);<br />   <br />   OCR1B = 0xFF;<br />   ICR1 = 0xFFFF;<br /><br />   <br />   TCCR2A = (1 &lt;&lt; WGM21);<br />   TCCR2B = (1 &lt;&lt; CS20) | (1 &lt;&lt; CS21) | (1 &lt;&lt; CS22);<br />   TCNT2 = 0;<br />   OCR2A = 71;<br />   TIMSK2 = (1 &lt;&lt; OCIE2A);<br />}<br /><br />void Play(uint8_t scheme)<br />{<br />   memcpy_P(scheme_buffer, schemes + (scheme * 12), 12);<br />   TCNT2 = 0;<br />   prescaler_timer = 0;<br />}<br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1827">stefan_bak</a> — 8 lip 2016, o 15:42</p><hr />
]]></content>
</entry>
</feed>