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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-12-26T11:08:27+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=3419&amp;mode</id>
<entry>
<author><name><![CDATA[m@ciej]]></name></author>
<updated>2014-12-26T11:08:27+01:00</updated>
<published>2014-12-26T11:08:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=110509#p110509</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=110509#p110509"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=110509#p110509"><![CDATA[
A ja dłubałem program w Delphi, co mi zmienia format Excelowego słupka na format Pgm Space. Szlo to dość szybko,  ale ta metoda jest niezła. Będę musiał ją przetrenować bo w perspektywie jest wpisanie okolo 30 tablic po 2048 elementów 16-bitowych by zrobić wavetable. <br />Jak będzie zainteresowanie,  udostępnię wspomniany programik.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7141">m@ciej</a> — 26 gru 2014, o 11:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-05-21T10:04:05+01:00</updated>
<published>2014-05-21T10:04:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=81932#p81932</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=81932#p81932"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=81932#p81932"><![CDATA[
no fajne ciekawostki i smaczki <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=54">mirekk36</a> — 21 maja 2014, o 10:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2014-05-21T09:53:00+01:00</updated>
<published>2014-05-21T09:53:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=81930#p81930</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=81930#p81930"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=81930#p81930"><![CDATA[
Witam,<br /><br />Właśnie natknąłem się na inny ciekawy sposób tworzenia tablicy z wartościami wyliczanymi przez preprocesor. Nie trzeba robić dodatkowego pliku do includowania a wykorzystać rekurencję:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">#define XTAB0(n) func(n),<br />#define XTAB1(n) XTAB0(n) XTAB0(n+1)  XTAB0(n+2)  XTAB0(n+3)<br />#define XTAB2(n) XTAB1(n) XTAB1(n+4)  XTAB1(n+8)  XTAB1(n+12)<br />#define XTAB3(n) XTAB2(n) XTAB2(n+16) XTAB2(n+32) XTAB2(n+48)<br />#define XTAB4(n) XTAB3(n) XTAB3(n+64) XTAB3(n+128) XTAB3(n+192)<br /><br />const uint8_t TABLE&#91;&#93; PROGMEM = { XTAB4(0) };<br /></div><br /><br />Dla powyższego kodu dostajemy w TABLE[] wartości będące wynikiem func(n) dla n od 0 do 255.  Ale można to bardzo łatwo zmodyfikować na inne wielkości tablic oraz zmienić wartość początkową n na inną (zmiana w wywołaniu XTAB4(start_value)).<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 21 maja 2014, o 09:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[karolek]]></name></author>
<updated>2014-02-11T00:18:35+01:00</updated>
<published>2014-02-11T00:18:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=69812#p69812</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=69812#p69812"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=69812#p69812"><![CDATA[
Tamta stronka juz wygasła wiec pomyslalem ze moze dobrze bedzie zgrac z google webcache tametego generatora poki jeszcze jest dostepne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2535">karolek</a> — 11 lut 2014, o 00:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rafrew]]></name></author>
<updated>2013-09-15T21:25:02+01:00</updated>
<published>2013-09-15T21:25:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49777#p49777</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49777#p49777"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49777#p49777"><![CDATA[
Ok, jeśli tak to już wszystko jasne. Faktycznie muszę coś poszukać bo o funkcjach jakie umie wyliczyć preprocesor jakoś  nigdzie się nie natknąłem. Dzięki za odpowiedzi. Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1640">rafrew</a> — 15 wrz 2013, o 21:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-09-15T20:59:17+01:00</updated>
<published>2013-09-15T20:59:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49771#p49771</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49771#p49771"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49771#p49771"><![CDATA[
<div class="quotetitle">rafrew napisał(a):</div><div class="quotecontent"><br />Czy chcesz powiedzieć, że preprocesor umie policzyć wartość sinusa z liczby?<br /></div><br /><br />Kolego naprawdę poczytaj troszkę o preporcesorze gdzieś <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... pewnie że preprocesor oblicza sin() i to bez żadnego inkludowania &lt;math.h&gt; bo ta biblioteka jest potrzebna tylko gdy obliczeń trzeba dokonywać w kodzie w procku.<br /><br />Co to za problem dla preprocesora obliczyć sin czy podobną funkcję - na PC? miałby to być kłopot ?<br /><br />a makro VALUE() działa tu TYLKO i wyłącznie w taki sposób że zwraca stałą dosłowną która zostanie wyliczona przez preprocesor właśnie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 15 wrz 2013, o 20:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rafrew]]></name></author>
<updated>2013-09-15T20:53:49+01:00</updated>
<published>2013-09-15T20:53:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49769#p49769</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49769#p49769"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49769#p49769"><![CDATA[
Czy chcesz powiedzieć, że preprocesor umie policzyć wartość sinusa z liczby? Raczej nie. Zakomentowanie lini #include&lt;math.h&gt; spowoduje błędy, zatem wartość sinusa obliczana jest na podstawie algorytmu zawartego w bibliotece math.h. <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Zauważ, że:<br />Składnia: [ Pobierz ] [ Ukryj ]<br />język c<br /><br />    #define VALUE(a) (sin( ( ( (a-1) * STEP)/180.0 )*M_PI )*127.5 + 128 )/* wzór na wartość sinusa */<br /><br />GeSHi<br /><br />to nie jest po prostu:<br />Składnia: [ Pobierz ] [ Ukryj ]<br />język c<br /><br />    #define VALUE(a) (sin(a))<br /></div><br /><br />  w sumie pierwsze sprowadza się do drugiego<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1640">rafrew</a> — 15 wrz 2013, o 20:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-09-15T20:39:15+01:00</updated>
<published>2013-09-15T20:39:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49763#p49763</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49763#p49763"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49763#p49763"><![CDATA[
Zauważ, że:<br />[syntax=c]#define VALUE(a) (sin( ( ( (a-1) * STEP)/180.0 )*M_PI )*127.5 + 128 )/* wzór na wartość sinusa */[/syntax]<br />to nie jest po prostu:<br />[syntax=c]#define VALUE(a) (sin(a))[/syntax]<br />Można używać innych makr (makro to nie funkcja, ale może ją zastąpić) np.<br />[syntax=c]#define VALUE(x) ((x)*(x)) /* kwadrat liczby */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 15 wrz 2013, o 20:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rafrew]]></name></author>
<updated>2013-09-15T20:05:15+01:00</updated>
<published>2013-09-15T20:05:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49754#p49754</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49754#p49754"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=49754#p49754"><![CDATA[
Czy da się się w tym &quot;tricku&quot; podstawić inną funkcję zamiast sinusa z math.h?  Konkretnie chodzi mi o funkcję przez siebie zdefiniowaną spoza biblioteki standardowej.?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1640">rafrew</a> — 15 wrz 2013, o 20:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-06-30T11:15:14+01:00</updated>
<published>2013-06-30T11:15:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40469#p40469</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40469#p40469"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40469#p40469"><![CDATA[
<div class="quotetitle">krz napisał(a):</div><div class="quotecontent"><br />Tak przy okazji wydaje mi się, że ten wzór na zamianę &lt;-1.0f, 1.0f&gt; na &lt;0, 255&gt; jest zły.<br />Jak sin(x) wyjdzie -1 to otrzymasz (-1.0f)*128 + 127 =&gt; -128.0f + 127 =&gt; -1.0f i po rzutowaniu na unsigned short int wyjdzie 255.<br />Imo lepiej użyć wzoru:<br />Kod:<br />(sin((a-1)*STEP*PI/180.0f)*127.5f + 127.5f)<br /></div><br />Tak wzór jest zły (pozdrawiam panią od matematyki  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> ), ale w wyniku działań na liczbach zmiennoprzecinkowych sin(270) &gt; -1 i po odcięciu części ułamkowej wychodzi 0. To osobny temat poruszony już przy okazji omawiania obliczania <a href="http://www.mirekk36.blogspot.com/2013/01/rs232-ubrr-jak-prawidowo-obliczac-trick.html"  class="postlink">UBRR</a>. W związku z tym lepiej użyć jeszcze innego wzoru (tylko dla preprocesora, gdzie wynik jest większy o 0,5):<br />[syntax=c]#define VALUE(a) (sin( ( ( (a-1) * STEP)/180.0 )*M_PI )*127.5 + 128 )/* wzór na wartość sinusa */<br />#define VALUE(a) (sin( ( ( (a-1) * STEP + 360)/180.0 )*M_PI )*127.5 + 128 )/* wzór na wartość sinusa */[/syntax]<br />Teraz wartości są jak te z arkusza po zaokrągleniu. Dodanie do wzoru 360 nic nie zmienia, ale wtedy obie wartości dla 0 i 180 stopni są równe i wynoszą 128 (jak w arkuszu kalkulacyjnym). Chociaż z drugiej strony bardziej symetryczne wyniki są, gdy dla 180 mamy wartość 127. Co kto woli. Środek jest na poziomie 127,5, a takiej wartości nie można wybrać. Zwiększenie rozdzielczości do 16 bitów też nic nie zmieni, bo znowu środek jest na poziomie 511,5 .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 30 cze 2013, o 11:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-29T23:46:55+01:00</updated>
<published>2013-06-29T23:46:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40464#p40464</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40464#p40464"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40464#p40464"><![CDATA[
<div class="quotetitle">krz napisał(a):</div><div class="quotecontent"><br />Te wartości nie znajdą się tam w magiczny sposób, bez wywołania funkcji sin(x) z biblioteki math<br /></div><br /><br />Nie pisałem, że magiczny <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> pisałem że w programie nie zostanie użyta biblioteka math.h - i nie zostanie bo całe wyliczenia zostaną zrobione na etapie preprocesora właśnie i to jest fajne.<br /><br />Dobrze, że rozpisałeś to po swojemu w punktach bo dzięki temu jeszcze łatwiej będzie zrozumieć ideę działania tego tricku wielu ludziom <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">krz napisał(a):</div><div class="quotecontent"><br />Wg mnie zamiast kombinować z takimi hackami lepiej jest po prostu wygenerować sobię tę tablicę i ręczne przekleić do kodu<br /></div><br /><br />łeeeej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> no bez przesady - po to są właśnie takie sposoby, jako alternatywa i tak należy to rozumieć. Sposób działa i to się liczy - jak się już go zrozumie - to okazuje się że wcale nie jest skomplikowany a wręcz banalnie prosty - i to jest siła takich rozwiązań w niektórych przypadkach.<br /><br /><div class="quotetitle">krz napisał(a):</div><div class="quotecontent"><br />Niestety takie stuczki zmniejszają czytelność i jak nie znamy dokładnego zachowania kompilatora to mogą prowadzić do powstania błędów w programie<br /></div><br /><br />To by oznaczało, że w zasadzie jak coś wygląda dziwnie - to lepiej tego nie ruszać. To jest dla osób które już zaskoczą o co tu chodzi - a myślę że sporo zaskoczy dzięki temu całemu wątkowi ... i nic nie będzie się działo ze zmniejszeniem czytelności kodu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... tym bardziej, że działa to TYLKO na poziomie preprocesora. Dlatego ja akurat uważam, że warto na pewno czasem to wykorzystywać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak najbardziej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 cze 2013, o 23:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krz]]></name></author>
<updated>2013-06-29T22:22:40+01:00</updated>
<published>2013-06-29T22:22:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40458#p40458</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40458#p40458"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40458#p40458"><![CDATA[
@mirekk36<br />Te wartości nie znajdą się tam w magiczny sposób, bez wywołania funkcji sin(x) z biblioteki math.<br />Mniej więcej będzie to wyglądać tak:<br />1. Preprocesor wpierw zamieni __LINE__ w pliku values.txt na odpowiadające im numery linii<br />2. Następnie w miejsce #include &quot;values.txt&quot; wklei zawartość tego pliku czyli:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">const uint8_t sin_tab&#91;TAB_SIZE&#93; PROGMEM ={<br />    VALUE(1),<br />    VALUE(2),<br />    ...,<br />    VALUE(24),<br />};<br /></div><br />2. Wszystkie miejsca gdzie użyte jest makro VALUE(a) przed kompilacją zamieni na:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">const uint8_t sin_tab&#91;TAB_SIZE&#93; PROGMEM ={<br />    (sin( ( ( (1-1) * STEP )/180.0 )*M_PI )*128 + 127 ),<br />    (sin( ( ( (2-1) * STEP )/180.0 )*M_PI )*128 + 127 ),<br />    ...,<br />    (sin( ( ( (24-1) * STEP )/180.0 )*M_PI )*128 + 127 ),<br />};<br /></div><br />3. Kompilator wygeneruje kod w asemblerze, który inicjalizuje tę tablicę, czyli do każdej wartości z tablicy przypisze wartość otrzymaną po wywołaniu tego wyrażenia.<br /><br />Tak przy okazji wydaje mi się, że ten wzór na zamianę &lt;-1.0f, 1.0f&gt; na &lt;0, 255&gt; jest zły.<br />Jak sin(x) wyjdzie -1 to otrzymasz (-1.0f)*128 + 127 =&gt; -128.0f + 127 =&gt; -1.0f i po rzutowaniu na unsigned short int wyjdzie 255.<br />Imo lepiej użyć wzoru:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">(sin((a-1)*STEP*PI/180.0f)*127.5f + 127.5f)<br /></div><br /><br />Wg mnie zamiast kombinować z takimi hackami lepiej jest po prostu wygenerować sobię tę tablicę i ręczne przekleić do kodu. Niestety takie stuczki zmniejszają czytelność i jak nie znamy dokładnego zachowania kompilatora to mogą prowadzić do powstania błędów w programie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1444">krz</a> — 29 cze 2013, o 22:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[chodzikman]]></name></author>
<updated>2013-06-29T20:29:38+01:00</updated>
<published>2013-06-29T20:29:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40441#p40441</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40441#p40441"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40441#p40441"><![CDATA[
Ja ostatnio spotykając się z tym problemem, mając naprawdę mało czasu napisałem sobie po prostu programik który generował kod.<br />Generuje on sinusy o 6 różnych amplitudach w dwuwymiarowej tablicy i nie ma problemu z wygenerowaniem za pomoca tego kodu innych funkcji z math.c po lekkim przerobieniu, treść jego jest taka:<br /><br />[syntax=cpp]#include &lt;iostream&gt;<br />#include &lt;math.h&gt;<br />#define Matlab        //jesli wpiszesz tu Ccode, to wygeneruje tablice C, jesli Matlab, to macierz dla matlaba<br />#define liczba_probek 256<br />using namespace std;<br /><br />int main(){<br />#ifdef Ccode<br />cout &lt;&lt; &quot;#include &lt;avr/pgmspace.h&gt;&quot; &lt;&lt; endl;<br />cout &lt;&lt; &quot;const unsigned char sinus&#91;6&#93;&#91;256&#93; PROGMEM = {&quot; &lt;&lt; endl;<br />for(int i=5;i&lt;=10;i++){<br />  cout &lt;&lt; &quot;{ &quot;;<br />  for(int j=0;j&lt;liczba_probek;j++){<br />    if(i&lt;255) cout  &lt;&lt; round(i*10*sin(j*2*M_PI/256)+128) &lt;&lt; &quot;,&quot;;<br />    else cout  &lt;&lt; round(i*10*sin(j*2*M_PI/256)+128) &lt;&lt; endl;<br />  } <br />  cout &lt;&lt; &quot;},&quot; &lt;&lt; endl;<br />}<br />cout &lt;&lt; &quot;};&quot; &lt;&lt; endl;<br />#endif<br /><br />#ifdef Matlab<br />for(int i=5;i&lt;=10;i++){<br />  cout &lt;&lt; &quot;sinusik&quot; &lt;&lt; i &lt;&lt; &quot;=&#91;&quot; &lt;&lt; endl;<br />  for(int j=0;j&lt;256;j++){<br />    if(i&lt;255) cout  &lt;&lt; round(i*10*sin(j*2*M_PI/256)+128) &lt;&lt; &quot; &quot;;<br />    else cout  &lt;&lt; round(i*10*sin(j*2*M_PI/256)+128) &lt;&lt; endl;<br />  } <br />  cout &lt;&lt; &quot;&#93;;&quot; &lt;&lt; endl;<br />}<br />cout &lt;&lt; &quot;&#93;;&quot; &lt;&lt; endl;<br />#endif<br /><br />return 0;<br />}[/syntax]<br /><br />Pod linuksem odpalam skompilowany program np. <div class="codetitle"><b>Code:</b></div><div class="codecontent">./sinus_gen &gt; sinus.h</div><br />więc nie potrzebuje zapisu do pliku, ale pod windowsem mogłoby się to przydać.<br /><br />Ponieważ miałem problemy z przetwornikiem, dodatkowo zrobiłem opcję generowania przebiegu do matlaba, aby porównać sobie tablicę do tego, co widze na oscyloskopie.<br /><br />Wykorzystanie preprocesora napewno jest bardziej &quot;hackerskie&quot;, ale i trudniejsze w zrozumieniu (chociaż mnie strasznie podobają się takie tricki <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=1443">chodzikman</a> — 29 cze 2013, o 20:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2013-06-29T19:58:16+01:00</updated>
<published>2013-06-29T19:58:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40439#p40439</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40439#p40439"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40439#p40439"><![CDATA[
genialne <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=110">jachu</a> — 29 cze 2013, o 19:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-06-29T18:58:39+01:00</updated>
<published>2013-06-29T18:58:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40433#p40433</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40433#p40433"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40433#p40433"><![CDATA[
Ano właśnie ... kiedyś to widziałem i gdzieś przepadło w przepastnych  czeluściach sieci zaiste .<br />dzięki za przypomnienie , bo robienie na piechotę czasem dobija <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=58">SunRiver</a> — 29 cze 2013, o 18:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-06-29T18:56:29+01:00</updated>
<published>2013-06-29T18:56:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40432#p40432</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40432#p40432"/>
<title type="html"><![CDATA[Re: Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40432#p40432"><![CDATA[
O matko <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak pierwszy raz to przeczytałem i zobaczyłem to - powiedziałem tylko hyyyyy i nic nie zrozumiałem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... więc jeszcze raz, i jeszcze raz .... i jeszcze raz .... i tak jeszcze n razy jak w tej tabeli <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />a jak zaskoczyłem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... hahahaha - no mega super trick - ale popraw mnie jeśli się mylę bo może jednak coś na końcu przeoczyłem <br /><br />rezultatem tego myku jest fakt że, tzn postaram się to podsumować tak na mój rozum:<br /><br />1. w programie nie zostaną użyte funkcje zmiennoprzecinkowe z math.h <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />2. w programie zostanie stworzona ładna tablica sinusów w pamięci FLASH<br />3. a wartości tej tablicy przygotuje grzecznie sługa PREPROCESOR  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />4. plik values.txt jest tylko taki pomocniczy .... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> żeby zadać fuchę preprockowi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />dobrze myślę ? <br /><br />jeśli tak to działa to na prawdę Krauser super mega TRICK obczaiłeś w necie ! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> gratulacje <br /><br />no i super że się nim podzieliłeś<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 cze 2013, o 18:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-06-29T17:50:36+01:00</updated>
<published>2013-06-29T17:50:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40430#p40430</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40430#p40430"/>
<title type="html"><![CDATA[Tablica wartości funkcji utworzona preprocesorem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3419&amp;p=40430#p40430"><![CDATA[
<img src="http://forum.atnel.pl/_obrazki/o/54/a88bbc0329c27330af55fe2e3d01931b.jpg" alt="Obrazek" /><br />Przeglądając sieć natrafiłem na fajny <a href="http://www.velocityreviews.com/forums/t315282-for-loop-equivalent-with-the-preprocessor.html"  class="postlink">trik</a>. Typowe podejście na tablicę wartości funkcji wygląda tak, że chcąc skorzystać z  przykładowo sinusa, dołączamy do programu kod np. <a href="http://www.meraman.com/uploads/files/public/sinTable.htm"  class="postlink">z tej strony</a> albo sami obliczamy to w arkuszu kalkulacyjnym i przenosimy łatwiej lub trudniej do kodu programu. Można to zrobić też jak pokazano poniżej:<br />Plik main.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;math.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define TAB_SIZE 24<br />#define STEP 15<br /><br />#define VALUE(a) (sin( ( ( (a-1) * STEP )/180.0 )*M_PI )*128 + 127 ) /* wzór na wartość sinusa */<br /><br />const uint8_t sin_tab&#91;TAB_SIZE&#93; PROGMEM ={<br />   #include &quot;values.txt&quot; /* dołączenie pliku */<br />};<br /><br />int main(void)<br />{<br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7); /* załączenie podświetlenia LCD */<br /><br />lcd_init();<br />lcd_cls();<br />uint8_t i = 0;<br />while(1){<br />lcd_locate(0, 0);<br />lcd_str(&quot;                &quot;); /* wyczyszczenie 1 linii wyświetlacza */<br />lcd_locate(0, 0);<br />lcd_int(pgm_read_byte(sin_tab + i)); /* pokazanie 4 kolejnych wartości tablicy */<br />lcd_str(&quot; &quot;);<br />lcd_int(pgm_read_byte(sin_tab + i + 1));<br />lcd_str(&quot; &quot;);<br />lcd_int(pgm_read_byte(sin_tab + i + 2));<br />lcd_str(&quot; &quot;);<br />lcd_int(pgm_read_byte(sin_tab + i + 3));<br />i = i + 4;<br />_delay_ms(3000);<br />if (i &gt;= TAB_SIZE) i = 0;<br />}<br />}[/syntax]<br />Plik values.txt:<br />[syntax=c]VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),<br />VALUE(__LINE__),[/syntax]<br /><br />Jeśli tak jak w przykładzie potrzeba 24 wartości sinusa to w pliku values.txt 24 razy powtarza się dokładnie tą samą linię. Parametr __LINE__ zwraca numer linii (tutaj 1-24). Jako, że zaczyna się numeracja od 1 to we wzorze na sinus odejmowana jest najpierw 1 i wtedy argument ma wartość 0-23. Przeliczając to na stopnie mnoży się razy krok czyli 15, bo akurat potrzeba 24 wartości z całego zakresu 0-360 stopni. Następnie konieczna jest zamiana stopni na radiany (/180.0*M_PI) dlatego, że funkcja sinus na takich wartościach operuje. Kolejnym krokiem jest dopasowanie wyniku do wartości 0-255 co jest realizowane poprzez pomnożenie razy 128 i dodanie 127. No i już nie potrzeba korzystać z innych programów <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=465">Krauser</a> — 29 cze 2013, o 17:50</p><hr />
]]></content>
</entry>
</feed>