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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-08-21T11:31:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=16028&amp;mode</id>
<entry>
<author><name><![CDATA[RealityIsFalse]]></name></author>
<updated>2016-08-21T11:31:49+01:00</updated>
<published>2016-08-21T11:31:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166657#p166657</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166657#p166657"/>
<title type="html"><![CDATA[Re: Zawieszanie się programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166657#p166657"><![CDATA[
Dzięki za pomoc, już poprawiłem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Default przeoczyłem, bo zapomniałem o błędach transmisji (uznałem że wysyłam mu poprawnie to nie ma co nie działać...).<br />Wcześniej nawet na to nie zwróciłem uwagi, bo wszystko mi się wieszało w losowych momentach. Przyczyną były problemy z zasilaniem, po tym jak dałem osobne do silnika wszystko śmiga. Nie spodziewałem się że jeden mały silnik może aż tak szarpać napięcie ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14724">RealityIsFalse</a> — 21 sie 2016, o 11:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-08-21T09:20:00+01:00</updated>
<published>2016-08-21T09:20:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166651#p166651</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166651#p166651"/>
<title type="html"><![CDATA[Re: Zawieszanie się programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166651#p166651"><![CDATA[
Ja tu widzę dwa problemy:<ol style="list-style-type: decimal"><li>Instrukcja <em>switch</em> nie zawiera opcji <em><strong>default</strong></em>. W związku z tym, w przypadku odebrania znaku innego niż przewidywany zestaw (n,b,r,l,m) na skutek np. pomyłki po stronie nadajnika lub przekłamania w transmisji, zmienna <em>ogon</em> nie będzie inkrementowana i pętla <em>while(1)</em> będzie się kręcić w kółko, nie robiąc nic sensownego (czyli program &quot;zawiśnie&quot;, przynajmniej do czasu, kiedy procedura obsługi przerwania &quot;nadpisze&quot; ten element tablicy).</li><li>Nigdzie nie sprawdzasz, czy w tablicy <em>bufor</em> masz jeszcze jakieś dane do przetworzenia. Innymi słowami niezależnie od tego, czy jakieś dane zostały odebrane, czy też nie, pętla główna będzie w kółko odczytywać dane z bufora i je interpretować. Jeszcze prościej - <em>ogon</em> nie może wyprzedzić <em>głowy</em> <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.</li></ol><br />Spróbowałbym zrobić mniej więcej tak:<br />[syntax=c]while(1)<br />{<br />    if (ogon!=glowa)<br />    {<br />        switch (bufor&#91;ogon&#93;)<br />        {<br />            case 'n':<br />                PORTB|=(1&lt;&lt;1);<br />                _delay_ms(100);<br />                PORTB&amp;=~(1&lt;&lt;1);<br />                USART_send_int(ogon);<br />                break;<br />            case 'b':<br />                PORTB|=(1&lt;&lt;2);<br />                _delay_ms(100);<br />                PORTB&amp;=~(1&lt;&lt;2);<br />                break;<br />            case 'r':<br />                break;<br />            case 'l':<br />                break;<br />            case 'm':<br />                USART_send_int(ultrasonic_measure());<br />                sonic=0;<br />                break;<br />            default:<br />                // jeśli inkrementacja zmiennej 'ogon'<br />                // jest po instrukcji switch (tak jak teraz),<br />                // to default nie jest konieczne<br />                break;<br />        }<br />        if (90==(++ogon)) ogon=0;<br />    }    <br />    _delay_ms(10);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 21 sie 2016, o 09:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RealityIsFalse]]></name></author>
<updated>2016-08-20T22:01:12+01:00</updated>
<published>2016-08-20T22:01:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166643#p166643</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166643#p166643"/>
<title type="html"><![CDATA[Re: Zawieszanie się programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166643#p166643"><![CDATA[
Debugowanie zrobiłem jako wysyłanie przez bluetooth wartości związanej z buforem cyklicznym (indeks). Dzieje się to po ruchu silnika (case n i case b w instrukcji switch). I problemy pojawiają mi się także w przypadku tych instrukcji. Po prostu po którejś odebranej literze przestaje zupełnie reagować (coś jakby gubił się w kodzie i zaczyna działać dopiero po resecie). Np. gdy wyślę mu wielokrotnie literę n to po którejś z nich kompletnie się zawiesza. Nie jest to jednak regularny błąd bo zazwyczaj działa poprawnie. <br /><br />Zacząłem się zastanawiać czy problem nie leży np. po stronie zasilania, ale mam je odfiltrowane kondensatorami 47uF, 22uF (elektrolityczne) i 3x100nF (ceramiczne).<br /><br />I przepraszam za tą definicję F_CPU, myślałem że jeśli cały program jest w obrębie jednego pliku to jest to ewentualnie dozwolone, ale rozumiem do czego może to prowadzić przy bardziej rozbudowanych projektach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14724">RealityIsFalse</a> — 20 sie 2016, o 22:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2016-08-20T20:25:16+01:00</updated>
<published>2016-08-20T20:25:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166633#p166633</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166633#p166633"/>
<title type="html"><![CDATA[Re: Zawieszanie się programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166633#p166633"><![CDATA[
Proponuje dodać jedno diodowy debuger w newralgiczne punkty (np pętla gdzie program czeka na echo z czujnika) - być może w tych pętlach program staje...<br />Jeśli nie wiesz co to jedno diodowy debuger tu masz w poradniku P. Mirka<br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=yVFf22JxuEs" >https://www.youtube.com/watch?v=yVFf22JxuEs</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 20 sie 2016, o 20:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RealityIsFalse]]></name></author>
<updated>2016-08-20T19:05:45+01:00</updated>
<published>2016-08-20T19:05:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166616#p166616</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166616#p166616"/>
<title type="html"><![CDATA[Zawieszanie się programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16028&amp;p=166616#p166616"><![CDATA[
Witam!<br />Mam pozornie prosty problem z programem napisanym w C dla mikrokontrolera Atmega8A. Buduję robota z możliwością kontroli silników i pomiarem odległości (ultradźwięk) sterowanym z bluetooth (RS232). Całość jest na płytce stykowej i póki co zasilana z programatora. Program jest prosty, ale od czasu do czasu zupełnie się zwiesza i zaczyna działać dopiero po resecie (najczęściej problemy pojawiają się przy przesyle kilku wiadomości jedna zaraz po drugiej). Według mnie kod w C jest poprawny, ale może coś pomijam dlatego prosiłbym kogoś bardziej doświadczonego o pomoc. <br /><br />Poniżej zamieszczam mój kod źródłowy:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br /><span style="color: #FF0000"><strong><em>#ifndef F_CPU<br />#define F_CPU 8000000UL<br />#endif</em></strong><br />// TEGO NIGDY NIE ROBI SIĘ W KODZIE programu, a szczególnie na tym forum nie prezentujemy nawet takich kodów, w związku z tym, że jest to kompletny nonsens - proszę uprzejmie na przyszłość o tym pamiętać - dobrze ? mirekk36 </span><br /></div><br /><br />[syntax=c]#ifndef F_CPUU<br />#define F_CPUU 8<br />#endif<br /><br />#ifndef AVR_IO<br />#define AVR_IO<br />#include &lt;avr/io.h&gt;<br />#endif<br /><br /><br />#ifndef UTIL_DELAY<br />#define UTIL_DELAY<br />#include &lt;util/delay.h&gt;<br />#endif<br /><br />#ifndef AVR_INTERRUPT<br />#define AVR_INTERRUPT<br />#include&lt;avr/interrupt.h&gt;<br />#endif<br /><br />#define TRIG_ON PORTD=(PORTD|(1&lt;&lt;6));<br />#define TRIG_OFF PORTD=(PORTD&amp;~(1&lt;&lt;6));<br /><br /><br />volatile unsigned char bufor&#91;91&#93;;<br />volatile uint8_t glowa=0;<br />volatile uint8_t ogon=0;<br />volatile uint_fast16_t sonic=0;<br /><br /><br />int ultrasonic_measure();<br /><br />void USART_Init( unsigned int ubrr)<br />{<br />/* Set baud rate */<br />UBRRH = (unsigned char)(ubrr&gt;&gt;8);<br />UBRRL = (unsigned char)ubrr;<br />/* Enable receiver and transmitter */<br />UCSRB = (1&lt;&lt;RXEN)|(1&lt;&lt;TXEN);<br />/* Set frame format: 8data, 1stop bit */<br />UCSRC = (1&lt;&lt;URSEL)|(3&lt;&lt;UCSZ0);<br />}<br />void USART_Transmit(unsigned char data )<br />{<br />/* Wait for empty transmit buffer */<br />while ( !( UCSRA &amp; (1&lt;&lt;UDRE)) );<br />/* Put data into buffer, sends the data */<br />UDR = data;<br />}<br /><br />unsigned char USART_Receieve ()<br />{<br />//when sth is in receieve buffer :)<br />while (!(UCSRA&amp;(1&lt;&lt;RXC)));<br />//pobiera danez tego buforka :)<br />return UDR;<br />}<br /><br />void USART_Send_Text(char* text)<br />{<br />int t=0;<br />while (text&#91;t&#93;!='\0')<br />{<br />USART_Transmit(text&#91;t&#93;);<br />t++;<br />}<br />}<br /><br />void USART_send_int(int a) //maks liczby 5-cyfrowe<br />{<br />char tab&#91;5&#93;;<br />int t;<br />int_fast8_t b=0;<br />int z=10000;<br />for (t=5;t&gt;0;t--)<br />{<br /><br />tab&#91;(5-t)&#93;=((a/z)+48);<br />a=(a%z);<br />z/=10;<br />if ((tab&#91;(5-t)&#93;)!='0')<br />{<br />USART_Transmit(tab&#91;(5-t)&#93;);<br />b=1;<br />}<br />else<br />{<br />if (b==1)<br />{<br />USART_Transmit(tab&#91;5-t&#93;);<br />}<br />}<br />}<br /><br />}<br /><br /><br /><br />int ultrasonic_measure() <br />{<br />TRIG_ON; <br />_delay_us(10);<br />TRIG_OFF; <br />TIMSK=(TIMSK|1); // ustawienie zezwolenia na przerwania z timera<br />while (1)<br />{<br />if (PIND&amp;(1&lt;&lt;7)) //czekamy na wzrost napiecia na porcie do ktorego jest podpiete ECHO czujnika<br />{<br />break;<br />}<br />}<br />TCCR0=0b00000001;//konfig timera<br /><br />while(1)<br />{<br />if (!(PIND&amp;(1&lt;&lt;7)))  //czekamy na spadek napiecia na porcie do ktorego jest podpiete ECHO czujnika<br />{<br />break;<br />}<br />}<br />sonic*=(4.41/F_CPUU); //wynika ze stalych w dokumentacji<br />TIMSK=(TIMSK&amp;(~1));//wylaczenie zezwoleniana przerwania z timera<br />TCCR0=0b00000000;//wylaczenie timera<br />return sonic;<br />}<br /><br />ISR(TIMER0_OVF_vect) //przerwanie zwiekszajace licznik<br />{<br />sonic++;<br />}<br /><br />ISR(USART_RXC_vect) //odbiór danych<br />{<br />bufor&#91;glowa&#93;=UDR;<br />glowa++;<br />if (glowa==90)<br />{<br />glowa=0;<br />}<br />}<br /><br /><br />int main(void)<br />{<br />USART_Init(51);<br />UCSRB|=(1&lt;&lt;RXCIE);<br />DDRD|=(1&lt;&lt;6);<br />DDRD&amp;=~(1&lt;&lt;7);<br />DDRB|=(1&lt;&lt;1)|(1&lt;&lt;2)|(1&lt;&lt;3)|(1&lt;&lt;4);<br />PORTD|=(1&lt;&lt;7);<br />sei();<br /><br />    while(1)<br />    {<br />switch (bufor&#91;ogon&#93;)<br />{<br />case 'n':<br />PORTB|=(1&lt;&lt;1);<br />_delay_ms(100);<br />PORTB&amp;=~(1&lt;&lt;1);<br />ogon++;<br />USART_send_int(ogon);<br />break;<br />case 'b':<br />PORTB|=(1&lt;&lt;2);<br />_delay_ms(100);<br />PORTB&amp;=~(1&lt;&lt;2);<br />ogon++;<br />break;<br />case 'r':<br /><br />break;<br />case 'l':<br /><br />break;<br />case 'm':<br />USART_send_int(ultrasonic_measure());<br />sonic=0;<br />ogon++;<br />break;<br />}<br />if (90==ogon)<br />{<br />ogon=0;<br />}<br />_delay_ms(10);<br />    }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14724">RealityIsFalse</a> — 20 sie 2016, o 19:05</p><hr />
]]></content>
</entry>
</feed>