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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-08-03T22:44:28+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12516&amp;mode</id>
<entry>
<author><name><![CDATA[roll99]]></name></author>
<updated>2015-08-03T22:44:28+01:00</updated>
<published>2015-08-03T22:44:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136306#p136306</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136306#p136306"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136306#p136306"><![CDATA[
Problem polegał na tym że inicjalizowałem tzn. ustawiałem źródło i podział dla TIMER0 w programie głównym, i od tego momentu rozpoczynało się zliczanie przepełniając pewnie wiele razy TIMER0 co powodowało ustawienie flagi TOV0 w rejestrze TIFR. W obsłudze przerwania odbioru znaku tylko ustawiałem licznik na wartość początkową i włączałem przerwanie od przepełnienia TIMER0 i w tym momencie następował obsługa przerwania (bo wcześniej była ustawiona flaga TOV0). Dalsze znaki odbierane były jakby w &quot;drugiej paczce&quot; bo od tego momentu TIMER0 już był opanowany i liczył tak jak zakładałem. Wyjście to wyzerowanie flagi TOV0 w TIFR oczywiście TIFR = (1&lt;&lt;TOV0) - jak poprawił mnie mirek36, lub inicjalizacja TIMER0 każdorazowo w przerwaniu po odbiorze pierwszego znaku oraz wyłączenie przerwania od TIMER0 i stopowanie licznika - &quot;odłączenie od źródła impulsów&quot; i ustawienie na wartość początkową po wystąpieniu przerwania od TIMER0. Pierwszy sposób łatwiejszy i krótszy. <br />Inicjalizacja parametrów TIMERA w programie głównym w wielu innych przypadkach może nie wpływać na dziwne zachowanie się programu (jedna więcej pętla obsługi zdarzeń itp.) tu jednak był dość duży reżim jeśli chodzi o poprawną jego pracę.<br />pozdr Jurek<br />temat można zamknąć<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7275">roll99</a> — 3 sie 2015, o 22:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[roll99]]></name></author>
<updated>2015-08-03T15:29:03+01:00</updated>
<published>2015-08-03T15:29:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136235#p136235</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136235#p136235"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136235#p136235"><![CDATA[
OK masz rację ...<br />pozdr Jurek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7275">roll99</a> — 3 sie 2015, o 15:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-08-03T15:15:18+01:00</updated>
<published>2015-08-03T15:15:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136233#p136233</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136233#p136233"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136233#p136233"><![CDATA[
<div class="quotetitle">roll99 napisał(a):</div><div class="quotecontent"><br />chyba że źle czytam.<br /></div><br />Źle czytasz i kompletnie nie rozumiem po co się upierasz .... Tym bardziej, że sam producent procków tobie to pisze...<br /><br />Robiąc operację OR możesz niechcący kasować inne flagi przerwań w tym samym rejestrze<br /><br />a ten cytat z &quot;so there is no risk&quot; odnosi się właśnie do = a nie do |=<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 sie 2015, o 15:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[roll99]]></name></author>
<updated>2015-08-03T14:40:40+01:00</updated>
<published>2015-08-03T14:40:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136231#p136231</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136231#p136231"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136231#p136231"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Widzę, że niedokładnie przeczytałeś link który ci podałem bo tu w ogóle nie chodzi o wydajność (oszczędność instrukcji)<br /></div><br /><br />No tak ale poza tym OR (plus odczyt stanu poprzedniego) różnicy w efekcie i ewentualnych działaniach ubocznych nie ma - chyba że źle czytam.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />...  so there is no risk of any race condition that might accidentally clear another interrupt request bit. So instead of writing TIFR |= _BV(TOV0); /* wrong! */ <span style="text-decoration: underline"><strong>simply use</strong></span> TIFR = _BV(TOV0);<br /></div><br />pozr Jurek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7275">roll99</a> — 3 sie 2015, o 14:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-08-03T14:23:15+01:00</updated>
<published>2015-08-03T14:23:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136227#p136227</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136227#p136227"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136227#p136227"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />No tak jak pisałem, obie metody są OK, Twoja o jedną instrukcję wydajniejsza,<br /></div><br />Widzę, że niedokładnie przeczytałeś link który ci podałem bo tu w ogóle nie chodzi o wydajność (oszczędność instrukcji)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 sie 2015, o 14:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[roll99]]></name></author>
<updated>2015-08-03T14:07:44+01:00</updated>
<published>2015-08-03T14:07:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136226#p136226</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136226#p136226"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136226#p136226"><![CDATA[
No tak jak pisałem, obie metody są OK, Twoja o jedną instrukcję wydajniejsza, bardziej interesuje mnie dlaczego jak nie wyzeruję tej flagi to po odebraniu pierwszego znaku odpala mi przerwanie od przepełnienia TIMER0 <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />, długo nad tym siedziałem - efekt był taki ze slave odpowiadał dwiema ramkami raz po pierwszym znaku a drugi raz po reszcie odebranej ramki (ramki odbiorczej nie analizowałem tylko sprawdzałem czy cos zostało odebrane czyli czy przerwanie od TIMER0 zostało odpalone a flaga stanu ustawiona na MB_DONE_RX a ustawiała się ona tylko w procedurze obsługi TIMER0 po przepełnieniu czyli po upływie 3-4 ms od odbioru ostatniego znaku. <br /><br />pozdrawiam Jurek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7275">roll99</a> — 3 sie 2015, o 14:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-08-03T13:37:44+01:00</updated>
<published>2015-08-03T13:37:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136223#p136223</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136223#p136223"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136223#p136223"><![CDATA[
Sam do niedawna często zapominałem o tym i pisałem bodajże nawet w książce kasowanie flag przerwań z tym OR ... ale to akurat w tym przypadku jest niestety błędne <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />tu: <!-- m --><a class="postlink" href="http://www.atmel.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_intbits.html" >http://www.atmel.com/webdoc/AVRLibcRefe ... tbits.html</a><!-- m --> masz dokładniejsze wyjaśnienie<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 26 minutach ]</span></strong><br /><br /><div class="quotetitle">roll99 napisał(a):</div><div class="quotecontent"><br />(przynajmniej w ATMEGA 8)<br /></div><br />w KAŻDYM AVR przy kasowaniu flag przerwań<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 sie 2015, o 13:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[roll99]]></name></author>
<updated>2015-08-03T13:31:23+01:00</updated>
<published>2015-08-03T13:31:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136221#p136221</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136221#p136221"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136221#p136221"><![CDATA[
Dziękuje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> za pochwałę Mistrza (nie ironicznie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> )dotyczącą unii - prace trwają więc sprawa rozwojowa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> .<br /><br />a co jest złe w zapisie ?<br />[syntax=c]TIFR |= (1&lt;&lt;TOV0)[/syntax]<br /><br />czy nie ustawi to flagi TOV0 na jeden, wiem że nie można zapisać do rejestru TIFR zera (przynajmniej w ATMEGA 8) i pewnie zapis TIFR = (1&lt;&lt;TOV0) nie ustawi pozostałych flag na zero.<br /><br />pozdrawiam Jurek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7275">roll99</a> — 3 sie 2015, o 13:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-08-03T13:21:52+01:00</updated>
<published>2015-08-03T13:21:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136220#p136220</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136220#p136220"/>
<title type="html"><![CDATA[Re: UNIA jako wygodny dostep do struktury i takie tam inne .]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136220#p136220"><![CDATA[
<div class="quotetitle">roll99 napisał(a):</div><div class="quotecontent"><br />Czy taka konstrukcja jakoś bardzo pogarsza wydajność programu?<br /></div><br />Wręcz przeciwnie - to jest WZORCOWE PODEJŚCIE <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> aż się miło patrzy. Tzn mówię o takim zastosowaniu unii i struktur - nie wnikam w stronę merytoryczną.<br /><br /><div class="quotetitle">roll99 napisał(a):</div><div class="quotecontent"><br />TIFR |= (1&lt;&lt;TOV0)<br /></div><br />UWAGA! tak się nie kasuje flag przerwań - KONIECZNIE napisz to tak:<br /><br />[syntax=c]TIFR = (1&lt;&lt;TOV0);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 sie 2015, o 13:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[roll99]]></name></author>
<updated>2015-08-03T11:28:53+01:00</updated>
<published>2015-08-03T11:28:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136217#p136217</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136217#p136217"/>
<title type="html"><![CDATA[UNIA jako wygodny dostep do struktury i takie tam inne ...]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12516&amp;p=136217#p136217"><![CDATA[
Witam na forum<br /><br />Piszę w ramach wprawki prostą bibliotekę modbus (ATMEGA 8), i mam dwa pytanka :<br /> - w celu ułatwienia dostępu do struktury w której trzymam ramkę odebraną/do nadania używam wielopoziomowej unii. Czy taka konstrukcja jakoś bardzo pogarsza wydajność programu?<br /><br />[syntax=c]typedef struct {<br />uint16_t startAdrr;<br />uint16_t numberRegs;<br />} TMBRxFn03;<br /><br /><br />typedef struct {<br />uint16_t startAdrr;<br />uint16_t numberCoils;<br />} TMBRxFn01;<br /><br />typedef struct {<br />uint8_t numberBytes;<br />uint8_t data&#91; MB_DATA_SIZE_8_BIT -1 &#93;;<br />} TMBTxFn01;<br /><br />typedef struct {<br />uint8_t exceptionCode;<br />} TMBTxEception;<br /><br />// struktura ramki MB<br />typedef union {<br />uint8_t mbFrame&#91; MB_MAX_FRAME_SIZE &#93;;<br />struct {<br />uint8_tslaveAddr;<br />uint8_tcodeFunction;<br />union {<br />uint8_tdata&#91; MB_DATA_SIZE_8_BIT &#93;;<br />uint16_treg16&#91; MB_DATA_SIZE_16_BIT &#93;;<br />TMBRxFn03RxFn03;<br />TMBRxFn01RxFn01;<br />TMBTxFn01TxFn01;<br />TMBTxEception exception;<br />};<br />uint16_tcrc;<br />};<br />} TMBFrame ;[/syntax]<br /><br /><br /><br /><br />-  w przerwaniu generowanym po odbiorze danej przez UART, przy pierwszej danej odebranej ustawiam parametry dla TIMER0 tak aby generował przerwanie po około 3ms, jeśli nie wykonam kasowania (wpisanie 1) rejestru TIFR |= (1&lt;&lt;TOV0) to według objawów działania programu po pierwszym odebranym znaku generowane jest przerwanie TIMER0, następne znaki odbierane są już poprawnie, po wykonani kasowania flagi TOV0 (jak w poniższym kodzie) działa dobrze. Nie znalazłem w datasheeet do A8 żadnej informacji która naprowadziłaby mnie skąd bierze się ten problem, ale w niektórych rozwiązaniach w necie kasowanie TOV0 jest również stosowane, w programie nie wykorzystuje poza tym innych timerów. <br />[syntax=c]void initUART( void ) {<br /><br />UBRRH = ( uint8_t ) ( UART_UBRR &gt;&gt; 8 );<br />UBRRL = ( uint8_t ) ( UART_UBRR );<br />UCSRC = (1&lt;&lt;URSEL) | (1&lt;&lt;UCSZ1) | (1&lt;&lt;UCSZ0);<br />UART_TX_ENABLE;<br />UART_RX_ENABLE;<br /><br />}<br /><br /><br />ISR(SIG_UART_RECV){<br /><br />if( MB_PROTOCOL_STATE.state == MB_IS_IDDLE) {<br />MB_PROTOCOL_STATE.state = MB_IS_RX;<br />MB_RX_BUFFER_INDEX = 0;<br />T35_TOV0_RESET;<br />T35_TIMER_RESET;<br />T35_TIMER_ENABLE;<br /><br />}<br /><br /><br />if( MB_PROTOCOL_STATE.state == MB_IS_RX ) {<br />if( MB_RX_BUFFER_INDEX &lt; MB_MAX_FRAME_SIZE ) {<br />MB_FRAME_BUFFER.mbFrame&#91; MB_RX_BUFFER_INDEX++ &#93; = UDR;<br />T35_TIMER_RESET;<br /><br />}<br />else {<br />MB_PROTOCOL_STATE.state = MB_ERR_RX;<br />MB_PROTOCOL_STATE.codeError = MB_ERR_BUFFER_OVERLOAD;<br />}<br /><br />}<br /><br /><br />}[/syntax]<br /><br />[syntax=c]void initTimer( void ) {<br />TCCR0 |= (1&lt;&lt;CS00) | (1&lt;&lt;CS02); // źródłem CLK, preskaler 1024<br />T35_TIMER_RESET;<br />}[/syntax]<br /><br /><br /><br />i makra <br /><br />[syntax=c]#define    T35_TIMER        220                                          //12MHz 36*85us<br />#define    T35_TIMER_RESET         TCNT0 = T35_TIMER<br />#define    T35_TOV0_RESETTIFR |= (1&lt;&lt;TOV0);<br />#define    T35_TIMER_ENABLETIMSK |= (1&lt;&lt; TOIE0);            //Włączenie przerwanie overflow (przepełnienie timera)<br />#define    T35_TIMER_DISABLETIMSK &amp;= ~(1&lt;&lt; TOIE0);         //Wyłączenie przerwanie overflow (przepełnienie timera)[/syntax]<br /><br /><br />pozdrawiam Jurek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7275">roll99</a> — 3 sie 2015, o 11:28</p><hr />
]]></content>
</entry>
</feed>