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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-08-17T21:53:04+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18994&amp;mode</id>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2017-08-17T19:15:09+01:00</updated>
<published>2017-08-17T19:15:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193532#p193532</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193532#p193532"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193532#p193532"><![CDATA[
&lt;proszę autora o umieszczenie kodów w znacznikach syntax&gt;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 17 sie 2017, o 19:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-08-17T17:08:46+01:00</updated>
<published>2017-08-17T17:08:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193523#p193523</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193523#p193523"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193523#p193523"><![CDATA[
<div class="quotetitle">kamilo0 napisał(a):</div><div class="quotecontent"><br />Nie denerwujcie się tak Panowie.<br /></div><br />Tak to wyglądało?<br />Zapewniam, że ja akurat jestem zupełnie spokojny. Chciałem tylko delikatnie zwrócić na coś uwagę. Nie miałem zamiaru być agresywny czy nieuprzejmy, ale wygląda na to, że chyba zostało to odebrane inaczej <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=14165">andrews</a> — 17 sie 2017, o 17:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamilo0]]></name></author>
<updated>2017-08-17T16:49:37+01:00</updated>
<published>2017-08-17T16:49:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193522#p193522</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193522#p193522"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193522#p193522"><![CDATA[
Nie denerwujcie się tak Panowie. Nie każdy ma za sobą kilkanaście lat doświadczenia w programowaniu uC. Ja nie mam, więc zdarzają się czasem takie błędy. Ważne, że w jakiś sposób udało mi się osiągnąć to, na czym mi zależało, a że w nie do końca dobry sposób, dlatego zapytałem na forum <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Biblioteka nie jest modyfikowana, dołożyłem do niej tylko tą jedną flagę (ascii_line) w obsłudze przerwania, i dopisałem sobie tą funkcję do odbierania stringu.<br /><br />Dzięki za porady, w wolnym czasie je przetestuję i mam nadzieję, że problem już nie będzie występował.<br /><br />@andrews<br />Dziękuję za dokładne wyjaśnienie problemu przerwań <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=11816">kamilo0</a> — 17 sie 2017, o 16:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-08-15T18:34:14+01:00</updated>
<published>2017-08-15T18:34:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193436#p193436</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193436#p193436"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193436#p193436"><![CDATA[
<div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br />Dlatego, że w tej bibliotece uart_getc, przy braku znaków do pobrania zwraca całkiem coś innego niż Ci się wydaje.<br /></div><br />Przepraszam, a skąd kolega wie, co zwraca funkcja <strong><em>uart_getc()</em></strong>, skoro &quot;biblioteka&quot; była modyfikowana.<br /><br />Poza tym, nawet jeśli autor wątku nie jest jakiś biegły w programowaniu i popełnia błędy, to komentarze czy sformułowania w stylu <em>&quot;recepta na uzyskanie pierwszorzędnej popeliny&quot;</em> nie są raczej na tym forum mile widziane. Wydaje mi się oczywiste, że na forum pytania zadają Ci, którzy wiedzą mniej. Ci, którzy wiedzą więcej, pomagają z zachowaniem kultury osobistej lub wcale. Błąd można równie dobrze wskazać, nie używając tego typu zwrotów.<br /><br /><div class="quotetitle">roske napisał(a):</div><div class="quotecontent"><br />A nawet jak się ma o niej pojęcie to nadal jest to bzdura (nie będę tłumaczył dlaczego).<br /></div><br />A dlaczego nie będzie kolega tłumaczył? Ja na przykład chciałbym wiedzieć, bo w swojej nieświadomości kilka razy już popełniłem ten błąd (i jakoś nie przestały działać, a nawet działały lepiej czy też były bardziej zgodne z moimi oczekiwaniami). Aż tu nagle okazuje się, że to &quot;bzdura&quot;...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 15 sie 2017, o 18:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-08-15T14:58:58+01:00</updated>
<published>2017-08-15T14:58:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193421#p193421</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193421#p193421"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193421#p193421"><![CDATA[
Szczerze mówiąc chciałem tego uniknąć, bo to trochę pisania jest... Liczyłem, że po prostu spróbujesz czy to pomoże, nie wnikając w szczegóły.<br /><br />No ale  spróbuję w miarę możliwości krótko. Zmienna globalna <strong><em>ascii_line</em></strong> jest modyfikowana zarówno w programie głównym, jak i w procedurze obsługi przerwania. Operacja <strong><em>ascii_line--;</em></strong> nie odbywa się w  jednym takcie zegara, ponieważ jest zapisana w pamięci RAM, a nie mikrokontroler nie może wykonywać operacji bezpośrednio na komórkach pamięci. Wymagane więc jest:<ul><li>wczytanie zmiennej z pamięci RAM do rejestru,</li><li>wykonanie operacji pomniejszenia wartości rejestru,</li><li>zapisanie wartości rejestr z powrotem do RAM.</li></ul>Jeśli w trakcie tej operacji (po wczytaniu zmiennej do rejestru) wystąpi przerwanie i zmodyfikuje wartość zmiennej, to program główny o tym nie wie, i nie wczyta ponownie zmiennej do rejestru, tylko wykona operację na rejestrze i zapisze wynik operacji z rejestru do zmiennej w RAM, czyli przykładowo:<br /><ul><li>program główny wczytuje do rejestru wartość zmiennej <strong><em>ascii_line</em></strong> równą <strong>3</strong>,</li><li>występuje przerwanie i procedura jego obsługi zmienia wartość zmiennej <strong><em>ascii_line</em></strong> na <strong>4</strong>,</li><li>po zakończeniu procedury obsługi program główny wraca do miejsca, w którym skończył, i wykonuje następną instrukcję, czyli zmniejsza wartość rejestru z <strong>3</strong> na <strong>2</strong>,</li><li>po wykonaniu operacji zapisuje wartość z rejestru (czyli <strong>2</strong>, a powinno być <strong>3</strong>) do zmiennej <strong><em>ascii_line</em></strong> w pamięci RAM.</li></ul>W efekcie wartość zmiennej po tej operacji jest nieprawidłowa, bo nie uwzględnia tego, co doliczyła w międzyczasie procedura obsługi przerwania. W ten sposób w buforze zawsze zostaną dane nie uwzględnione przez zmienną <strong><em>ascii_line</em></strong>, przez co prędzej czy później bufor się przepełni. Jaki będzie tego efekt to jest uzależnione od tego, jak masz zorganizowaną resztę programu (szczególnie chodzi o obsługę bufora, czyli zadbanie o to, by nie szło go przepełnić).<br /><br />Prawdopodobieństwo &quot;trafienia&quot; nie jest wprawdzie duże, ale jakieś jest, dlatego program może przez jakiś czas pozornie pracować prawidłowo, a czas ten będzie losowy, choć w pewnej mierze zależny np. od częstotliwości i długości przesyłanych pakietów danych (u Ciebie ciągów znaków oddzielonych znakiem '\r', jeśli dobrze rozumiem). Im więcej krótkich pakietów w jednostce czasu, tym ryzyko problemów będzie większe.<br /><br />EDIT:<br /><div class="quotetitle">kamilo0 napisał(a):</div><div class="quotecontent"><br />Bibliotekę tą zmodyfikowałem dla własnych potrzeb tak, abym mógł odbierać całe stringi<br />...<br />Zmodyfikowałem sobie funkcję uart_get_str, tak aby niemożliwe było zapisanie do bufora wiecej bajtów niż posiada bufor UART.<br />...<br />Teraz wygląda, że jest ok. Narazie nie zauważyłem resetów. Wie ktoś, dlaczego tak się działo?<br /></div><br />By można było odpowiedzieć na to pytanie musiałbyś pokazać więcej kodu, szczególnie tego dotyczącego obsługi buforów. Bardzo istotne jest np. to, co tak na prawdę zwraca funkcja <em>uart_getc()</em>, bo nie jestem pewien, czy Twoja pętla odczytu bufora działa prawidłowo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 15 sie 2017, o 14:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamilo0]]></name></author>
<updated>2017-08-17T21:52:09+01:00</updated>
<published>2017-08-15T14:45:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193418#p193418</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193418#p193418"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193418#p193418"><![CDATA[
Zmodyfikowałem sobie funkcję uart_get_str, tak aby niemożliwe było zapisanie do bufora wiecej bajtów niż posiada bufor UART (oraz mój bufor z odebraną linijką w programie).<br /><br />[syntax=c]char * uart_get_str(char *buf){<br />uint8_t cnt = 0;<br />int c;<br />char *wsk = buf;<br />if( ascii_line ) {<br />while( (c= uart_getc())) {<br />if( 13 == c || c&lt;0) break;<br />if(c != '\r' &amp;&amp; c!= '\n') *buf++ = c;<br />cnt++;<br />if(cnt&gt;(UART_RX_BUFFER_SIZE-1)) break;<br />}<br />*buf++=0;<br />ascii_line--;<br />}<br />return wsk;<br />}[/syntax]<br /><br />Teraz wygląda, że jest ok. Narazie nie zauważyłem resetów. Wie ktoś, dlaczego tak się działo? Przecież jeśli przerwanie inkrementowało zmienną ascii_line, to znaczy, że w buforze był znak Enter (13), a widocznie pętla while nie &quot;zauważała&quot; tego znaku i zapisywała więcej danych niż rozmiar mojego bufora.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11816">kamilo0</a> — 15 sie 2017, o 14:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamilo0]]></name></author>
<updated>2017-08-15T10:52:46+01:00</updated>
<published>2017-08-15T10:52:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193411#p193411</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193411#p193411"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193411#p193411"><![CDATA[
@andrews<br />A możesz powiedzieć, dlaczego przerwania z ascii_line mogą powodować problemy?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11816">kamilo0</a> — 15 sie 2017, o 10:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-08-15T08:54:23+01:00</updated>
<published>2017-08-15T08:54:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193408#p193408</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193408#p193408"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193408#p193408"><![CDATA[
<div class="quotetitle">TomekTomek55 napisał(a):</div><div class="quotecontent"><br />Moim zdaniem masz zle zbudowany program odbierajacy ale nie w tej czesci co przedstawiles<br /></div>W tej części, którą autor przedstawił, też jest błąd mogący powodować nieporządane efekty. Polega on na braku atomowości dostępu do zmiennej globalnej <strong><em>ascii_line</em></strong> i pokazałem sposób, jak ten błąd naprawić. Nie wykluczam oczywiście błędów w innych miejscach programu i nie neguję całkowicie tego co napisałeś, jednak niezależnie od wszystkiego akurat w tym miejscu zmiana jest niezbędna, jeśli program ma pracować stabilnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 15 sie 2017, o 08:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[TomekTomek55]]></name></author>
<updated>2017-08-14T21:14:06+01:00</updated>
<published>2017-08-14T21:14:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193398#p193398</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193398#p193398"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193398#p193398"><![CDATA[
Moja rada jest taka zrób sobie podsłuch taki to odbiera atmega poprzez terminal w kompie tzn. podlacz sie pod pin RX atmegi jakims konwerterem rs na usb i wyswietlaj co otrzymuje atmega.<br />Moim  zdaniem masz zle zbudowany program odbierajacy ale nie w tej czesci co przedstawiles tylko juz w tym gdzie rozpatrujesz odebrane linie. mam tu na mysli nadchodzacy ciag danych o zbyt wielkim rozmiarze w porownaniu do zadeklarownaj zmiennej. Powodje to nadpisywanie innych zmiennych z ramu i w konsekwencji reset przypadkowy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4629">TomekTomek55</a> — 14 sie 2017, o 21:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-08-14T17:53:19+01:00</updated>
<published>2017-08-14T17:53:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193395#p193395</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193395#p193395"/>
<title type="html"><![CDATA[Re: Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193395#p193395"><![CDATA[
Spróbowałbym przed instrukcją <strong><em>ascii_line--;</em></strong> wyłączyć przerwania instrukcją <strong><em>cli();</em></strong>, a po instrukcji <strong><em>ascii_line--;</em></strong> włączyć przerwania instrukcją <strong><em>sei();</em></strong><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 14 sie 2017, o 17:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kamilo0]]></name></author>
<updated>2017-08-17T21:53:04+01:00</updated>
<published>2017-08-14T16:54:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193392#p193392</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193392#p193392"/>
<title type="html"><![CDATA[Atmega328 - Odbieranie danych przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18994&amp;p=193392#p193392"><![CDATA[
Witam. Piszę sobie program do komunikacji z modułem sim800L. Chcę wysyłać do niego, a także odbierać z niego dane.<br />Napisałem sobie już całą obsługę tego modułu, ale mam jeden problem. Komunikacja z modułem zwykle działa dobrze, ale od czasu do czasu podczas przesyłania danych ATMega resetuje się <img src="https://forum.atnel.pl/images/smilies/icon_e_surprised.gif" alt=":o" title="Zdziwiony" />.<br /><br />Używam dosyć popularnej biblioteki uart dostępnej na tej stronie:<br /><a href="http://homepage.hispeed.ch/peterfleury/avr-software.html"  class="postlink">http://homepage.hispeed.ch/peterfleury/avr-software.html</a><br /><br />Bibliotekę tą zmodyfikowałem dla własnych potrzeb tak, abym mógł odbierać całe stringi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />W pliku uart.c dopisałem sobie taką funkcję wzorując się na poradniku YT pana Mirka:<br /><br />[syntax=c]char * uart_get_str(char *buf){<br />int c;<br />char *wsk = buf;<br />if( ascii_line ) {<br />while( (c= uart_getc())) {<br />if( 13 == c || c&lt;0) break;<br />if(c != '\r' &amp;&amp; c!= '\n') *buf++ = c;<br />}<br />*buf++=0;<br />ascii_line--;<br />}<br />return wsk;<br />}[/syntax]<br /><br />Zmienna ascii_line inkrementowana jest w przerwaniu od odbioru danych uarta, gdy odebrany znak = 13 (ENTER). W ten sposób funkcja uart_get_str jest informowana, że dostępna jest linijka do odebrania. Wydaje mi się, że funkja uart_get_str jest tutaj problemem, ponieważ gdy ją usunę i ręcznie wysyłam z komputera dane do mikrokontrolera, resetów nie ma. Gdy funkcja jest włączona, podczas wysłania większej ilości danych następuje reset.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11816">kamilo0</a> — 14 sie 2017, o 16:54</p><hr />
]]></content>
</entry>
</feed>