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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1998&amp;mode</id>
<entry>
<author><name><![CDATA[anko]]></name></author>
<updated>2015-02-08T22:20:59+01:00</updated>
<published>2015-02-08T22:20:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=117903#p117903</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=117903#p117903"/>
<title type="html"><![CDATA[Re: funkcja pow(x, y) z modułu math.h]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=117903#p117903"><![CDATA[
Gdzieś z netcie znalazłam i wydrukowałem &quot;FUNKCJE MATEMATYCZNE nagłówek &quot;match.h w C iC++&quot;&quot;. W pozycji pow(x,y) była uwaga: potęgowanie; xy, błąd zakresu wystąpi gdy: X=0 i y&lt;=0 lub x&lt;0 i y nie jest całkowite. W linii 19 masz wartość y&lt;0 i dodatkowo nie jest liczbą całkowitą może tam tkwi błąd. Z języka C jestem zielony, ale czym mogę to się dzielę. Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4384">anko</a> — 8 lut 2015, o 22:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2012-12-29T22:23:16+01:00</updated>
<published>2012-12-29T22:23:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22445#p22445</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22445#p22445"/>
<title type="html"><![CDATA[Re: funkcja pow(x, y) z modułu math.h]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22445#p22445"><![CDATA[
Po namyśle myślę, że nie będę zmieniał ani procesora, ani floatów, bo po uzupełnieniu o moduł TWI(ta atmega jest slave) oraz inne elementy jest jeszcze wolna pamięć. W zasadzie ta atmega ma za zadanie tylko obsługę czujnika oraz silnika krokowego a wyniki ma przesłać przez szynę TWI do mastera (inna atmega8), która już zajmie się wstępną obróbką i wysyłką do laptopa - i ta komunikacja na szynie TWI mi działa.<br /><br />Piotr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 29 gru 2012, o 22:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2012-12-29T23:10:31+01:00</updated>
<published>2012-12-29T20:02:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22427#p22427</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22427#p22427"/>
<title type="html"><![CDATA[Re: funkcja pow(x, y) z modułu math.h]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22427#p22427"><![CDATA[
Trochę poszukałem w internecie na temat funkcji pow(x,y) modułu math.h języka C, co dało oto taki kod:<br />[syntax=c]<br />#include &lt;avr/io.h&gt;<br />#include &lt;math.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />void ADC_Init(void);<br />float pomiarNapiecia();<br /><br /><br />float x, distans;<br />uint16_t cm, ucm; // centymetry, milimetry<br /><br />int main(void) {<br />DDRC &amp;= ~(1 &lt;&lt; PC3);<br />PORTC &amp;= ~(1 &lt;&lt; PC3);<br />ADC_Init();<br />while (1) {<br /><br />x = pomiarNapiecia(); // x większe od 0 i nie może być zerem   ( x &gt; 0 )<br />distans = 65 * (int32_t) ((pow(x, -1.10)) * 10000);<br />cm = distans / 10000;<br />ucm = distans / 100;<br />ucm = ucm % 100;<br />_delay_ms(100);<br />}<br />}<br />void ADC_Init(void) {<br />ADMUX |= (1 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0);<br />ADMUX |= (1 &lt;&lt; MUX1) | (1 &lt;&lt; MUX0);<br />ADCSRA |= (1 &lt;&lt; ADEN);<br />ADCSRA |= (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS1) | (1 &lt;&lt; ADPS0);<br />}<br /><br />float pomiarNapiecia() { //pomiar napięcia od 0V do 3V<br />ADCSRA |= (1 &lt;&lt; ADSC);<br />while (ADCSRA &amp; (1 &lt;&lt; ADSC))<br />; // &lt;- ten średnik musi tu być bo inaczej kompilator krzyczy<br />return (ADC * 0.0025 * 1.15); //[0.0025 -&gt; nap. ref / tryb 10-bit ] [1,15 -&gt; współczynnik dzielnika oporowego ]<br />}[/syntax]<br /><br />Ten kod mi się kompiluje bez problemów ze strony kompilatora.<br /><br /><br /><br />**** Build of configuration Release for project testSHARP ****<br /><br />make all <br />Building file: ../main.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -c -o &quot;main.o&quot; &quot;../main.c&quot;<br />Finished building: ../main.c<br /> <br />Building target: testSHARP.elf<br />Invoking: AVR C Linker<br />avr-gcc -Wl,-Map,testSHARP.map -mmcu=atmega8 -o &quot;testSHARP.elf&quot;  ./MKUART/mkuart.o  ./main.o   <br />Finished building target: testSHARP.elf<br /> <br />Invoking: AVR Create Extended Listing<br />avr-objdump -h -S testSHARP.elf  &gt;&quot;testSHARP.lss&quot;<br />Finished building: testSHARP.lss<br /> <br />Create Flash image (ihex format)<br />avr-objcopy -R .eeprom -O ihex testSHARP.elf  &quot;testSHARP.hex&quot;<br />Finished building: testSHARP.hex<br /> <br />Create eeprom image (ihex format)<br />avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex testSHARP.elf  &quot;testSHARP.eep&quot;<br />Finished building: testSHARP.eep<br /> <br />Invoking: Print Size<br />avr-size --format=avr --mcu=atmega8 testSHARP.elf<br />AVR Memory Usage<br />----------------<br />Device: atmega8<br /><br />Program:    6118 bytes (74.7% Full)<br />(.text + .data + .bootloader)<br /><br />Data:        329 bytes (32.1% Full)<br />(.data + .bss + .noinit)<br /><br /><br />Finished building: sizedummy<br /> <br /><br />**** Build Finished ****<br /><br /><br />Do pełni szczęścia brakuje mi jeszcze ograniczyć program (Program:  6118 bytes (74.7% Full)) albo zmienić procesor na mocniejszy np. Atmega328. Na razie pomyśle nad pierwsza opcją.<br /><br />Piotr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 29 gru 2012, o 20:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2012-12-29T18:04:42+01:00</updated>
<published>2012-12-29T18:04:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22421#p22421</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22421#p22421"/>
<title type="html"><![CDATA[Re: funkcja pow(x, y) z modułu math.h]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22421#p22421"><![CDATA[
Znalazłem takie strony:<br /><a href="http://robocraft.ru/blog/electronics/783.html"  class="postlink">http://robocraft.ru/blog/electronics/783.html</a><br /><a href="http://luckylarry.co.uk/arduino-projects/arduino-using-a-sharp-ir-sensor-for-distance-calculation/"  class="postlink">http://luckylarry.co.uk/arduino-projects/arduino-using-a-sharp-ir-sensor-for-distance-calculation/</a><br />Szczególnie na stronie &quot;luckylarry.co.uk&quot; zaciekawił mnie algorytm<br /><br /><strong>float distance = 65*pow(volts, -1.10); </strong><br /><br />nawet go testowałem przy pomocy kalkulatora w laptopie wyniki są dość obiecujące.<br />Co do funkcji podnoszącej <strong>x</strong> do potęgi <strong>y</strong>  <strong>pow(x,y)</strong>  to zauważyłem, że jeżeli wpiszę za  <strong>y</strong>  stałą (tu  -1.1) i za  <strong>x</strong>  stałą(tu  dowolna liczba z zakresu 0.4 do 2.8) to wszystko się ładnie kompiluje. A jak dam zmienną (<strong>x</strong> = pomiarNapiecia()) wartość napięcie odczytaną z funkcji to kompilator pokazuje błąd.<br /><br />Piotr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 29 gru 2012, o 18:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2012-12-29T15:41:18+01:00</updated>
<published>2012-12-29T15:41:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22411#p22411</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22411#p22411"/>
<title type="html"><![CDATA[Re: funkcja pow(x, y) z modułu math.h]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22411#p22411"><![CDATA[
Witam<br />Dziękuje za zainteresowanie i nigdy nie biorę podpowiedzi moich szanownych kolegów za złośliwości jakie by one nie były bo przecież te podpowiedzi pomagają mi rozwiązać mój problem. Więc można mnie ostro potraktować, a i tak będę wdzięczny. To tyle wstępu, a teraz stosując się do rady kolegi  <strong>Antystatyczny</strong> poprawiłem kod na taki<br />[syntax=c]<br />#include &lt;avr/io.h&gt;<br />#include &lt;math.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />void ADC_Init(void);<br />float pomiarNapiecia();<br /><br />float x, y, z;<br />float cm;<br /><br />int main(void) {<br />y = -0.935;<br />DDRC &amp;= ~(1 &lt;&lt; PC3);<br />PORTC &amp;= ~(1 &lt;&lt; PC3);<br />ADC_Init();<br />while (1) {<br /><br />x = pomiarNapiecia();<br />//z = pow(x, y);<br />//cm = (10650.08 * z) - 10;<br />_delay_ms(100);<br />}<br />}<br />void ADC_Init(void) {<br />ADMUX |= (1 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0);<br />ADMUX |= (1 &lt;&lt; MUX1) | (1 &lt;&lt; MUX0);<br />ADCSRA |= (1 &lt;&lt; ADEN);<br />ADCSRA |= (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS1) | (1 &lt;&lt; ADPS0);<br />}<br /><br />float pomiarNapiecia() { //pomiar napięcia od 0V do 3V<br />float w;<br />ADCSRA |= (1 &lt;&lt; ADSC);<br />while (ADCSRA &amp; (1 &lt;&lt; ADSC))<br />;  // &lt;- ten średnik musi tu być bo inaczej kompilator krzyczy<br />w = ADC * 0.0025 * 6.7; //[0.0025 -&gt; nap. ref / tryb 10-bit ] [6,7 -&gt; współczynnik dzielnika oporowego ]<br />return w;<br />}[/syntax]<br />Ten kod kompiluje się tak jak jest, ale gdy usunę komentarz z linii:<br /><br />[syntax=c]<br />z = pow(x, y);<br />cm = (10650.08 * z) - 10;[/syntax]  <br />to już mi się nie kompiluje i pokazuje taki błąd:<br /><br /><ul>**** Build of configuration Release for project testSHARP ****<br /><br />make all <br />Building file: ../main.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=8000000UL -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -c -o &quot;main.o&quot; &quot;../main.c&quot;<br />Finished building: ../main.c<br /> <br />Building target: testSHARP.elf<br />Invoking: AVR C Linker<br />avr-gcc -Wl,-Map,testSHARP.map -mmcu=atmega8 -o &quot;testSHARP.elf&quot;  ./MKUART/mkuart.o  ./main.o   <br />c:/program files/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/lib/avr4\libc.a(floatsisf.o):/home/tools/hudson/workspace/avr8-gnu-toolchain/src/avr-libc/libm/fplib/floatsisf.S:42: multiple definition of `__floatunsisf'<br />c:/program files/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/avr4\libgcc.a(_usi_to_sf.o):/home/tools/hudson/workspace/avr8-gnu-toolchain/build-win32_x86/avr-gcc-full/avr/avr4/libgcc/../../.././gcc/fp-bit.c:1378: first defined here<br />collect2: ld returned 1 exit status<br />make: *** [testSHARP.elf] Błąd 1<br /><br />**** Build Finished ****</ul><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 25 minutach ]</span></strong><br /><br />Kolega <strong>staneq</strong> napisał:<br /><br />&quot;...Mogę powiedzieć Ci co ja zawsze robiłem podczas obsługi sharpa:<br />Tworzyłem sobie w pamięci programu lub eeprom tablicę ze wskazaniem ADC (oczywiście przesunięta o odpowiednią wartość) i w tej tablicy umieszczałem wynik w cm (taka dokładność mi wystarczała)...&quot;<br /><br />Też zaczynam zastanawiać się nad taką tablicą bo dokładność pomiaru w granicach 2-3cm mnie zadowala. Napisałem program okienkowy w języku Java SE w środowisku Netbeans, który komunikuje się z atmegą przez bluetooth (bluetooth kupiony u pana Mirka i zgodnie z jego poradnikiem video uruchomiony) bez problemu w dwie strony. Pomiar z czujnika SHARP GP2Y0A02YK0F wykonany przez mikroprocesor Atmeg8 obrabiany ma być już na moim laptopie przez mój program.<br /><br />Piotr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 29 gru 2012, o 15:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[staneq]]></name></author>
<updated>2012-12-29T15:36:56+01:00</updated>
<published>2012-12-29T15:36:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22410#p22410</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22410#p22410"/>
<title type="html"><![CDATA[Re: funkcja pow(x, y) z modułu math.h]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22410#p22410"><![CDATA[
Miałem do czynienienia z tą rodziną czujników, i muszę powiedzieć że nie są to dobre czujniki. Precyzje jaką można osiągnąć to max 1cm, oczywiście na początku dokładność można uzyskać teoretycznie większą (większy spadek napięcia na na wyjściu wraz z oddalaniem). Ale stabilność odczytów jest stosunkowo niewielka, i zależy od wielu czynników (koloru, oświetlenia temperatury itd)<br /><br />Ale wracając do tematu to może zrezygnuj z typu double (zmiennoprzecinkowego) i spróbuj sam zaimplementować liczbę stałoprzecinkową. Możesz nawet sam sobie zdefiniować taki typ.<br />-A dlaczego?<br />-A no dlatego, że zmienne zmiennoprzecinkowe (typu float, double) powodują straszny rozrost kodu wynikowego i zżerają mnóstwo cennej pamięci.<br /><br />Mogę powiedzieć Ci co ja zawsze robiłem podczas obsługi sharpa:<br />Tworzyłem sobie w pamięci programu lub eeprom tablicę ze wskazaniem ADC (oczywiście przesunięta o odpowiednią wartość) i w tej tablicy umieszczałem wynik w cm (taka dokładność mi wystarczała)<br />Inną metodą jest metoda pośrednia (trochę bardziej skomplikowana ale za to szybsza i zajmująca mniej pamięci i umożliwiająca uzyskania bardziej dokładnych wyników, stosowana jest nawet w komputerach w samochodach do obliczania czasu otwarcia wtryskiwacza i innych rzeczy które muszą być wyliczone bardzo szybko) <strong>metoda interpolacji liniowej</strong>. Polega ona na tym że funkcje mamy zapisaną w postaci dyskretnej a jeżeli potrzeba obliczyć wartość funkcji której akurat nie mamy to obliczamy jej wielkość na podstawie funkcji liniowej. Może troszkę zagmatwałem ale jeżeli będziesz potrzebował z tym pomocy to mogę przygotować to w jakiejś lepszej formie z rysunkami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=770">staneq</a> — 29 gru 2012, o 15:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2012-12-28T23:38:10+01:00</updated>
<published>2012-12-28T23:38:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22357#p22357</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22357#p22357"/>
<title type="html"><![CDATA[funkcja pow(x, y) z modułu math.h]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1998&amp;p=22357#p22357"><![CDATA[
Witam<br />Mam taki problem, bo nie mogę sobie poradzić. Chodzi mi o sensor GP2Y0A02YK0F firmy SHARP, a ściśle o jego zastosowanie w moim programie. Ten czujnik mierzy w sposób ciągły odległość i zamienia na wartość napięcie : 15cm(2.8V)  do  150cm(0.4V). Znalazłem stronę-blog na której znalazłem wzór na zamianę odległości na napięcie  <a href="http://arduinomega.blogspot.com/2011/05/infrared-long-range-sensor-gift-of.html"  class="postlink">http://arduinomega.blogspot.com/2011/05/infrared-long-range-sensor-gift-of.html</a> i chciałbym coś podobnego zrobić. Napisałem taki program (Atmega8 ,  częstotliwość = 8MHz)<br />[syntax=c]<br />#include &lt;avr/io.h&gt;<br />#include &lt;math.h&gt;// pow(x,y) -&gt; liczba x do potegi y<br />#include &quot;MKUART/mkuart.h&quot;<br /><br />//----- prototypy -----<br />void ADC_Init(void);<br /><br />int main(void) {<br />        double volts = 0;<br />        double cm = 0;<br />        DDRC &amp;= ~(1 &lt;&lt; PC3); // wejścia ADC<br />PORTC &amp;= ~(1 &lt;&lt; PC3); // stan L<br />        ADC_Init();<br />while (1) {<br />//--------------------- przetwornik ADC  ---------------------<br />// R = 1,5 kOmR1 = 10 kOm    -&gt; nap max. 3V<br />ADCSRA |= (1 &lt;&lt; ADSC); //ADSC: uruchomienie pojedynczej konwersji<br />while (ADCSRA &amp; (1 &lt;&lt; ADSC)) {<br />; //czeka na zakończenie konwersji<br />}<br />// napięcie max. dzielnika =&gt; V_wy = V_we * (R1/(R+R1))<br />// napięcie max. =&gt; 3V * (10000om/(1500om+10000om)) = 2,60V(napięcie porównywane z V_ref)<br />// współczynnik podziału dzielnika =&gt; (R+R1)/R1<br />// współczynnik podziało =&gt; ((1500+10000)/10000) * 100UL(dla pozbycia się przecinka) = 115<br />// stała obliczeniowa =&gt; V_ref/1024(przetwornik 10-bit)<br />// stała =&gt; (2,6V/1024) * 1000000UL(dla pozbycia się przecinka) = 2539<br />wynik = (uint32_t) ADC * 2539 * 115; // ADC - rejestr , 2539 - stała , 115 - współczynnik<br />cz_d = wynik / 100000000UL; // cześć całkowita [ X,   ]<br />cz_u = (wynik / 1000000UL) % 100; // część ułamkowa  [   ,XX ]<br />//------------------------------------------------------------<br />                volts = wynik / 100000000UL; // liczba [ X.XX ]<br />                cm = 10650.08 * pow(volts, -0.935) - 10; //  &lt;- tu mam błąd:  &quot;unused variable 'cm' [-Wunused-variable]&quot;<br />               //<br />               // uart_putint((int) cm, 10); // wyślij liczbę przez UART<br />uart_putc('\r');<br />uart_putc('\n');<br />                _delay_ms(100);<br />} <br />return 0;<br />}<br /><br />void ADC_Init(void) { // Tryb przetwornik ADC -&gt; dopuszczalny zakres to 50-200kHz (dla kwarcu 8Mhz - prescaler to 64 lub 128)<br />// ADC; dopuszczalny zakres to 50-200kHz (dla kwarcu 8Mhz - prescaler to 64 lub 128)<br />ADMUX |= (1 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0); // REFS1:0 wybór wewnętrznego źródła napięcia odniesienia = 2,56V (mierzone 2,61V)<br />ADMUX |= (1 &lt;&lt; MUX1) | (1 &lt;&lt; MUX0); // MUX1:0 wybór pinu PC3 jako wejścia ADC<br />ADCSRA |= (1 &lt;&lt; ADEN); // włączenie przetwornika ADC<br />ADCSRA |= (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS1) | (1 &lt;&lt; ADPS0); // ADPS2:0 ustawienie preskalera na 128 (62,5kHz)<br />} //koniec ---------------------------------------<br />[/syntax]<br /><br />Chciałbym wynik &quot;cm&quot; zamienić na typ int: całości oraz dziesiętne, a potem wysłać na port UART, no i nie wiem jak to zrobić.<br /><br />Piotr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 28 gru 2012, o 23:38</p><hr />
]]></content>
</entry>
</feed>