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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-21T21:36:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13311&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-10-21T21:36:37+01:00</updated>
<published>2015-10-21T21:36:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143081#p143081</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143081#p143081"/>
<title type="html"><![CDATA[Re: [C] algorytm obliczania wielkosci wyrzuca bledy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143081#p143081"><![CDATA[
<div class="quotetitle">klimek476 napisał(a):</div><div class="quotecontent"><br />nie korzystam z eclipse, korzystam z atmel studio<br /></div><br />To popatrz na przykład tutaj<br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic8740.html#p98023" >topic8740.html#p98023</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 21 paź 2015, o 21:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[klimek476]]></name></author>
<updated>2015-10-21T21:03:44+01:00</updated>
<published>2015-10-21T21:03:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143075#p143075</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143075#p143075"/>
<title type="html"><![CDATA[Re: [C] algorytm obliczania wielkosci wyrzuca bledy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143075#p143075"><![CDATA[
dzieki za odpowiedzi, doszedlem do wniosku ze zmienna odleglosc faktycznie moze byc przepelniona i sie przekrecac, nie korzystam z eclipse, korzystam z atmel studio. <br /><br />PS dodalem mu algorytm dosyc obciazajacy procesor ale za to usprawniajacy pomiary ktore teraz praktycznie sie nie zmieniaja,<br />chodzilo o to ze jezeli program wykryje ze odleglosc za bardzo urosla albo za bardzo zmalala w jednej chwili to zaczyna weryfikowac pomiar, zeby taki pomiar zostal pomyslnie zweryfikowany odleglosc nie moze sie zmienic 2 krotnie i zmalec dwukrotnie przez kolejne 4 pomiary, jezeli taki mocno odbiegajacy pomiar powtorzy sie mniej niz 4 razy, program kasuje wynik i musi zmierzyc od nowa.<br />Kod powstal troche z chaosu ale o dziwo...dziala.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#define PWM OCR1B<br />#include &quot;addons.h&quot;<br />#include &quot;HD44780.h&quot;<br />#include &lt;avr/interrupt.h&gt;<br />volatile int flaga=0;//flaga przerwania pomiaru odleglosci <br />uint16_t odleglosc=300;//domyslna wartosc odleglosci <br />volatile int flaga_przerwania=0;//flaga przerwania wywolania calej procedury pomiaru<br />uint16_t odleglosc_rzeczywista=300;//wartosc najwiekszej odleglosci pomiaru<br />unsigned int kierunek=0;//zmienna do przechowywania wartosci kierunku jazdy<br />uint16_t mediana=0;<br />uint16_t ostatni_pomiar=0;<br />int indeks_mediany=0;<br />int indeks_weryfikacji=0;<br /><br /><br /><br />int main(void)<br />{<br />char wynik&#91;4&#93;;//do przechowywania wyniku wyswietlacza alfanumerycznego<br /><br />LCD_Initalize(); //inicjalizacja LCD<br />LCD_GoTo(0, 0); //Ustawienie kursora w pozycji (0,0)<br />LCD_WriteText(&quot;    &quot;);//wyczyszczenie wyswietlacza<br />LCD_WriteText(&quot;SRV1&quot;);<br />_delay_ms(500);//odczekanie<br />init();//inicjalizacja wszystkiego<br /><br />    while(1)//glowna petla<br />   {<br />   if(flaga==1)//jesli rozpoczal sie pomiar<br />   {  <br />   if(!(odleglosc&gt;ostatni_pomiar*2)||(odleglosc&lt;ostatni_pomiar/2))<br />   {<br />      ostatni_pomiar=odleglosc;<br />   }<br />  odleglosc=0;//zerowanie odleglosci<br />   }<br />   while(flaga==1)//podczas pomiaru<br />   {<br />   odleglosc++;//zwiekszaj licznik odleglosci<br />   }<br />   <br />   if((odleglosc&gt;ostatni_pomiar*2)||(odleglosc&lt;ostatni_pomiar/2))<br />   {<br />   ++indeks_weryfikacji;<br />   <br />   if(((odleglosc&gt;ostatni_pomiar*2)||(odleglosc&lt;ostatni_pomiar/2))&amp;&amp;(indeks_weryfikacji==3))<br />   {<br />   indeks_weryfikacji=0;<br />   }<br />   else<br />   {<br />   --indeks_mediany;<br />   mediana=mediana-odleglosc;<br />   }<br />   }<br />   <br />   ++indeks_mediany;<br />   mediana=mediana+odleglosc;<br />   if(indeks_mediany==5)<br />   {<br />   odleglosc_rzeczywista=mediana/5;<br />   indeks_mediany=0;<br />   mediana=0;<br />   }<br />   <br />   if(odleglosc_rzeczywista&lt;100)//jesli podczas jazdy odleglosc od przeszkody mniejsza niz 300<br />   {<br />   mediana=10;<br />   indeks_mediany=0;<br />   odleglosc_rzeczywista=201;//zerujemy najdalsza odleglosc<br />   int i;//zmienna pomocnicza<br />   TIMSK &amp;=~(1&lt;&lt;TOIE0);//wylaczanie glownego timera zeby nie przeszkadzal<br />   PWM=7000;//obrot czujnika w prawo (pozycja startowa pomiaru)<br />   _delay_ms(400);//odczekanie az sie ustabilizuje<br />   for(i=0;i&lt;=100;i++)//rozpoczecie jednoczesnego obracania i serii pomiarow<br />   {   <br />    indeks_mediany++;<br />   PWM=7000+i*100;//wartosc PWM potrzebna do obrotu<br />   _delay_ms(5);//odczekanie na stabilizacje<br />   uruchom_pomiar();//wyzwolenie pomiaru<br />   if(flaga==1)//jezeli rozpoczal sie pomiar<br />   {<br />   odleglosc=0;//zerujemy odleglosc<br />   }<br />   while(flaga==1)//podczas pomiaru<br />   {<br />   odleglosc++;//zwiekszamy licznik odleglosci<br />   }<br />   mediana+=odleglosc;<br />   <br />   if((mediana&gt;odleglosc_rzeczywista)&amp;&amp;(indeks_mediany==4))//jezeli wykryta odleglosc jest najwyzsza z dotychczas zmierzonych<br />   {<br />   odleglosc_rzeczywista=mediana/5;//najdalsza zmierzona odlegloscia zostaje ta spelniajaca powyzszy warunek <br />   kierunek=i;//zostaje przypisany kierunek w ktorym robot ma podazac <br />   indeks_mediany=0; <br />   mediana=0;<br />   }<br />   if(indeks_mediany==4)<br />   {<br />   mediana=0;<br />   indeks_mediany=0;<br />   }<br />   }<br />   odleglosc_rzeczywista=301;//ustawiamy na wszelki wypadek odleglosc na wieksza niz prog zeby sie nie zapetlil przypadkiem<br />   PWM=11600;//ustawiamy glowe do pozycji startowej<br />   //_delay_ms(400);//odczekujemy na ustabilizowanie sie<br />   TIMSK |=(1&lt;&lt;TOIE0);//po wykonaniu petli przywracamy timer0 <br />   <br />   }<br /> <br />LCD_GoTo(3, 1);         //Ustawienie kursora w pozycji (1,1)<br />LCD_WriteText(&quot;      &quot;);   //czyszczenie poprzednij wartości<br />LCD_GoTo(3, 1);<br />itoa(odleglosc_rzeczywista,wynik,10);      //konwersja wyniku do tablicy char<br />LCD_WriteText(wynik);   //Wyświetlenie wyniku<br />   <br />/*if(flaga_przerwania%5==0)//2 razy na jedno glowne przerwanie aktualizujemy stan toru jazdy(na wszelki wypadek)<br />{<br />if((kierunek&gt;40)&amp;&amp;(kierunek&lt;60)){<br />prosto();}<br />if(kierunek&lt;=40){<br />prawo();}<br />if(kierunek&gt;=60){<br />lewo();}<br />}*/<br />  if(flaga_przerwania&gt;=10)//glowne przerwanie<br />  {<br />  flaga_przerwania=0;//zerujemy flage przerwania<br />  uruchom_pomiar();//wyzwalamy pomiar<br />  }<br />  <br /> }<br />}<br />ISR(INT1_vect)<br />{<br />if(flaga==0)//jesli poza czasem pomiaru<br />{<br />flaga=1;//flaga rozpoczecia pomiaru<br /> MCUCR &amp;=~(1&lt;&lt;ISC10);//przerwanie wyzwalane zboczem opadajacym    <br />}<br />else if(flaga==1)//jesli w trakcie pomiaru<br />{<br />MCUCR |= (1&lt;&lt;ISC10);//przerwanie wzwalane zboczem narastajacym<br />flaga=0;//zerowanie flagi pomiaru<br />}<br />}<br /><br />ISR(TIMER0_OVF_vect)//glowne przerwanie, zwieksza licznik<br />{<br />flaga_przerwania++;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10452">klimek476</a> — 21 paź 2015, o 21:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-10-21T19:51:17+01:00</updated>
<published>2015-10-21T19:51:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143067#p143067</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143067#p143067"/>
<title type="html"><![CDATA[Re: [C] algorytm obliczania wielkosci wyrzuca bledy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143067#p143067"><![CDATA[
Zastanów się jaka maksymalna wartość zmiennej odleglosc jest możliwa i ją ogranicz:<br />[syntax=c]if(odleglosc &lt; 1000){ ++odleglosc;}[/syntax]<br />Pomyśl czy gdzieś nie przekraczasz rozmiaru zmiennej, bo wtedy może się przekręcić. Mam tu na myśli tą linię:<br />[syntax=c]mediana += odleglosc;[/syntax]<br />Korzystaj ze zdefiniowanych typów uint8_t, uint16_t.<br />Dla zmiennych które nie przekraczają 255 nie używaj uint16_t, int czy unsigned int np.<br />[syntax=c]for(uint8_t i=0; i&lt;=100; i++)[/syntax]<br /><div class="quotetitle">klimek476 napisał(a):</div><div class="quotecontent"><br />PS gdzie trzeba definiowac F_CPU? i dlaczego nie tutaj?<br /></div><br />W Eclipse pod prawym klawiszem masz Properties-&gt;AVR-&gt;Target Hardware i tam okienko MCU Clock Frequency. Dlatego nie w pliku c, bo może być ich wiele, a częstotliwość taktowania jest jedna i jak zmienisz ją sobie to musiałbyś grzebać się we wszystkich tych plikach co jest bez sensu. Ciekawe co masz w pliku HD44780.c.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 21 paź 2015, o 19:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[klimek476]]></name></author>
<updated>2015-10-21T16:28:55+01:00</updated>
<published>2015-10-21T16:28:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143045#p143045</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143045#p143045"/>
<title type="html"><![CDATA[[C] algorytm obliczania wielkosci wyrzuca bledy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13311&amp;p=143045#p143045"><![CDATA[
Witam, <br /><br />Chcialem zrobic robota w oparciu o ultradzwiekowy czujnik odleglosci HC SR04 zamontowany na serwie w taki sposob aby robot mogl sie &quot;rozgladac&quot; w razie napotkania przeszkody. <br />Wszystko nawet dziala, jednak przy okreslaniu kierunku robot uparcie wskazuje na skrajne prawo (chyba sugeruje zeby glosowac na korwina  <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" /> ) wiec cos tam w srodku nie dziala, tylko pytanie co? Czy ma ktos jakis pomysl? <br />Generalnie to dorzucilem do kodu pomiar usredniajacy na podstawie 5 pomiarow, co troche pomoglo.<br />Niestety czujnik czasem wywala zamiast 0,5m wartosc odpowiadajaca 20 metrom i wtedy nawet te 5 pomiarow niewiele daje.<br /><br />Glowna petla programu (w ktorej na 99,99% znajduje sie blad prezentuje sie tak: <br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#define PWM OCR1B<br />#include &quot;addons.h&quot;<br />#include &quot;HD44780.h&quot;<br />#include &lt;avr/interrupt.h&gt;<br />volatile int flaga=0;//flaga przerwania pomiaru odleglosci <br />uint16_t odleglosc=300;//domyslna wartosc odleglosci <br />volatile int flaga_przerwania=0;//flaga przerwania wywolania calej procedury pomiaru<br />uint16_t najdalej=300;//wartosc najwiekszej odleglosci pomiaru<br />unsigned int kierunek=0;//zmienna do przechowywania wartosci kierunku jazdy<br />unsigned int mediana;<br />int indeks_mediany=0;<br /><br /><br /><br />int main(void)<br />{<br />char wynik&#91;4&#93;;//do przechowywania wyniku wyswietlacza alfanumerycznego<br /><br />LCD_Initalize(); //inicjalizacja LCD<br />LCD_GoTo(0, 0); //Ustawienie kursora w pozycji (0,0)<br />LCD_WriteText(&quot;    &quot;);//wyczyszczenie wyswietlacza<br />LCD_WriteText(&quot;SRV1&quot;);<br />_delay_ms(500);//odczekanie<br />init();//inicjalizacja wszystkiego<br /><br />    while(1)//glowna petla<br />   {<br />   if(flaga==1)//jesli rozpoczal sie pomiar<br />   {<br />   najdalej=301;<br />   odleglosc=0;//zerowanie odleglosci<br />   }<br />   while(flaga==1)//podczas pomiaru<br />   {<br />   odleglosc++;//zwiekszaj licznik odleglosci<br />   }<br />   ++indeks_mediany;<br />   mediana=mediana+odleglosc;<br />   if(indeks_mediany&gt;4)<br />   {<br />   najdalej=mediana/5;<br />   indeks_mediany=0;<br />   mediana=0;<br />   }<br />   <br />   if(najdalej&lt;200)//jesli podczas jazdy odleglosc od przeszkody mniejsza niz 300<br />   {<br />   mediana=10;<br />   indeks_mediany=0;<br />   najdalej=201;//zerujemy najdalsza odleglosc<br />   int i;//zmienna pomocnicza<br />   TIMSK &amp;=~(1&lt;&lt;TOIE0);//wylaczanie glownego timera zeby nie przeszkadzal<br />   PWM=7000;//obrot czujnika w prawo (pozycja startowa pomiaru)<br />   _delay_ms(400);//odczekanie az sie ustabilizuje<br />   for(i=0;i&lt;=100;i++)//rozpoczecie jednoczesnego obracania i serii pomiarow<br />   {   <br />    indeks_mediany++;<br />   PWM=7000+i*100;//wartosc PWM potrzebna do obrotu<br />   _delay_ms(5);//odczekanie na stabilizacje<br />   uruchom_pomiar();//wyzwolenie pomiaru<br />   if(flaga==1)//jezeli rozpoczal sie pomiar<br />   {<br />   odleglosc=0;//zerujemy odleglosc<br />   }<br />   while(flaga==1)//podczas pomiaru<br />   {<br />   odleglosc++;//zwiekszamy licznik odleglosci<br />   }<br />   mediana+=odleglosc;<br />   <br />   if((mediana&gt;najdalej)&amp;&amp;(indeks_mediany&gt;=4))//jezeli wykryta odleglosc jest najwyzsza z dotychczas zmierzonych<br />   {<br />   //mediana=mediana/3;<br />   najdalej=mediana/5;//najdalsza zmierzona odlegloscia zostaje ta spelniajaca powyzszy warunek <br />   //kierunek=i;//zostaje przypisany kierunek w ktorym robot ma podazac <br />   indeks_mediany=0; <br />   kierunek=najdalej;<br />   mediana=0;<br />   }<br />   if(indeks_mediany&gt;=4)<br />   {<br />   mediana=0;<br />   indeks_mediany=0;<br />   }<br />   }<br />   najdalej=301;//ustawiamy na wszelki wypadek odleglosc na wieksza niz prog zeby sie nie zapetlil przypadkiem<br />   PWM=11600;//ustawiamy glowe do pozycji startowej<br />   //_delay_ms(400);//odczekujemy na ustabilizowanie sie<br />   TIMSK |=(1&lt;&lt;TOIE0);//po wykonaniu petli przywracamy timer0 <br />   <br />   }<br /> <br />LCD_GoTo(3, 1);         //Ustawienie kursora w pozycji (1,1)<br />LCD_WriteText(&quot;      &quot;);   //czyszczenie poprzednij wartości<br />LCD_GoTo(3, 1);<br />itoa(kierunek,wynik,10);      //konwersja wyniku do tablicy char<br />LCD_WriteText(wynik);   //Wyświetlenie wyniku<br />   <br />/*if(flaga_przerwania%5==0)//2 razy na jedno glowne przerwanie aktualizujemy stan toru jazdy(na wszelki wypadek)<br />{<br />if((kierunek&gt;40)&amp;&amp;(kierunek&lt;60)){<br />prosto();}<br />if(kierunek&lt;=40){<br />prawo();}<br />if(kierunek&gt;=60){<br />lewo();}<br />}*/<br />  if(flaga_przerwania&gt;=10)//glowne przerwanie<br />  {<br />  flaga_przerwania=0;//zerujemy flage przerwania<br />  uruchom_pomiar();//wyzwalamy pomiar<br />  }<br />  <br /> }<br />}<br />ISR(INT1_vect)<br />{<br />if(flaga==0)//jesli poza czasem pomiaru<br />{<br />flaga=1;//flaga rozpoczecia pomiaru<br /> MCUCR &amp;=~(1&lt;&lt;ISC10);//przerwanie wyzwalane zboczem opadajacym    <br />}<br />else if(flaga==1)//jesli w trakcie pomiaru<br />{<br />MCUCR |= (1&lt;&lt;ISC10);//przerwanie wzwalane zboczem narastajacym<br />flaga=0;//zerowanie flagi pomiaru<br />}<br />}<br /><br />ISR(TIMER0_OVF_vect)//glowne przerwanie, zwieksza licznik<br />{<br />flaga_przerwania++;<br />}[/syntax]<br /><br /><br />Po kodzie mozna smialo jezdzic, jest to wersja niechlujna, przed liftingiem ktory zrobie jak wszystko bedzie dzialac w 100%.<br /><br />Ma ktos jakies pomysly skad sie biora takie bledy?<br /><br />PS gdzie trzeba definiowac F_CPU? i dlaczego nie tutaj?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10452">klimek476</a> — 21 paź 2015, o 16:28</p><hr />
]]></content>
</entry>
</feed>