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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-11-25T17:57:59+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=9396&amp;mode</id>
<entry>
<author><name><![CDATA[AndrzejG]]></name></author>
<updated>2014-11-25T17:57:59+01:00</updated>
<published>2014-11-25T17:57:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105915#p105915</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105915#p105915"/>
<title type="html"><![CDATA[Re: Ujarzmienie pętli]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105915#p105915"><![CDATA[
Na podstawie tego wycinka kodu ciężko jest stwierdzić, dlaczego ten fragment Ci nie działa.<br />Z jakiej biblioteki korzystasz też nie napisałeś dokładnie. Zapewne tej dostępnej z <a href="http://beaststwo.org/avr-uart/"  class="postlink">http://beaststwo.org/avr-uart/</a>.<br /><br />Na początku powinieneś zwrócić uwagę na to jak działa funkcja <strong>uart_getc()</strong>.<br /><br />Na przykładzie biblioteki ze strony której podałem masz opis w uart.h<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">/**<br /> *  @brief   Get received byte from ringbuffer<br /> *<br /> * Returns in the lower byte the received character and in the <br /> * higher byte the last receive error.<br /> * UART_NO_DATA is returned when no data is available.<br /> *<br /> *  @param   void<br /> *  @return  lower byte:  received byte from ringbuffer<br /> *  @return  higher byte: last receive status<br /> *           - \b 0 successfully received data from UART<br /> *           - \b UART_NO_DATA           <br /> *             &lt;br&gt;no receive data available<br /> *           - \b UART_BUFFER_OVERFLOW   <br /> *             &lt;br&gt;Receive ringbuffer overflow.<br /> *             We are not reading the receive buffer fast enough, <br /> *             one or more received character have been dropped <br /> *           - \b UART_OVERRUN_ERROR     <br /> *             &lt;br&gt;Overrun condition by UART.<br /> *             A character already present in the UART UDR register was <br /> *             not read by the interrupt handler before the next character arrived,<br /> *             one or more received characters have been dropped.<br /> *           - \b UART_FRAME_ERROR       <br /> *             &lt;br&gt;Framing Error by UART<br /> */<br />extern unsigned int uart_getc(void);<br /></div><br /><br />I dalej po wykonaniu uart_getc zwracany jest typu unsigned int ( 2 bajty ), gdzie w starszym bajcie jest info o statusie, w młodszym przekazany kod znaku o ile jest zwrócony został status 0 ( poprawnej transmisji )<br /><br />Odnosząc się znowu do biblioteki, którą podałem, to jak sobie podejrzysz plik nagłówkowy ( ten z rozszerzeniem .h ) to zauważysz, że nie ma tam funkcji do pobrania całego ciągu znaku na raz. Musisz to obsłużyć sam. W moim przekonaniu najlepiej byłoby jakbyś funkcję uart_getc() wrzucił w pętlę do {instrukcje do wykonania} while(warunek); coś na wzór <br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">do {<br />l = uart_getc()<br />} while ( warunek )<br /></div><br />Pętla do{}while() powinna się wykonywać do momentu jeżeli nie zostanie przesłany znak Enter w zmiennej l w młodszym bajcie ( jako sygnał zakończenia wprowadzania danych lub do momentu osiągnięcia końca buforu EAN( czyli pewno maks 16 znaków - jak na wyświetlaczu, przy założeniu, że stosujesz wyświetlacz 16 kolumnowy). To są założenia gdy starszy bajt zwraca &quot;0&quot; czyli  successfully received data from UART. Błąd transmisji też wypadałoby obsłużyć w jakiś sposób, ale tego nie będę poruszał.<br /><br />Idąc dalej chcesz wejść do if'a <br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">if ((ean==1))<br />{<br />.<br />.<br />}</div><br /><br />po ustawieniu zmiennej ean w if'ie:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">if(((EAN&#91;13&#93;=='\r'))&amp;(i==0)) // &#91;b&#93;&lt;= tutuj jest błąd merytoryczny. Robisz iloczyn bitowy ( &amp; ) zamiast AND logiczny ( &amp;&amp;)&#91;/b&#93;<br />   {<br />      ean=1; //kod w całoci w tablicy EAN&#91;&#93;<br />   }<br /></div><br /><br />Po pierwsze jak zrobisz zczytywanie znaków w pętli do{}while() to z tego fragmentu (z tych dwóch if'ów) będziesz mógł zrezygnować, bo będzie wiadomo, że masz wypełniony już bufor EAN. Sprawdzanie nie będzie konieczne. <br /><br />I jeszcze co do przedstawionego if'a. Zakładasz, że na pozycji 13 buforu EAN będziesz miał znak '\r'. Czy to jest założenie poprawne?<br />Dodatkowo musiałbyś wyjaśnić co dla Ciebie oznacza zmienna <strong>i</strong>, a także w dalszej części kodu <strong>e</strong>, <strong>ean13</strong>, itd. Z przedstawionego kodu nie wynika w jaki sposób te zmienne są ustawiane, po co i co oznaczają. Zaznaczyłem również we fragmencie kodu z if, gdzie masz błąd. Kompilator Ci nie krzyknie błędem, bo taka składnia w C jest dopuszczalna, ale zamiar chyba miałeś inny. <br /><br />Opis jest trochę zakręcony, ale powyższe uwagi myślę, że powinny Ciebie częściowo naprowadzić na cel jaki chcesz osiągnąć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6885">AndrzejG</a> — 25 lis 2014, o 17:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[molvin]]></name></author>
<updated>2014-11-25T15:55:27+01:00</updated>
<published>2014-11-25T15:55:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105905#p105905</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105905#p105905"/>
<title type="html"><![CDATA[Re: Ujarzmienie pętli]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105905#p105905"><![CDATA[
Może jednak ma ktoś pomysł... chociaż doradźcie jak jak za jednym zamachem ściągnąć wszystkie znaki do tablicy.<br />Żeby rozjaśnić dodam, że jest to kod, a raczej próba odtworzenia z głowy kodu, specyficznego kalkulatora. <br />Na poprzednim wsadzie kalkulator dostawał po RS-232 ciąg znaków, wybierał z tego te które odpowiadają za ilość i sumował je z kolejnymi nadchodzącymi po RS-ie. I działało to pięknie długi czas, aż nie zachciało mi się wprowadzić parę poprawek, na oryginalnym kodzie, bez zrobienia kopii. Tak sknociłem, że nie mogłem się połapać. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><br />Niestety nie umiem już sobie przypomnieć jak zrealizowałem to, że gdy pojawił się znak 'CR', kalkulator pobierał znaki z tablicy i dodawał do poprzedniej sumy. Robił to raz, i czekał aż znów pojawi się 'CR', czyli że nowe znaki(cyfry) się pojawiły w tablicy.<br />Przy obecnym kodzie odbywa się to, albo tyle razy ile znaków napłynęło po RS-ie, albo cały czas po  pierwszym wczytaniu ostatniego znaku do tablicy.<br />Nie potrafię tego przeskoczyć. To był/jest mój pierwszy poważny projekt. Proszę o wyrozumiałość i pomoc.<br />Też kiedyś zaczynaliście... chyba:) <br /><br />dzięki!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2083">molvin</a> — 25 lis 2014, o 15:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[WoodPaker]]></name></author>
<updated>2014-11-24T00:12:11+01:00</updated>
<published>2014-11-24T00:12:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105687#p105687</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105687#p105687"/>
<title type="html"><![CDATA[Re: Ujarzmienie pętli]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105687#p105687"><![CDATA[
Nie do końca wiem co Twój program robi bo nie wgłębiałem się ale chcę sie zapytać czy zdajesz sobie sprawę z tego, że &quot;&amp;&quot; jest operatorem bitowym, a nie logicznym?<br />[syntax=c]if(!((dzies==0)&amp;(jedn==0)&amp;(dziesiate==0)&amp;(tysieczne==0)&amp;(setne==0)))[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1425">WoodPaker</a> — 24 lis 2014, o 00:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[molvin]]></name></author>
<updated>2014-11-23T20:13:32+01:00</updated>
<published>2014-11-23T20:13:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105644#p105644</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105644#p105644"/>
<title type="html"><![CDATA[Ujarzmienie pętli]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9396&amp;p=105644#p105644"><![CDATA[
Przyjaciele, mam problem.<br /> oto kod (biblioteki atmelowskie)<br /><br />[syntax=c]while(1)<br /><br />{<br /><br /><br /><br />//==================================================================================================================<br />l=uart_getc();<br />if(l)  //wykonuje się tyle razy ile jest znaków w kodzie<br />{<br />EAN&#91;i&#93;=l;<br />i++;<br />//EAN&#91;i&#93;='\0';<br />x=2;<br />}<br />else<br />{<br />i=0;<br />}<br />//===================================================================================================================<br /><br /><br /><br />//===================================================================================================================<br /><br />//===================================================================================================================<br />lcd_locate(0,0);<br />lcd_char(EAN&#91;0&#93;);<br />lcd_locate(0,1);<br />lcd_char(EAN&#91;1&#93;);<br />lcd_locate(0,2);<br />lcd_char(EAN&#91;2&#93;);<br />lcd_locate(0,3);<br />lcd_char(EAN&#91;3&#93;);<br />lcd_locate(0,4);<br />lcd_char(EAN&#91;4&#93;);<br />lcd_locate(0,5);<br />lcd_char(EAN&#91;5&#93;);<br />lcd_locate(0,6);<br />lcd_char(EAN&#91;6&#93;);<br />lcd_locate(0,7);<br />lcd_char(EAN&#91;7&#93;);<br />lcd_locate(0,8);<br />lcd_char(EAN&#91;8&#93;);<br />lcd_locate(0,9);<br />lcd_char(EAN&#91;9&#93;);<br />lcd_locate(0,10);<br />lcd_char(EAN&#91;10&#93;);<br />lcd_locate(0,11);<br />lcd_char(EAN&#91;11&#93;);<br />lcd_locate(0,12);<br />lcd_char(EAN&#91;12&#93;);<br />lcd_locate(0,13);<br />lcd_char(EAN&#91;13&#93;);<br />lcd_locate(0,14);<br />lcd_char(EAN&#91;14&#93;);<br />lcd_locate(0,15);<br />lcd_char(EAN&#91;15&#93;);<br />//=====================================<br /><br /><br />//===================================================================================================================<br /><br /><br />//===================================================================================================================<br />//zmiana la liczby całkowita<br /><br />k_dzies=(EAN&#91;7&#93;)-(0x30);<br />k_jedn=(EAN&#91;8&#93;)-(0x30);<br />k_dziesiate=(EAN&#91;9&#93;)-(0x30);<br />k_setne=(EAN&#91;10&#93;)-(0x30);<br />k_tysieczne=(EAN&#91;11&#93;)-(0x30);<br /><br /><br /><br />//==================================================================================================================<br /><br />//zmiana na ASCII<br />lcd_locate(1,1);<br />lcd_char((k_jedn)+(0x30));<br />lcd_locate(1,2);<br />lcd_char((k_dziesiate)+(0x30));<br />lcd_locate(1,3);<br />lcd_char((k_setne)+(0x30));<br />lcd_locate(1,4);<br />lcd_char((k_tysieczne)+(0x30));<br />lcd_locate(1,0);<br />lcd_char((k_dzies)+(0x30));<br /><br /><br /><br />//======================================================================================================================<br /><br />lcd_locate(1,6);<br />lcd_int(licznik);<br />//===================================================================================================================<br /><br />if(((EAN&#91;13&#93;=='\r'))&amp;(i==0))<br />{<br />ean=1; //kod w całoci w tablicy EAN&#91;&#93;<br />}<br /><br />//===================================================================================================================<br />if ((ean==1))<br />{<br />//if(l)//if l<br />//{<br /><br />if((e==0))//if1<br />{<br /><br />if((!((ean13==1)&amp;(ean128==1))))//if2<br />{<br /><br />tysieczne=tysieczne+k_tysieczne;<br />if(tysieczne&gt;9)<br />{<br />d4=((tysieczne-(tysieczne%10))/10);<br />tysieczne=tysieczne%10;<br />setne=setne+d4;<br />}<br />setne=setne+k_setne;<br />if(setne&gt;9)<br />{<br />d3=((setne-(setne%10))/10);<br />setne=setne%10;<br />dziesiate=dziesiate+d3;<br />}<br />dziesiate=dziesiate+k_dziesiate;<br />if(dziesiate&gt;9)<br />{<br />d2=((dziesiate-(dziesiate%10))/10);<br />dziesiate=dziesiate%10;<br />jedn=jedn+d2;<br />}<br />jedn=jedn+k_jedn;<br />if(jedn&gt;9)<br />{<br />d1=((jedn-(jedn%10))/10);<br />jedn=jedn%10;<br />dzies=dzies+d1;<br />}<br />dzies=dzies+k_dzies;<br /><br />licznik++;<br />x=1;<br />LED_ON;<br />}//if2<br />}//if1<br /><br /><br /><br /><br />//===================================================================================================================<br />if((e)&amp;(x==0)) //else1<br />{<br /><br />if(!((dzies==0)&amp;(jedn==0)&amp;(dziesiate==0)&amp;(tysieczne==0)&amp;(setne==0)))//ifx1<br />{<br /><br />if(!((ean13==1)&amp;(ean128==1)))//ifx2<br />{<br />if(tysieczne&lt;k_tysieczne)<br />{<br />tysieczne=(tysieczne+10)-k_tysieczne;<br />setne=(setne-1);<br />}<br />else<br />{<br />tysieczne=tysieczne-k_tysieczne;<br />}<br />if(setne&lt;k_setne)<br />{<br />dziesiate=(dziesiate-1);<br />setne=(setne+10)-k_setne;<br />}<br />else<br />{<br />setne=setne-k_setne;<br />}<br />if(dziesiate&lt;k_dziesiate)<br />{<br />dziesiate=(dziesiate+10)-k_dziesiate;<br />jedn=(jedn-1);<br />}<br />else<br />{<br />dziesiate=dziesiate-k_dziesiate;<br />}<br />if(jedn&lt;k_jedn)<br />{<br />jedn=(jedn+10)-k_jedn;<br />dzies=(dzies-1);<br />}<br />else<br />{<br />jedn=jedn-k_jedn;<br />}<br />dzies=dzies-k_dzies;<br /><br />licznik--;<br />x=1;<br />}//ifx2<br />}//ifx1<br />}//else<br /><br />//}//if l<br />}//IF EAN<br /><br />//===================================================================================================================<br /><br />lcd_locate(1,11);<br />lcd_int(dzies);<br />lcd_locate(1,12);<br />lcd_int(jedn);<br />lcd_locate(1,13);<br />lcd_int(dziesiate);<br />lcd_locate(1,14);<br />lcd_int(setne);<br />lcd_locate(1,15);<br />lcd_int(tysieczne);<br />lcd_locate(1,1);<br /><br /><br />//===================================================================================================================<br /><br /><br />}//while<br />}//main[/syntax]<br /><br /><br />(wybaczcie poziom zaawansowanie, jestem początkującym kucykiem:) )<br /><br />nie wiem jak mam to poprawić, żeby warunki<br />[syntax=c]if ((ean==1))<br />{<br />//if(l)//if l<br />//{<br /><br />if((e==0))//if1<br />{<br /><br />if((!((ean13==1)&amp;(ean128==1))))//if2<br />{<br /><br />tysieczne=tysieczne+k_tysieczne;<br />if(tysieczne&gt;9)<br />{<br />d4=((tysieczne-(tysieczne%10))/10);<br />tysieczne=tysieczne%10;<br />setne=setne+d4;<br />}<br />setne=setne+k_setne;<br />if(setne&gt;9)<br />{<br />d3=((setne-(setne%10))/10);<br />setne=setne%10;<br />dziesiate=dziesiate+d3;<br />}<br />dziesiate=dziesiate+k_dziesiate;<br />if(dziesiate&gt;9)<br />{<br />d2=((dziesiate-(dziesiate%10))/10);<br />dziesiate=dziesiate%10;<br />jedn=jedn+d2;<br />}<br />jedn=jedn+k_jedn;<br />if(jedn&gt;9)<br />{<br />d1=((jedn-(jedn%10))/10);<br />jedn=jedn%10;<br />dzies=dzies+d1;<br />}<br />dzies=dzies+k_dzies;<br /><br />licznik++;<br />x=1;<br />LED_ON;<br />}//if2<br />}//if1<br /><br /><br /><br /><br />//===================================================================================================================<br />if((e)&amp;(x==0)) //else1<br />{<br /><br />if(!((dzies==0)&amp;(jedn==0)&amp;(dziesiate==0)&amp;(tysieczne==0)&amp;(setne==0)))//ifx1<br />{<br /><br />if(!((ean13==1)&amp;(ean128==1)))//ifx2<br />{<br />if(tysieczne&lt;k_tysieczne)<br />{<br />tysieczne=(tysieczne+10)-k_tysieczne;<br />setne=(setne-1);<br />}<br />else<br />{<br />tysieczne=tysieczne-k_tysieczne;<br />}<br />if(setne&lt;k_setne)<br />{<br />dziesiate=(dziesiate-1);<br />setne=(setne+10)-k_setne;<br />}<br />else<br />{<br />setne=setne-k_setne;<br />}<br />if(dziesiate&lt;k_dziesiate)<br />{<br />dziesiate=(dziesiate+10)-k_dziesiate;<br />jedn=(jedn-1);<br />}<br />else<br />{<br />dziesiate=dziesiate-k_dziesiate;<br />}<br />if(jedn&lt;k_jedn)<br />{<br />jedn=(jedn+10)-k_jedn;<br />dzies=(dzies-1);<br />}<br />else<br />{<br />jedn=jedn-k_jedn;<br />}<br />dzies=dzies-k_dzies;<br /><br />licznik--;<br />x=1;<br />}//ifx2<br />}//ifx1<br />}//else<br /><br />//}//if l<br />}//IF EAN[/syntax] <br /><br />wykonały się tylko raz po wpisaniu całego ciągu znaków do tablicy EAN[], potem następny raz jak zawartość będzie nadpisana itd.<br />Obecnie ciągle się zlicza. Miałem już działający kod, więc jest to do wykonania prostym sposobem, ale już zapomniałem jak to wymyśliłem, a kod mi &quot;przepadł&quot;.<br />To jest wersja robocza więc stąd taki &quot;ład&quot;.<br /><br />Bardzo proszę o pomoc!<br />Odwdzięczę się dobrym sokiem jabłkowym:) jak ktoś się we Wrocławiu pojawi:) !!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2083">molvin</a> — 23 lis 2014, o 20:13</p><hr />
]]></content>
</entry>
</feed>