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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10663&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-02-22T23:00:59+01:00</updated>
<published>2015-02-22T23:00:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=120489#p120489</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=120489#p120489"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=120489#p120489"><![CDATA[
<div class="quotetitle">lukaszSZ999 napisał(a):</div><div class="quotecontent"><br />amplituda =ADCH/255;                        //amplituda jako float<br /></div><br />Tak na pewno jest źle. Powinno być 255.0<br /><br />Tak w ogóle to po co ci ten float? Wpisz po prostu:<br />[syntax=c]OCR0B =(uint8_t) tablica&#91;i&#93; * ADCH / 255;[/syntax]<br />Najpierw wykona się mnożenie, a potem dzielenie i wynik będzie poprawny.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 22 lut 2015, o 23:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukaszSZ999]]></name></author>
<updated>2015-02-21T19:33:05+01:00</updated>
<published>2015-02-21T19:33:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=120263#p120263</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=120263#p120263"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=120263#p120263"><![CDATA[
No dobrze<br /><br />Puściłem już ładnie przez filtr RC i mam sinusoide z regulacją czestotliwosci ale za chiny ludowe nie mogę regulować amplitudy. Wydawałoby się to proste.<br /><br />[syntax=c]ISR(TIMER0_OVF_vect){<br />  ADCSRA |= (1&lt;&lt;ADSC);                     //ADSC: uruchomienie pojedynczej konwersji<br /><br />  amplituda =ADCH/255;                        //amplituda jako float<br /><br />  i= i+1+ADCH/25;<br /><br />  <br />if (i &gt;= 1000)<br />{<br />  faza1 = !faza1;<br />  i = 0;<br />}<br />                                                         //obsługa 1 faz<br />  <br />  if (faza1 == 1)<br />  {<br />  OCR0B =(uint8_t) tablica&#91;i&#93;*amplituda;<br />  OCR0A= 0;<br />  }<br />  else if (faza1 ==0) {<br />    OCR0A =(uint8_t) tablica&#91;i&#93;*amplituda;<br />OCR0B= 0;<br />  }[/syntax]<br /><br />Niestety za żadne skarby nie chce łykać liczb z przedziału 0&gt;amplituda&gt;1 mimo że robię rzutowanie. Pomóżcie proszę to ręce opadają. Nawet gdy zamiast &quot;amplituda&quot; pomnoże razy 0.5 też to nie przechodzi<br /><br />[syntax=c]if (faza1 == 1)<br />  {<br />  OCR0B =(uint8_t) tablica&#91;i&#93;*0.5;<br />  OCR0A= 0;<br />  }<br />  else if (faza1 ==0) {<br />    OCR0A =(uint8_t) tablica&#91;i&#93;*0.5;<br />OCR0B= 0;<br />  }<br />  <br /><br />  }[/syntax]<br /><br />Dziękuję;)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8447">lukaszSZ999</a> — 21 lut 2015, o 19:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-02-17T23:12:28+01:00</updated>
<published>2015-02-17T23:12:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119598#p119598</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119598#p119598"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119598#p119598"><![CDATA[
<div class="quotetitle">lukaszSZ999 napisał(a):</div><div class="quotecontent"><br />No i w 350 cykli się wyrabia ;D<br /></div><br />A jakby ustawić timery na preskaler 1, tablicę zmniejszyć do 256 bajtów i zmienne i, faza1, faza2, faza3 zrobić 8-bitowe oraz wyrzucić oczekiwanie na zakończenie konwersji z przerwania.<br />Kąty można przeliczyć.<br />Wynik z ADCH przepisywać do bufora w przerwaniu od zakończenia konwersji.<br /><br /><div class="quotetitle">lukaszSZ999 napisał(a):</div><div class="quotecontent"><br />[syntax=c]napiecie = ADCH/256;                    // regulacja amplitudy[/syntax]<br /></div><br />To jest bez sensu, bo ADCH ma maksymalnie 255 i po podzieleniu całkowitym przez 256 wyjdzie 0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 17 lut 2015, o 23:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukaszSZ999]]></name></author>
<updated>2015-02-22T21:53:42+01:00</updated>
<published>2015-02-16T23:32:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119470#p119470</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119470#p119470"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119470#p119470"><![CDATA[
To ostatecznie przy dużych ADCH mogłoby dojść do sytuacji że co przerwanie przeskakuje o tyle komórek że to już nie byłby sinus a jakaś pokraka... I tutaj lekarstwem byłaby bardzo duża tablica<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8447">lukaszSZ999</a> — 16 lut 2015, o 23:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukaszSZ999]]></name></author>
<updated>2015-02-16T20:31:22+01:00</updated>
<published>2015-02-16T20:31:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119441#p119441</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119441#p119441"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119441#p119441"><![CDATA[
Dobrze, otworzyłem się jednak na koncepcje wykorzystania tablicy z wartościami sinusa ;D <br /><br />Dziękuję Wam bardzo... ferie po sesji coraz krótsze więc mam nadzieję że zdążę  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Mam już zaprojektowaną płytkę drukowaną więc tylko polutować, załadować program i wiiioo <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Będziemy w kontakcie:)<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8447">lukaszSZ999</a> — 16 lut 2015, o 20:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-02-16T18:00:25+01:00</updated>
<published>2015-02-16T18:00:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119403#p119403</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119403#p119403"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119403#p119403"><![CDATA[
Pierwszy z twoich kodów oblicza sinusa ze znanej liczby. Procesor nie będzie tego robił. Kompilator to obliczy i wstawi tam od razu wartość. W drugim przypadku argument nie jest znany na etapie kompilacji i procesor będzie musiał to wyliczać za każdym razem. Stąd dłuższy kod.<div class="quotetitle">lukaszSZ999 napisał(a):</div><div class="quotecontent"><br />Nie mogę tutaj skorzystać z tablicy wartości dla jednego okresu sinusa dlatego że falownik ma regulowaną częstotliwość od 0 do 50Hz nie mówiąc że muszę uzyskać przesunięcie fazowe.<br /></div><br />Nie wydaje mi się. Może czegoś nie wiem. Przykład 1:<br />[syntax=c]uint16_t sinus&#91;360&#93; = {/*...*/);<br />for(uint16_t i = 0; i &lt; 360; ++i)<br />{<br />   OCRA = sinus&#91;i&#93;; <br />   _delay_ms(1); //okres 360 ms<br />}[/syntax]<br />Przykład 2:<br />[syntax=c]uint16_t sinus&#91;360&#93; = {/*...*/);<br />for(uint16_t i = 0; i &lt; 360; ++i)<br />{<br />   OCRA = sinus&#91;(i + 100)%360&#93;; //przesunięcie w fazie o 100<br />   _delay_us(100); //okres 36 ms<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 16 lut 2015, o 18:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2015-02-16T00:15:01+01:00</updated>
<published>2015-02-16T00:15:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119288#p119288</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119288#p119288"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119288#p119288"><![CDATA[
modyfikator static <br />tylko ta zmienna i tak ląduje w zmiennych globalnych<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 16 lut 2015, o 00:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukaszSZ999]]></name></author>
<updated>2015-02-15T22:29:44+01:00</updated>
<published>2015-02-15T22:29:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119258#p119258</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119258#p119258"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119258#p119258"><![CDATA[
Nie mogę tutaj skorzystać z tablicy wartości dla jednego okresu sinusa dlatego że falownik ma regulowaną częstotliwość od 0 do 50Hz nie mówiąc że muszę uzyskać przesunięcie fazowe. Może i dało by się tak zrobić ale wymagałoby to bardzo dużej tablicy. Mój pomysł jest dobry tylko mam problem z tym pobraniem zmiennych...<br /><br />Przed chwilą próbowałem użyć register variable ale to nie przyspiesza wcale wykonania operacji... Jak przechować lokalną zmienną utworzoną w przerwaniu by w następnym przerwaniu mógłbym ją odzyskać? Są jakieś sposoby chociaż na tzw &quot;pałe&quot;?<br /><br />Jak to możliwe że dla przykładu mam coś takiego:<br />[syntax=c]void sinus(){<br /><br />        uint8_t licznik = 5;<br />static float sinus;<br /><br />sinus=sin(licznik);//obliczam sinusa<br />}[/syntax]<br /><br />i ten kod wykona się w zaledwie kilkadziesiąt cykli<br /><br /><br /><br />a sama operacja wyliczenia sinusa w tym kodzie:... <br /><br />[syntax=c]uint8_t licznikglob; //zmienna globalna<br /><br />void sinus(){<br /><br />        licznikglob++;<br />uint8_t licznik = licznikglob;<br />static float sinus;<br /><br />sinus=sin(licznik);//obliczam sinusa<br />}[/syntax]<br /><br />...potrzebuje ponad 3000 cykli.<br /><br />Być może gdzieś robię jakiś błąd... To mój pierwszy program w C no ale bez przesady <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=8447">lukaszSZ999</a> — 15 lut 2015, o 22:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-02-15T21:30:11+01:00</updated>
<published>2015-02-15T21:30:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119235#p119235</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119235#p119235"/>
<title type="html"><![CDATA[Re: Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119235#p119235"><![CDATA[
Jak chcesz mieć szybko to nie licz sinusa tylko skorzystaj z tablicy:<br />[syntax=c]uint16_t sinus&#91;360&#93; = {/*...*/);<br />/*....*/<br />faza1 = ( (ADC/4) * sin&#91;licznik*ADC/(8*fpwm)&#93; ) / 1000; //to tylko przykład[/syntax]<br />Pozbądź się też liczb zmiennoprzecinkowych, bo w końcu wynik i tak jest liczbą całkowitą, którą wpisujesz do OCRx.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 15 lut 2015, o 21:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukaszSZ999]]></name></author>
<updated>2015-02-15T18:31:20+01:00</updated>
<published>2015-02-15T18:31:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119152#p119152</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119152#p119152"/>
<title type="html"><![CDATA[Zbyt długi czas wykonywania przerwania -zmienne globalne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10663&amp;p=119152#p119152"><![CDATA[
Witam<br /><br />Tworzę program pod ATMEGA88 do falownika. Wykorzystuje sprzętowy PWM. Co 0,1ms generuje przerwanie na wykonanie którego mam jedynie 2000cykli (taktowanie 20MHZ). W każdym przerwaniu muszę wyliczyć wartość próbki przebiegu sinusoidalnego no i mam problem... Otóż, operując na zmiennych globalnych (PI, licznik, fpwm) przeliczenie i wygenerowanie wartości sinusa zajmuje ponad 3000cykli... Zauważyłem że jeśli będą to wartości zadeklarowane wewnątrz przerwania, jako lokalne, wyliczenie nowej próbki zajmuje ok. 100 cykli, jednakże jak wiadomo po wyjściu z przerwania tracę wartości tych zmiennych które są mi potrzebne w następnym wywołaniu tego przerwania.<br /><br /><br />[syntax=c]#define F_CPU 20000000UL<br />#include &lt;avr/io.h&gt;<br />#include &lt;math.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define fpwm  F_CPU/8/256<br />#define PI 3.14<br /><br />uint16_t faza1;<br />uint16_t faza2;<br />uint16_t faza3;<br />float licznik2 = 0;<br /><br />void proba(){<br /><br /><br /><br />uint16_t licznik = 0;  //tutaj na pewno nie bedzie tak...<br />        licznik++;<br /><br />ADCSRA |= (1&lt;&lt;ADSC); //ADSC: uruchomienie pojedynczej konwersji<br /><br />while(ADCSRA &amp; (1&lt;&lt;ADSC)); //czeka na zakończenie konwersji<br /><br />faza1 = (ADC/4) * sin(2 * PI*licznik*ADC/(8*fpwm));<br />faza2 = (ADC/4) * sin((2 * PI*licznik*ADC/(8*fpwm))+(2*PI/3));<br />faza3 = (ADC/4) * sin((2 * PI*licznik*ADC/(8*fpwm))+(4*PI/3));<br /><br />     <br /><br />if (licznik &lt;(fpwm*0.5)){<br />OCR0A = faza1;<br />OCR0B = 0;<br />OCR1A = faza2;<br />OCR1B = 0;<br />OCR2A = faza3;<br />OCR2B = 0;<br />}<br />else{<br />OCR0B = faza1;<br />OCR0A = 0;<br />OCR1B = faza2;<br />OCR1A = 0;<br />OCR2B = faza3;<br />OCR2A = 0;<br />}<br /><br />licznik2++;<br />if(licznik&lt;=(8*fpwm/ADCH)){<br />licznik=0;<br /><br /><br />}<br />}<br /><br />int main(void)<br />{<br /><br />ADC_conf();<br />timer_init();<br />proba();<br /><br /><br /><br /> while (1){<br /> <br /> }<br /><br />}[/syntax]<br /><br />UWAGA! funkcja &quot;proba&quot; jest tutaj w zastępstwie dla przerwania, gdyż symulator AVR Studio nie dawał rady inaczej. Proszę traktować jako przerwanie.<br /><br />Nie mogę zmniejszać częstotliwości PWM dla otrzymania większej ilości cykli na obsługę przerwania gdyż to mija się z celem.<br /><br />Proszę mi powiedzieć co zrobić? Już kombinowałem nad tym by co przerwanie wrzucać wartości zmiennych globalnych do lokalnych i operacje wyliczenia sinusa wykonać na lokalnych ale on wtedy znów robi to przez ok 3000 taktów. Próbowałem też na zmiennych static - zachowuje się tak jak na globalnych.<br /><br />Pomożecie? <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=8447">lukaszSZ999</a> — 15 lut 2015, o 18:31</p><hr />
]]></content>
</entry>
</feed>