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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-06-03T14:42:45+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7268&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-03T14:39:45+01:00</updated>
<published>2014-06-03T14:39:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83203#p83203</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83203#p83203"/>
<title type="html"><![CDATA[Re: Problem z odczytem UART?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83203#p83203"><![CDATA[
<div class="quotetitle">wojtawsl napisał(a):</div><div class="quotecontent"><br />Pytanie czy dane wysłane w momencie gdy obsługa przerwania była wyłączona zostaną obsłużone w momencie ponownego zezwolenia na obsługę?<br /></div><br /><br />No to chyba musiałby być cud <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />koledzy wyżej już pisali - zainteresuj się implementacją buforów cyklicznych do obsługi RS232 bo to jest słuszna droga<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 cze 2014, o 14:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtawsl]]></name></author>
<updated>2014-06-03T14:42:45+01:00</updated>
<published>2014-06-03T14:33:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83201#p83201</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83201#p83201"/>
<title type="html"><![CDATA[Re: Problem z odczytem UART?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83201#p83201"><![CDATA[
Dzięki za pomoc Panowie, zmieniłem kod obsługi przerwania tak aby odbierał tylko znaki i zapisywał je to tablicy, a obliczenia na elementach tej tablicy przeniosłem do pętli głównej. Niestety po kilku testach wynik jest ten sam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2729">wojtawsl</a> — 3 cze 2014, o 14:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2014-06-03T09:56:40+01:00</updated>
<published>2014-06-03T09:56:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83173#p83173</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83173#p83173"/>
<title type="html"><![CDATA[Re: Problem z odczytem UART?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83173#p83173"><![CDATA[
Totalna masakra <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, w przerywaniu najwyżej umieść flagę która będzie zapalana jak przylatują dane do bufora UDR.<br />Czyli zasada jest taka, robisz obsługę gdzie masz buffor np. 32znaki do niego automatycznie jest pobierana dana z UDR za każdym razem jak do UDR trafia znak i to procesor robi w przerywaniu tylko.<br />Następnie robisz potwierdzenie że bufor się zapełnia i sprawdzasz w pętli głównej tą flagę i dopiero jak ona się &quot;zapala&quot; to obsługujesz bufor, dzięki czemu masz bezkolizyjną obsługę uarta.<br /><br />Masz może książki Mirka?<br />W zielonej książce jest dobre rozwiązanie twojego problemu. Ewentualnie możesz obejrzeć poradniki na temat calbacków i eventów i samemu spróbować napisać kod.<br /><br />PS. Kod w przerywaniu ma być jak najszybszy/najkrótszy czyli wykonujący się błyskawicznie by nie blokować głównej pętli programu.<p>Statystyki: Napisane przez Gość — 3 cze 2014, o 09:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2014-06-02T17:58:58+01:00</updated>
<published>2014-06-02T17:58:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83080#p83080</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83080#p83080"/>
<title type="html"><![CDATA[Re: Problem z odczytem UART?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83080#p83080"><![CDATA[
Jak dla mnie ta obsługa przerwania jest za długa<br />(tylko ja się dopiero uczę)<br /><br />jeśli dane są zawsze stałej długości to stworzyłbym tablicę (taki bufor)do <br />której w przerwaniu odbierałbym tylko znaki i ustawił flagę ,<br />że wszystkie już odebrane a w pętli głównej po odczytaniu<br />flagi wszystko przeliczał i zapisał do docelowej tablicy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 2 cze 2014, o 17:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtawsl]]></name></author>
<updated>2014-06-02T12:50:36+01:00</updated>
<published>2014-06-02T12:50:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83025#p83025</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83025#p83025"/>
<title type="html"><![CDATA[Problem z odczytem UART?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7268&amp;p=83025#p83025"><![CDATA[
Witam serdecznie!<br />próbuję od paru dni znaleźć błąd w moim kodzie niestety bez skutku dlatego zwracam się do Was drodzy forumowicze!<br /><br />Napisałem program na atmege8 z odczytywaniem znaków w przerwaniu.<br />Ramka którą wysyłam z terminala ma postać -12A1234567890ABCDEF zawsze zaczyna się znakiem '-' i zawsze ma taką samą długość. Znaki odbieram pojedynczo, przeliczam aby z ASCII otrzymać liczbę szesnastkową i zapisuję do tablicy zmiennych. Dla sprawdzenia przesyłam zawartość tablicy spowrotem przez rs do PC i tu odkrywam, że nie zawsze dane są w takiej samej postaci jak je przesyłam, np. dla ciągu danych 12A1234567890ABCDEF, otrzymuję np. 12A7890123456ABCDEF. Poniżej kod obsługi przerwania:<br /><br />[syntax=c]ISR(USART_RXC_vect)<br />{<br />PORTB ^= (1&lt;&lt;PB0);<br />uint8_t data;<br />data = UDR;<br /><br />if(msg){<br />if(data &gt;= 0x30 &amp;&amp; data&lt;=0x39) // przeliczenie ASCII na liczbe<br />data = data - 0x30;<br />else{<br />if(data &gt;= 0x41 &amp;&amp; data &lt;= 0x46)<br />data = data - 0x37;<br />else{<br />if(data &gt;= 0x61 &amp;&amp; data &lt;= 0x66)<br />data = data - 0x57;<br />}<br />}<br />inkrement++;<br /><br />switch(inkrement){    //odczyt kolejnych polbajtow i zapis do tablicy<br />case 19:<br />message&#91;nrRamki&#93;.data&#91;7&#93; |= data;<br />inkrement = 0;<br /><br />txUart(message&#91;nrRamki&#93;.id&gt;&gt;8);<br />txUart(message&#91;nrRamki&#93;.id);<br />for(int k=0;k&lt;8;k++){<br />txUart(message&#91;nrRamki&#93;.data&#91;k&#93;);<br />_delay_ms(100);<br />}<br />msg = false;<br />if(nrRamki&lt;frameQuantity-1){<br />nrRamki++;<br />}<br />else{<br />nrRamki = 0;<br />UCSRB &amp;= ~(1&lt;&lt;RXCIE); // wyłączenie przerwania od RX Uart<br />OCR1A = czas/0.064;<br />TIMSK |= (1&lt;&lt;OCIE1A); // zezwolenie na wykonywanie przerwan od timera1 w trybie CTC<br />}<br />break;<br />case 18:<br />message&#91;nrRamki&#93;.data&#91;7&#93; = data&lt;&lt;4;<br />break;<br />case 17:<br />message&#91;nrRamki&#93;.data&#91;6&#93; |= data;<br />break;<br />case 16:<br />message&#91;nrRamki&#93;.data&#91;6&#93; = data&lt;&lt;4;<br />break;<br />case 15:<br />message&#91;nrRamki&#93;.data&#91;5&#93; |= data;<br />break;<br />case 14:<br />message&#91;nrRamki&#93;.data&#91;5&#93; = data&lt;&lt;4;<br />break;<br />case 13:<br />message&#91;nrRamki&#93;.data&#91;4&#93; |= data;<br />break;<br />case 12:<br />message&#91;nrRamki&#93;.data&#91;4&#93; = data&lt;&lt;4;<br />break;<br />case 11:<br />message&#91;nrRamki&#93;.data&#91;3&#93; |= data;<br />break;<br />case 10:<br />message&#91;nrRamki&#93;.data&#91;3&#93; = data&lt;&lt;4;<br />break;<br />case 9:<br />message&#91;nrRamki&#93;.data&#91;2&#93; |= data;<br />break;<br />case 8:<br />message&#91;nrRamki&#93;.data&#91;2&#93; = data&lt;&lt;4;<br />break;<br />case 7:<br />message&#91;nrRamki&#93;.data&#91;1&#93; |= data;<br />break;<br />case 6:<br />message&#91;nrRamki&#93;.data&#91;1&#93; = data&lt;&lt;4;<br />break;<br />case 5:<br />message&#91;nrRamki&#93;.data&#91;0&#93; |= data;<br />break;<br />case 4:<br />message&#91;nrRamki&#93;.length = 8;<br />message&#91;nrRamki&#93;.data&#91;0&#93; = data&lt;&lt;4;<br />break;<br />case 3:<br />message&#91;nrRamki&#93;.id |= data;<br />break;<br />case 2:<br />message&#91;nrRamki&#93;.id |= data&lt;&lt;4;<br />break;<br />case 1:<br />message&#91;nrRamki&#93;.id = data&lt;&lt;8;<br />message&#91;nrRamki&#93;.rtr = 0;<br />break;<br />}<br />}<br /><br />if(data == 0x2A &amp;&amp; inkrement==0){//* - konfiguracyjny<br />config = true;<br />}<br />else if(data == 0x2B &amp;&amp; inkrement==0){//+ - okreslenie liczby ramek do wyslania<br />frame = true;<br />}<br />else if(data == 0x2D &amp;&amp; inkrement==0){//- - DANE<br />msg = true;<br />}<br />else if(data == 0x74 &amp;&amp; inkrement==0){//t - czas<br />time = true;<br />        }<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2729">wojtawsl</a> — 2 cze 2014, o 12:50</p><hr />
]]></content>
</entry>
</feed>