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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-02-05T08:34:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10508&amp;mode</id>
<entry>
<author><name><![CDATA[xpower]]></name></author>
<updated>2015-02-05T08:34:29+01:00</updated>
<published>2015-02-05T08:34:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117306#p117306</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117306#p117306"/>
<title type="html"><![CDATA[Re: Nieblokująca obsługa DS18B20 z CRC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117306#p117306"><![CDATA[
<div class="quotetitle">QuadMan napisał(a):</div><div class="quotecontent"><br />Witam,<br />Nie bardzo zrozumiałem, który w końcu kod działa Ci poprawnie ? Ten z delay-ami, czy ten na przerwaniach powyżej?<br /></div><br /><br />Kod z delay'ami w ogóle nie jest brany pod uwagę. Kod zamieszczony przeze mnie jest przerobioną wersją oryginalnego kodu, który wysyła 2 komendy w paczce 16 bitów. Chciałem aby mój wysyłał komendy po 8 bitów, ponieważ <span style="text-decoration: underline">wydaje mi się</span>, że prościej byłoby mi później odbierać 1 bajt scratchpada do elementu 0 tablicy, zmienić indeks i wpisać kolejny bajt, itd. <br />Ilość bitów jest ściśle uzależniona od liczników.<br /><div class="quotetitle">QuadMan napisał(a):</div><div class="quotecontent"><br />Jak często masz te przerwania, na których Ci zależy ? Bo 1Wire ma taką cechę, że pomiędzy poszczególnymi bitami ( nadawanymi czy odbieranymi )  może być czas dowolnie długi, co do Resetu to też nie jest tak, że musi być dokładnie 480 us - krytyczny jest tylko ten czas oczekiwania na &quot;presence&quot;<br /></div><br />Przerwanie generowane jest z częstotliwością 8kHz czyli 125us, w inne funkcje wykonujące się w przerwaniu nie wnikam.<br /><br /><br /><div class="quotetitle">squeez napisał(a):</div><div class="quotecontent"><br />Jak koledzy wspomnieli, wykorzystanie UART mogło by pomóc ale skoro nie wchodzą żadne zmiany sprzętowe hmm ... ale może da się jedną przemycić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br />Niestety, żadnych tego typu zmian. Tylko operacje na kodzie. <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=607">xpower</a> — 5 lut 2015, o 08:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[QuadMan]]></name></author>
<updated>2015-02-05T01:34:30+01:00</updated>
<published>2015-02-05T01:34:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117293#p117293</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117293#p117293"/>
<title type="html"><![CDATA[Re: Nieblokująca obsługa DS18B20 z CRC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117293#p117293"><![CDATA[
Witam,<br />Nie bardzo zrozumiałem, który w końcu kod działa Ci poprawnie ? Ten z delay-ami, czy ten na przerwaniach powyżej?<br /><br />Jak często masz te przerwania, na których Ci zależy ? Bo 1Wire ma taką cechę, że pomiędzy poszczególnymi bitami ( nadawanymi czy odbieranymi )  może być czas dowolnie długi, co do Resetu to też nie jest tak, że musi być dokładnie 480 us - krytyczny jest tylko ten czas oczekiwania na &quot;presence&quot; po zmianie stanu magistrali na High tu wystarczy cli  () na środek tego czasu, czyli na 60us. Kiedyś robiłem taką sztukę, że musiałem obsługiwać dość krytyczne czasowo przerwania - nie mogłem sobie pozwolić nawet na te ok 60us delay-a, ale one występowały rzadko ( co kilka ms ), więc kolejne bajty 1Wire odbierałem dopiero po zakończeniu obsługi tego krytycznego przerwania.<br />Trochę to chaotycznie wyszło, nie wiem czy coś z tego ktoś zrozumiał <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":-(" title="Smutny" />.<br /><br />Pozdrawiam, QuadMan.<br /><br />P.S. W AVR- ach i tak nie masz priorytetów przerwań, więc nawet rozwiązanie z &quot;licznikiem programowym&quot; nie będzie działało pewnie - no chyba, że obsługa tych  istotnych  przerwań jest przynajmniej nieco krótsza niż minimalny dopuszczalny błąd pomiaru czasu tym &quot;licznikiem programowym&quot;.<br /><br />Pozdrawiam serdecznie, QuadMan.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5291">QuadMan</a> — 5 lut 2015, o 01:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xpower]]></name></author>
<updated>2015-02-05T00:10:16+01:00</updated>
<published>2015-02-05T00:10:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117289#p117289</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117289#p117289"/>
<title type="html"><![CDATA[Re: Nieblokująca obsługa DS18B20 z CRC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117289#p117289"><![CDATA[
Ehhh no tak, zapomniałem wspomnieć, że kod zacząłem testować na AVR'ku bo to mam pod ręką ale docelowe urządzenie oparte jest o zdecydowanie mocniejszą jednostkę, która raczej z takimi rzeczami nie będzie miała problemów.<br />Poza tym oryginalny kod, po zmianie typów zmiennych na bardziej przyjazne dla AVR, działa dobrze.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=607">xpower</a> — 5 lut 2015, o 00:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-02-04T23:57:44+01:00</updated>
<published>2015-02-04T23:57:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117288#p117288</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117288#p117288"/>
<title type="html"><![CDATA[Re: Nieblokująca obsługa DS18B20 z CRC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117288#p117288"><![CDATA[
Zmienna <em>opoznienie</em> jako zmieniana w przerwaniu powinna być volatile, a skoro jest 2 bajtowa, a procesor 8-bitowy to może się zdarzyć, że podczas, gdy jeden bajt jest sprawdzany to drugi się zmieni. Operacje na tej zmiennej w pętli głównej programu należy umieścić pomiędzy <a href="http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html"  class="postlink">ATOMIC_BLOCK(ATOMIC_FORCEON)</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 4 lut 2015, o 23:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xpower]]></name></author>
<updated>2015-02-04T23:51:47+01:00</updated>
<published>2015-02-04T23:51:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117287#p117287</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117287#p117287"/>
<title type="html"><![CDATA[Re: Nieblokująca obsługa DS18B20 z CRC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117287#p117287"><![CDATA[
Niestety, zasoby są mocno ograniczone, wszystko siedzi już na płytce drukowanej, nie ma możliwości zmian hardware'owych, a przynajmniej nie takich.<br /><br />Dokładnie, wszystkie biblioteki jakie widziałem opierają się na delay'ach, o których tu nie może być mowy. Według datasheeta, sama operacja resetu to już w tym wypadku prawie czas 4 przerwań.<br />W przerwaniu wykonywane są też inne funkcje i prawdopodobnie to powoduje błędy - jakieś minimalne rozjazdy czasowe, przez które 1wire głupieje. Pomiar temp. nie jest priorytetem, temp musi być poprawna ale uaktualnienie może następować co np. 2-5 sekund.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=607">xpower</a> — 4 lut 2015, o 23:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xpower]]></name></author>
<updated>2015-02-04T23:18:01+01:00</updated>
<published>2015-02-04T23:18:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117280#p117280</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117280#p117280"/>
<title type="html"><![CDATA[Nieblokująca obsługa DS18B20 z CRC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10508&amp;p=117280#p117280"><![CDATA[
Witam.<br /><br />Musze przerobić obsługę czujnika DS18B20 w taki sposób, aby zamiast 2 pierwszych bajtów z temp., otrzymywać pełen scratchpad oraz na jego bazie obliczać CRC. Wszystko byłoby fajnie... gdyby nie to, że obsługa czujnika musi być nieblokująca.  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br />Oryginalny kod opiera się na wysyłaniu komend w formie 16-to bitowych instrukcji i w 90% działa (w 90% dlatego bo zdarzają się momenty, kiedy wartość temp skacze do losowej liczby np. 120, 300, itd. a za chwilę wszystko znowu jest ok). <br />Stąd pomysł na crc i obsługę w stylu &quot;gdy pomiar się zgadza, przesyłam wartości temperatury do dalszej obróbki&quot;.<br />Swój kod chciałem oprzeć o oryginalny mechanizm działania, ale z instrukcjami 8-mio bitowymi. Czemu - chciałem zliczać tylko 8 bitów zarówno przy wysyłaniu jak i odbiorze, w tym drugim przypadku chyba szybciej upchnąłbym 9 bajtów w tablice, a później wywołał funkcję od CRC. <br />Stworzyłem kod zawarty poniżej... ale mówiąc krótko... nie działa i nie wiem dlaczego.<br /><br />Co robię źle, ew. w jaki inny sposób się za to zabrać ?<br /><br />PS. kod  wersji mocno roboczej, komentarze mogą się nie zgadzać.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;uart.h&quot;<br />#include &quot;MK_TERMINAL/mk_term.h&quot;<br /><br />#define OW_PIN  PC4<br />#define OW_IN   PINC<br />#define OW_OUT  PORTC<br />#define OW_DDR  DDRC<br /><br />#define ONEWIRE_DIR_OUT  ( OW_DDR |= (1 &lt;&lt; OW_PIN) )<br />#defineONEWIRE_SET( OW_OUT |= (1&lt;&lt;OW_PIN) )<br />#define ONEWIRE_CLR( OW_OUT &amp;= ~(1&lt;&lt;OW_PIN) )<br /><br />#define ONEWIRE_DIR_IN   ( OW_DDR &amp;= (~(1 &lt;&lt; OW_PIN )) )<br />#defineONEWIRE_READ( OW_IN &amp; (1&lt;&lt;OW_PIN))<br /><br /><br />volatile uint16_t Timer1, Timer2;<br />uint8_t czujniki_cnt, subzero, cel, cel_fract_bits;//zmienne do obsługi komendy pomiaru z czujników<br />uint8_t temp, test_crc, error;//zmienne pomocnicze<br />uint32_t temp2;<br /><br />uint16_t opoznienie;<br />uint8_t cykl, licz, cykl_parzysty = 0;<br />uint16_t dane, temperatura;<br />uint16_t i;<br />uint8_t tablica&#91;9&#93;;//tablica scratchpad<br />uint8_t licznik = 0;<br /><br />void obsluga_oneWire_1(void);<br />void obsluga_oneWire_2(void);<br />void obsluga_oneWire_3(void);<br /><br />//==================================================================<br />//TABLICA Z WARTOŚCIAMI CRC<br />//==================================================================<br />const uint8_t crc8_table&#91;256&#93; = {<br />    0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,<br />  157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,<br />   35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,<br />  190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,<br />   70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89,  7,<br />  219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,<br />  101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,<br />  248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,<br />  140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,<br />   17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,<br />  175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,<br />   50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,<br />  202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,<br />   87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,<br />  233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,<br />  116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53<br />};<br /><br /><br />//==================================================================<br />//FUNKCJA MAIN<br />//==================================================================<br />int main(void)<br />{<br /><br />/** USTAWIENIA TIMERA SPRZĘTOWEGO **/<br /><br />TCCR0 |= (1&lt;&lt;WGM01);            // tryb CTC<br />TCCR0 |= (1&lt;&lt;CS01);       // preskaler = 8<br />OCR0 = 250;                     // dodatkowy podział przez 250 (rej. przepełnienia) 8kHz, 125us<br />TIMSK |= (1&lt;&lt;OCIE0);            // zezwolenie na przerwanie CompareMatch<br /><br /><br />uart_init(__UBRR);//init uart i ustawienie prędkosci<br /><br />_delay_ms(500);<br />tr_cls(0);<br />tr_cls(1);<br />//tr_cursor_hide(1);<br />tr_locate(0,10);<br />tr_attr(1,YELLOW,BLACK);<br />uart_sends(&quot;..:: TEST DS18B20 i OBLICZANIA CRC ::..&quot;);<br /><br />sei();//odblokowanie przerwań<br />while(1)<br />{<br /><br />// wyświetlanie wartości w terminalu<br />tr_locate(2,10);<br />tr_attr(1,YELLOW,BLACK);<br />uart_sends(&quot;Temp0: &quot;);<br />uart_putint(tablica&#91;0&#93;,10);<br />uart_sends(&quot;\u00B0C&quot;);<br /><br />tr_locate(3,10);<br /><br />tr_attr(1,YELLOW,BLACK);<br />uart_sends(&quot;Temp1: &quot;);<br />uart_putint(tablica&#91;1&#93;,10);<br />uart_sends(&quot;\u00B0C&quot;);<br /><br />temperatura = ( tablica&#91;0&#93; + (tablica&#91;1&#93; &gt;&gt; 8 ) ) / 16;<br />tr_locate(4,10);<br />uart_putint(temperatura, 10);<br />uart_sends(&quot;   &quot;);<br />}<br />}<br /><br />ISR( TIMER0_COMP_vect )//przerwanie od timera0<br />{<br /><br />i = opoznienie;<br />if (i) opoznienie = --i;<br /><br />obsluga_oneWire_1();<br />obsluga_oneWire_2();<br />obsluga_oneWire_3();<br />}<br /><br /><br />//==================================================================<br />//FUNKCJA REALIZUJĄCA ALGORYTM SPRAWDZANIA CRC<br />//==================================================================<br />unsigned char get_crc(unsigned char *data, unsigned char count)<br />{<br />    unsigned char result=0;<br /><br />    while(count--)<br />    {<br />      result = crc8_table&#91;result ^ *data++&#93;;<br />    }<br /><br />    return result;<br />}<br /><br /><br />//==================================================================<br />//FUNKCJE NIEBLOKUJĄCE OBSŁUGUJĄCE 1WIRE<br />//==================================================================<br />// obsluga_oneWire została podzielona na 3 fragmenty wywoływane w różnych momentach timer_interrupt<br />void obsluga_oneWire_1(void)// wywoływane na początku przerwania; co 125us; daje to czas trwania bitu = 250us<br />{<br /><br />if (++cykl_parzysty &amp; 1)<br />{<br />if ((cykl==2) || (cykl==5) )<br />{<br />ONEWIRE_DIR_OUT;<br />ONEWIRE_SET;// jezeli jeden z warunków spełniony, koniec trwania bitu<br />}<br />return;<br />}<br /><br />switch (cykl)<br />{<br />case(0):// początek reset<br />{<br />if (!opoznienie) // czy minęło 500us czas trwania przerwy przed kolejnym resetem<br />{<br />ONEWIRE_DIR_OUT;<br />ONEWIRE_CLR;<br />opoznienie = 1880;// czas trwania reset; 250ms<br />cykl=1;<br />}<br />} break;<br />// trwa reset<br />case(1):// koniec reset<br />{<br />if (!opoznienie) // czy minęło 250ms - czas trwania reset<br />{<br />ONEWIRE_DIR_OUT;<br />ONEWIRE_SET;<br />opoznienie = 4;// 500us czas trwania przerwy; w tym czasie po 32us DS18B20 wystawia impuls PRESENCE na 120us<br />cykl = 2;<br />licz = 0;<br />dane = 0xCC;//w wersji oryginalnej występuje tu komenda 0x44CC, <br />}<br />} break;<br /><br /><br />case(2):<br />{<br />if (!opoznienie) // czy minęło 250ms - czas trwania reset<br />{<br />if(licz &lt; 8)<br />{<br />ONEWIRE_DIR_OUT;<br />    ONEWIRE_CLR;// początek nadawania bitu<br />}<br />else<br />{<br />cykl = 3;<br />licznik = 0;<br />dane = 0x44;//kolejna komenda do wysłania, w wersji oryginalnej tego nie ma<br />opoznienie = 4;// w oryginale 6000, co przy przerwaniu 125 us daje 750ms czasu oczekiwania na pomiar<br />}<br />}<br />}<br />break;<br /><br />// przerwa po reset<br />case(3):// wysyłanie rozkazów<br />{<br />if (!opoznienie) // czy minęło 500us czas trwania przerwy<br />{<br />    if(licznik &lt; 8)<br />    {<br />    ONEWIRE_DIR_OUT;<br />        ONEWIRE_CLR;// początek nadawania bitu<br />    }<br />    else// wysłane wszystkie 16 bitów<br />    {<br />    cykl = 4;<br />    licznik = 0;<br />    opoznienie = 6000;// 750ms czas trwania pomiaru temperatury; to jest tez czas zgaszenia LED STATUS<br />    }<br />}<br />} break;<br />// trwa pomiar temperatury<br />case(4):<br />{<br />if (!opoznienie) // czy minęło 750ms czas trwania pomiaru temperatury<br />{// początek reset<br />ONEWIRE_DIR_OUT;<br />ONEWIRE_CLR;<br />opoznienie = 4;// 500us czas trwania reset<br />cykl=5;<br />}<br />} break;<br />// trwa reset<br />case(5):// koniec reset<br />{<br />if (!opoznienie) // czy minęło 500us - czas trwania reset<br />{<br />ONEWIRE_DIR_OUT;<br />ONEWIRE_SET;<br />opoznienie = 4;// 500us czas trwania przerwy<br />cykl = 6;<br />licznik = 0;<br />dane = 0xCC;// CC:Skip ROM, address all devices; BE:Read scratchpad<br />}<br />} break;<br />// przerwa po reset<br /><br />case(6):// wysyłanie rozkazów<br />{<br />if (!opoznienie) // czy minęło 500us czas trwania przerwy<br />{<br />    if(licznik &lt; 8)<br />    {<br />    ONEWIRE_DIR_OUT;<br />        ONEWIRE_CLR;// początek nadawania bitu<br />    }<br />    else// wysłane wszystkie 16 bitów<br />    {<br />    cykl = 7;<br />    licznik = 0;<br />    dane = 0xBE;<br />    opoznienie = 4;// 500us czas trwania przerwy przed odczytaniem danych; nadmiarowe<br />    }<br />}<br />} break;<br /><br />case(7):// wysyłanie rozkazów<br />{<br />if (!opoznienie) // czy minęło 500us czas trwania przerwy<br />{<br />if(licznik &lt; 8)<br />    {<br />    ONEWIRE_DIR_OUT;<br />        ONEWIRE_CLR;// początek nadawania bitu<br />    }<br />    else// wysłane wszystkie 16 bitów<br />    {<br />    cykl = 8;<br />    licznik = 0;<br />    opoznienie = 4;// 500us czas trwania przerwy przed odczytaniem danych; nadmiarowe<br />    dane = 0;// teraz tu będę odbierał dane<br />    }<br />}<br />} break;<br /><br /><br />case(8):// odczytanie temperatury<br />{<br />if ((!opoznienie) &amp;&amp; // czy minęło 500us czas trwania przerwy przed odczytaniem danych; nadmiarowe<br />(licznik &lt; 8) )<br />{<br />ONEWIRE_DIR_OUT;<br />ONEWIRE_CLR;// początek odbierania bitu<br />}<br /><br />} break;<br /><br />}// switch<br /><br />}<br /><br /><br /><br /><br /><br />void obsluga_oneWire_2(void)// wywoływane po około 2us po obsluga_oneWire_1()<br />{<br /><br />if (cykl_parzysty &amp; 1) return;<br /><br />if ( ( (cykl==2) || (cykl==3) || (cykl==6) || (cykl==7) ) &amp;&amp;// wysyłanie rozkazów<br />// @2: CC:Skip ROM, address all devices; 44:Start temperature conversion<br />// @5: CC:Skip ROM, address all devices; BE:Read scratchpad<br />(!opoznienie) &amp;&amp;// czy minęło 500us czas trwania przerwy<br />(licznik &lt; 8))// czy wszystkie bity<br />{<br />if (dane &amp; 1)<br />{<br />ONEWIRE_DIR_OUT;<br />ONEWIRE_SET;// wysyłaj bit=1<br />}<br /><br />dane &gt;&gt;=1;<br />licznik++;<br /><br />}<br /><br />else if ((cykl==8) &amp;&amp; (!opoznienie)  &amp;&amp; (licznik &lt; 8))<br />{<br />ONEWIRE_DIR_OUT;<br />ONEWIRE_SET;// początek odbierania bitu - pozwalam aby DS18B20 nadawał<br />}<br /><br />}<br /><br /><br /><br />void obsluga_oneWire_3(void)// wywoływane po około 11us po obsluga_oneWire_2()<br />{<br /><br />if (cykl_parzysty &amp; 1) return;<br /><br />if ((cykl==8) &amp;&amp; (!opoznienie)) // czy minęło 500us czas trwania przerwy<br />{<br />if(licznik &gt; 8)<br />{<br />ONEWIRE_DIR_IN;<br />    tablica&#91;1&#93; &gt;&gt;= 1;<br />if (ONEWIRE_READ) tablica&#91;1&#93; |= 0x80;<br />    licznik++;<br />}<br /><br />if(licznik &lt; 8)<br />{<br />ONEWIRE_DIR_IN;<br />tablica&#91;0&#93; &gt;&gt;= 1;<br />if (ONEWIRE_READ) tablica&#91;0&#93; |= 0x80;<br />    licznik++;<br />}<br />    else // odebrane wszystkie bityw<br />    {<br />    cykl = 0;<br />    licz = 0;<br />    opoznienie = 4;// 500us czas trwania przerwy przed kolejnym resetem<br />    }<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=607">xpower</a> — 4 lut 2015, o 23:18</p><hr />
]]></content>
</entry>
</feed>