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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-12-17T18:50:39+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1921&amp;mode</id>
<entry>
<author><name><![CDATA[gedo]]></name></author>
<updated>2012-12-17T18:50:39+01:00</updated>
<published>2012-12-17T18:50:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21405#p21405</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21405#p21405"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21405#p21405"><![CDATA[
Ok temat wydaje mi się rozwiązany. Dziękuje <span style="color: #FF0000"><strong>Krauser</strong></span> za pomoc. Wyślę Ci na pw link do filmiku jak to wygląda.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=690">gedo</a> — 17 gru 2012, o 18:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedo]]></name></author>
<updated>2012-12-15T22:27:52+01:00</updated>
<published>2012-12-15T22:27:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21265#p21265</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21265#p21265"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21265#p21265"><![CDATA[
Częstotliwość zmienia się o zadaną w (!check), tylko częstotliwość startowa jest zła. <br />Ustawiłem w <strong><span style="color: #FF0000">SIGNALS[0][i]</span></strong> czyli sinus i początkowa częstotliwość to ~7kHz. Jak dałem na stale kwadrat to zaczyna 1kHz. Krauser bardzo fajny pomysł z tym temp_tab. Nie wiem czemu tak sinusa zaczyna od tak wysokiej częstotliwości.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=690">gedo</a> — 15 gru 2012, o 22:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-15T20:00:39+01:00</updated>
<published>2012-12-15T20:00:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21257#p21257</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21257#p21257"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21257#p21257"><![CDATA[
Proponuję:<br />[syntax=c]R2RPORT = pgm_read_byte(&amp;SIGNALS[typ][akumulator &gt;&gt; 8]);[/syntax]<br />zstąpić:<br />[syntax=c]R2RPORT = temp_tab[akumulator &gt;&gt; 8];[/syntax]<br />a w warunku zmiany sygnału wypełniać temp_tab odpowiednią tablicą z pamięci programu:<br />[syntax=c]if(!check){<br />   if (fout&gt;19000){<br />      fout=1000;<br />      typ++; //zmiana o 1<br />      if (typ&gt;5) typ=0; // jeśli wartość wskaźnika jest większa niż 5 to zeruj<br />      for(uint16_t i; i&lt;256 ; i++)<br />         temp_tab[i] = pgm_read_byte(&amp;SIGNALS[typ][i]);<br />   }<br />   else fout=fout+1000;<br />   deltaPhase=(fout/resolution);<br />   check=~check;<br />}[/syntax]<br />Ta pętla for musi również znaleźć się na starcie programu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 15 gru 2012, o 20:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedo]]></name></author>
<updated>2012-12-15T17:42:40+01:00</updated>
<published>2012-12-15T17:42:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21250#p21250</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21250#p21250"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21250#p21250"><![CDATA[
Krauser, próbowałem coś podobnego ale bez użycia register. Dodanie tylko dwóch linijek:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">typ++;<br /> if (typ&gt;5) typ=0;<br /></div><br /><span style="font-size: 150%; line-height: normal">w pętli:</span><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">          if(!check){<br />                 if (fout&gt;19000){<br />                     fout=1000;<br />                     typ++; //zmiana o 1<br />                     if (typ&gt;5) typ=0; // jeśli wartość wskaźnika jest większa niż 5 to zeruj<br />                    }<br />                    else fout=fout+1000;<br /><br />                deltaPhase=(fout/resolution);<br />                check=~check;<br />                }</div><br />powoduje spadek zadanej częstotliwość <strong><span style="color: #FF0000">fout=1000</span></strong> z <span style="color: #408000">1kHz</span> do <span style="color: #FF4080">0.57kHz</span><br /><br />wszystkie ingerencje w zmianę typu sygnału powodują spadek częstotliwości. 2 linijki w C będę musiał nadrobić kwarcem 16MHz -&gt; 24MHz w Atmega8  <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=690">gedo</a> — 15 gru 2012, o 17:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-15T16:43:41+01:00</updated>
<published>2012-12-15T16:43:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21248#p21248</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21248#p21248"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21248#p21248"><![CDATA[
W 1 przypadku dostęp jest najwolniejszy bo skoro to zmienna z modyfikatorem volatile to może zmienić się w każdym momencie i co chwila jest odczytywana z pamięci do rejestrów. W drugim przypadku nie ma któregoś z odczytów, ale jak nie ma volatile to zmiana w przerwaniu nie zostanie zauważona przez pętlę główną. Trzeci przypadek zmienna lokalna jest przechowywana w rejestrze (chyba że jest ich dużo) i od razu można na niej wykonywać operacje. Powinieneś wszystkie operacje przeprowadzać w pętli głównej na zmiennych lokalnych. Możesz również spróbować dodać modyfikator register dla zmiennych do których dostęp ma być możliwie szybki. <br /><br />[syntax=c]#define resolution 16<br />const uint8_t  sinewave[] PROGMEM={} // tutaj tablica sinusa, mam takich 6 rożnych tablic<br /> <br />const uint8_t *SIGNALS[] ={ // wskazniki do tablic<br />        sinewave,<br />        squarewave,<br />        trianglewave,<br />        sawtoothwave,<br />        rewsawtoothwave,<br />        ECG<br />};<br /> <br />volatile uint8_t check // wskaźnik, volatile bo używam w przerwaniu<br /> <br />int main(void)<br />{<br />        register uint16_t akumulator=0;<br />        register uint16_t deltaPhase;<br />        register uint16_t fout=1000;<br />        register uint8_t typ=0; // zmienna typ która używana jet kilka linijek niżej do zmiany rodzaju sygnału. Gdy typ=1 to pobierany jest wskaźnik z tablicy SIGNALS o numerze 1<br /> <br />        while(1){<br />          while(check){<br />                akumulator += deltaPhase;<br />                R2RPORT = pgm_read_byte(&amp;SIGNALS[typ][akumulator &gt;&gt; 8]);<br />                }<br /> <br />          if(!check){<br />                 if (fout&gt;=19000){ <br />                     fout=1000;<br />                     typ++; //zmiana o 1<br />                     if (typ&gt;5) typ=0; // jeśli wartość wskaźnika jest większa niż 5 to zeruj<br />                    }<br />                    else fout=fout+2000;<br />                deltaPhase=(fout/resolution);<br />                check=~check;<br />                }<br />         }<br />}<br /> <br />ISR(TIMER1_COMPA_vect){<br />   check=~check; // zmiana stanu flagi przerwania, gdy zmieni tą zmienną na 0 to w pętli while przechodzimy do obliczenia nowej wartości deltaPhase na podstawie zmienionej wartości <br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 15 gru 2012, o 16:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedo]]></name></author>
<updated>2012-12-15T11:52:00+01:00</updated>
<published>2012-12-15T11:52:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21238#p21238</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21238#p21238"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21238#p21238"><![CDATA[
już odpowiadam, a do tego wyżej to i tak chyba nie działa, bo przypisałem na twardo w przerwaniu *wsk=7; czyli coś poza tablicą i pętla leci dalej a nie powinna?<br /><br />robię teraz tak jak Pan pisze ( jest jakiś sposób aby zapisać znak <span style="color: #FF0000">and - shift+7</span> na forum bo pojawia się właśnie <span style="color: #FF0000">&amp;</span>)<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">volatile uint8_t typ=0;</div><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">R2RPORT = pgm_read_byte(&amp;SIGNALS&#91;typ&#93;&#91;akumulator &gt;&gt; 8&#93;);</div><br />a w przerwaniu<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">        <br />   typ++;<br />        if (typ&gt;5) typ=0;<br /></div><br /><br />i częstotliwość mi spada dramatycznie, bo z zadanej 1kHz spada do 0.55kHz, czyli muszę znowu rozdzielczość obniżyć aby podnieść częstotliwość a to wiąże się z utratą  ilości próbek na okres, czyli dostaje przysłowiowe &quot;schodki&quot;. Chciałem zostawić resoulution na 16 i nie schodzić niżej a właśnie znaleźć sposób na tą zmianę rodzaju sygnału. Tego wyżej też próbowałem. Na koniec prób właśnie wyszły takie fikołki ze wskaźnikami.<br /><br /><span style="font-size: 150%; line-height: normal">Teraz przedstawię taki mój test. Umieszczam 3 rodzaje zmiennych:</span><br /><br /><strong>1.</strong> <span style="color: #800000">volatile uint8_t typ1=0;</span> zmienna globalna volatile<br /><strong>2.</strong> <span style="color: #408000">uint8_t typ2=0;</span> zmienna globalna <br /><strong>3.</strong> <span style="color: #0040FF">uint8_t typ3=0;</span> zmienna lokalna w main<br /><br />i kolejno ręcznie podstawiam w linijce:<br /><strong>R2RPORT = pgm_read_byte(&amp;SIGNALS[<span style="color: #FF0000">typ#</span>][akumulator &gt;&gt; 8]);</strong><br /><br /><span style="font-size: 150%; line-height: normal">I co uzyskuje na mierniku:</span><br />1. 0.55kHz<br />2. 0.78kHz<br />3. 1Khz<br /><br />czyli to że zmienna jest globalna już powoduje mi spadek częstotliwości. Częstotliwość wyjściowa jest zależna od rozdzielczości a ta rozdzielczość od taktowania uC oraz ilości linijek kodu, więc widzicie Panowie, taka drobna zmiana i już mam gorszy sygnał.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=690">gedo</a> — 15 gru 2012, o 11:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-15T09:56:37+01:00</updated>
<published>2012-12-15T09:56:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21231#p21231</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21231#p21231"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21231#p21231"><![CDATA[
powiedz mi po co takie sztuczki cyrkowe - w ogóle niepotrzebne<br /><br />[syntax=c]volatile uint8_t *wsk; <br /><br />..................<br /><br />int main(void)<br />{<br />        uint8_t typ=0; <br /><br />..................<br /><br />wsk=&amp;typ;[/syntax]<br /><br /><br />a potem w przerwaniu:<br /><br />[syntax=c]*wsk++; <br /><br />...........<br /><br />if (*wsk&gt;5) *wsk=0;[/syntax]<br /><br />nie mówię, że to jest błąd - ale widać, że próbujesz sobie w GIGANTYCZNY sposób utrudniać życie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> dlaczego nie możesz zmiennej typ zrobić globalnej i volatile. Nie dość że nie będziesz musiał jej zerować jawnie to jeszcze posługiwać się nią i w przerwaniu i funkcji main()<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 15 gru 2012, o 09:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedo]]></name></author>
<updated>2012-12-15T04:31:52+01:00</updated>
<published>2012-12-15T04:31:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21226#p21226</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21226#p21226"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21226#p21226"><![CDATA[
Czy to ma prawo działać bo nie mam przy sobie oscyloskopu aby sprawdzić a weekend jest długi aby czekać. Wklejam tylko potrzebne linijki kodu, które są kluczowe. Do rzucenia okiem jest ta pętla while, przerwanie, oraz wskażnik wsk oraz zmienia typ. 4 rzeczy dla specjalistów.<br /><br />[syntax=c]<br />#define resolution 16<br />const uint8_t  sinewave[] PROGMEM={} // tutaj tablica sinusa, mam takich 6 roznych tablic<br /><br />const uint8_t *SIGNALS[] ={ // wskazniki do tablic<br />sinewave,<br />squarewave,<br />trianglewave,<br />sawtoothwave,<br />rewsawtoothwave,<br />ECG<br />};<br /><br />volatile uint8_t *wsk; // wskaźnik, volatile bo uzywam w przerwaniu<br /><br />int main(void)<br />{<br />        uint8_t typ=0; // zmienna typ która uzywana jet kilka linijek nizej do zmiany rodzaju sygnalu. Gdy typ=1 to pobierany jest wskaznik z tablicy SIGNALS o numerze 1<br />        wsk=&amp;typ; //przypisanie adresu do wskaznika<br /><br />        while(1){<br />          while(check){<br />                akumulator += deltaPhase;<br />               R2RPORT = pgm_read_byte(&amp;SIGNALS[typ][akumulator &gt;&gt; 8]);<br />                }<br /><br />          if(!check){<br />                deltaPhase=(fout/resolution);<br />                check=~check;<br />                }<br />         }<br />}<br /><br />ISR(TIMER1_COMPA_vect){<br />check=~check; // zmiana stanu flagi przerwania, gdy zmieni tą zmienną na 0 to w pętli while przechodzimy do obliczenia nowej wartości deltaPhase na podstawie zmienionej wartości fout w przerwaniu<br /><br />        if (check==0){ <br />if (fout&gt;=19000){ // pętla, gdy czestotliwosc wyjsciowa przekroczy 19kHz to zaczynamy od 1000 oraz zwiekszenie wartosci wskaznika gdy przekroczymy zakres = zmiana kształtu sygnału<br />fout=1000;<br />*wsk++; //zmiana wartosci wskaznika o 1<br />    }<br />else fout=fout+2000;<br />        }<br />        if (*wsk&gt;5) *wsk=0; // jesli wartość wskaznika jest wieksza niz 5 to zeruj<br />}<br />[/syntax]<br /><br /><br />Zostawiłem co potrzebne.  Resztę kodu wyciąłem aby nikt nie musiał analizować i patrzeć na niepotrzebne.<br />Proszę mi odpowiedzieć czy zostanie w tej linijce <span style="color: #FF0000"><strong>R2RPORT = pgm_read_byte(&amp;SIGNALS[typ][akumulator &gt;&gt; 8]);</strong></span> zmieniony sygnał np na kwadrat jak w przerwaniu częstotliwość dojdzie do 19kHz. Robię to w ten sposób bo każda inna zmiana jaką próbowałem BARDZO wpływa na częstotliwość wyjściową, po prostu ją obniża. <br /><br /><span style="font-size: 150%; line-height: normal">pgm_read_byte(&amp;SIGNALS[typ][akumulator &gt;&gt; 8]);</span> jak wpisze zamiast TYP:<br />1.  np. 1 to działa super odwołując się do tablicy SIGNALS<br />2. jak dam tam zmienną  zadeklarowaną w int main która to ma przypisane stałą wartość to również działa ok<br />3. Gdy zamiast typ wstawię wskaźnik do zmiennej mode która zmieniana jest w przerawniu to częstotliwość mi spada aż o POŁOWĘ  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> <br />4. Gdy w przerwaniu będę zmieniał jakąś zmienną o 1 np mode po każdym przekroczeniu a potem tą zmienną użyję w SIGNALS[typ] zamiast typ to również częstotliwość mi spada.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=690">gedo</a> — 15 gru 2012, o 04:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedo]]></name></author>
<updated>2012-12-14T22:17:21+01:00</updated>
<published>2012-12-14T22:17:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21212#p21212</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21212#p21212"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21212#p21212"><![CDATA[
dzięki Krauser działa, muszę popracować nad zmniejszeniem programu bo zajmuje już za dużo. Zaraz popatrzę na to <em>resolution</em><br /><br />teraz zamierzam dodać kolejne tabelę z innymi kształtami + zmiana tabeli po przejściu do częstotliwości granicznej.<br /><br /><span style="font-size: 150%; line-height: normal"><strong><span style="text-decoration: underline">edit</span></strong></span><br />w przerwaniu po osiągnięciu maksymalnej częstotliwości zmieniam wartość zmiennej <span style="color: #00FF00">mode</span> o jeden. Ma to na celu zmienić typ sygnału. O w tej linijce:<br />R2RPORT = pgm_read_byte(<strong><span style="color: #FF0000">&amp;sinewave</span></strong>[akumulator &gt;&gt; 8]); jak teraz optymalnie podmieniać pogrubione w zależności od mode<br /><br />mode to volatile uint8_t mode=0; &lt;- zmieniane w przerwaniu <br /><br />wpadłem na pomysł zrobienia takiej tablicy<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">const uint8_t *SIGNALS&#91;&#93; ={<br />   sinewave,<br />   squarewave,<br />   trianglewave,<br />   sawtoothwave,<br />   rewsawtoothwave,<br />   ECG<br />};</div><br /><br />utworzeniu zmiennej globalnej <strong><span style="color: #FF0000">uint8_t *wsk;</span></strong>, przypisania adresu <span style="color: #FF0000"><strong>wsk=&amp;mode</strong></span> a następnie takiego odwołania R2RPORT = pgm_read_byte(<strong><span style="color: #FF0000">&amp;SIGNALS[*wsk]</span></strong>[akumulator &gt;&gt; 8]);<br /><br />Nie jestem dziś sprawdzić czy typ sygnału się zmienia, w pon będę miał dostęp do oscyloskopu. <br /><br />No i dostaje przy wsk=&amp;mode; warning <span style="text-decoration: underline"><em>assignment discards qualifiers from pointer target type</em></span><br /><br />Może ktoś ma inny pomysł jak podmienić rodzaj sygnału najprościej.<br /><br />każda podmiana w <span style="font-size: 150%; line-height: normal">&amp;SIGNALS[]</span> w nawiasach kwadratowych jakąś zmienną powoduje spadek częstotliwości z 1kHz dla do 0.57kHz. Jak wpisze &amp;SIGNALS[1] to jest równo 1kHz. Jak podmienić wartość w nawiasach bez spadku wydajność?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=690">gedo</a> — 14 gru 2012, o 22:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-14T10:03:18+01:00</updated>
<published>2012-12-14T10:03:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21127#p21127</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21127#p21127"/>
<title type="html"><![CDATA[Re: Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21127#p21127"><![CDATA[
[syntax=c]while(1){<br />  while(check){<br />        akumulator += deltaPhase;<br />        R2RPORT = sinewave[akumulator &gt;&gt; 8];<br />  }<br />  if(!check){<br />  deltaPhase=(fout/resolution);<br />check=~check;<br />  }<br /> }[/syntax]<br />A z tym <em>#define resolution 16.2</em> to nie da się nic zrobić? Przecież wystarczy dać <em>#define resolution 162</em> i podczas działań na <em>fout</em> wynik pomnożyć razy 10 albo lepiej najpierw pomnożyć razy 10UL i później podzielić przez <em>resolution</em><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 14 gru 2012, o 10:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedo]]></name></author>
<updated>2012-12-13T19:47:48+01:00</updated>
<published>2012-12-13T19:47:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21109#p21109</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21109#p21109"/>
<title type="html"><![CDATA[Zwiększenie liczby po przerwaniu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1921&amp;p=21109#p21109"><![CDATA[
Mam prosty kod w C który generuje częstotliwości, chce aby po każdym przerwaniu zwiększać częstotliwość o 1kHz. Przerwanie wykonuje się przy porównaniu z maksymalną wartością OCR1A. Kod musi być najprostszy bo każde linijki kodu powodują zmniejszenie rozdzielczości wyjściowej i dostaje &quot;schodki&quot; na wyjściu. Program wchodzi w pętle i generuje częstotliwość ale chce uzyskać efekt, że przerwanie zmienia zmienną częstotliwość i ta się zmienia zmienia na wyjściu.<br /><br />[syntax=c]<br />int main(void)<br />{<br />R2RDDR = 0xff;<br />uint16_t akumulator=0;<br />uint16_t deltaPhase;<br />        uint16_t fout=15000;<br /><br />//************* licznik TIMER1 *******************<br />TCCR1B |= (1&lt;&lt;WGM12); // tryb CTC licznika 1<br />TCCR1B |= (1&lt;&lt;CS12) | (1&lt;&lt;CS10); //preskaler 1024<br />TIMSK |= (1&lt;&lt;OCIE1A); //zezwolenie na przerwanie od porownania<br />OCR1A=65535; //wartosc zliczania rowna 1s dla 16MHz<br />sei(); // zezwolenie na globalne przerwania<br /><br /> // wybieranie czestotliwosc<br />deltaPhase=(fout/resolution); // wartosc kroku w zaleznosci od czesotliwosci wyjsciowej<br /><br />  while(1){<br />akumulator += deltaPhase;<br />R2RPORT = sinewave[akumulator &gt;&gt; 8];<br />  } <br />}<br /><br />ISR(TIMER1_COMPA_vect){<br />//przerwanie<br />}<br />[/syntax]<br /><br />Jak najprościej <span style="text-decoration: underline">zwiększyć częstotliwość</span> w tym while? Próbowałem przez cały dzień wiele sposobów.<br /><br />czy można ustawić w przerwaniu odpowiednią flagę, lub ustawić wskaźnik który zmieni wartość pod np. deltaphase podczas przerwania?<br /><br /><strong>Moje ostatnie próby to:</strong><br /><br />[syntax=c]<br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define R2RPORT PORTD<br />#define R2RDDR DDRD<br /><br />#define resolution 16.2<br /><br /><br />const uint8_t  sinewave[] =<br />{<br />0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,<br />0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,<br />0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,<br />0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,<br />0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,<br />0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,<br />0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,<br />0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,<br />0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,<br />0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,<br />0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,<br />0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,<br />0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,<br />0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,<br />0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c<br />};<br /><br />const uint8_t squarewave[]= //square wave<br />{<br />0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,<br />0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,<br />};<br /><br />const uint8_t *SIGNALS[] ={<br />sinewave,<br />squarewave<br />};<br /><br /><br />volatile uint8_t check=0;<br />volatile uint16_t fout=1000;<br /><br /><br />int main(void)<br />{<br />R2RDDR = 0xff;<br />uint16_t akumulator=0;<br />uint16_t deltaPhase;<br /><br />//************* licznik TIMER1 *******************<br />TCCR1B |= (1&lt;&lt;WGM12); // tryb CTC licznika 1<br />TCCR1B |= (1&lt;&lt;CS12) | (1&lt;&lt;CS10); //preskaler 1024<br />TIMSK |= (1&lt;&lt;OCIE1A); //zezwolenie na przerwanie od porownania<br />OCR1A=65535; //wartosc zliczania rowna 1s dla 16MHz<br />sei(); // zezwolenie na globalne przerwania<br /><br /> // wybieranie czestotliwosc<br />deltaPhase=(fout/resolution); // wartosc kroku w zaleznosci od czesotliwosci wyjsciowej<br /><br /> while(1){<br />  while(check){<br />akumulator += deltaPhase;<br />R2RPORT = sinewave[akumulator &gt;&gt; 8];<br />  }<br /> } <br /> <br />}<br /><br />ISR(TIMER1_COMPA_vect){<br />check=~check;<br />if (check==0)<br />{<br />if (fout&gt;=50000) fout=1000;<br />else fout=fout+1000;<br />}<br />}<br />[/syntax]<br /><br /><br /><strong><span style="color: #FF0000">Poprawiłem znaczniki [syntax=c ] a nie  syntax= C <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> SunRiver</span></strong><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=690">gedo</a> — 13 gru 2012, o 19:47</p><hr />
]]></content>
</entry>
</feed>