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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-10-26T13:54:57+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1708&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-26T13:54:57+01:00</updated>
<published>2012-10-26T13:54:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17692#p17692</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17692#p17692"/>
<title type="html"><![CDATA[Re: [m8] Jak zgrać z sobą przerwania od uarta i zwykle z tim]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17692#p17692"><![CDATA[
Więc jak zrobisz w oparciu o to co w książce - korzystając z tych bibliotek - to potem śmiało wklej w razie czego swój plik main.c gdybyś jeszcze miał kłopoty jakieś i szybko wspólnie pomożemy ich się pozbyć <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=54">mirekk36</a> — 26 paź 2012, o 13:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[orideith]]></name></author>
<updated>2012-10-26T11:55:39+01:00</updated>
<published>2012-10-26T11:55:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17691#p17691</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17691#p17691"/>
<title type="html"><![CDATA[Re: [m8] Jak zgrać z sobą przerwania od uarta i zwykle z tim]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17691#p17691"><![CDATA[
Ok, wrócę do twojego rozwiązania z DS`em (biblioteka) i spróbuję darować sobie bufor cykliczny, dam go do odbierania danych ale to jak to będzie działało poprawnie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=615">orideith</a> — 26 paź 2012, o 11:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-26T11:27:33+01:00</updated>
<published>2012-10-26T11:27:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17690#p17690</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17690#p17690"/>
<title type="html"><![CDATA[Re: [m8] Jak zgrać z sobą przerwania od uarta i zwykle z tim]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17690#p17690"><![CDATA[
<div class="quotetitle">orideith napisał(a):</div><div class="quotecontent"><br />Mirek, źle mnie zrozumiałeś, tam zakomentowane jest przerwanie, bo z nim nie działało,<br /></div><br /><br />Widziałem że jest zakomentowane ale to kolejny twój błąd - a to z tego powodu że nie do końca zrozumiałeś na jakiej zasadzie wysyła się dane przez UART <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .... no zobacz - potem w timerze masz:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">UDR = UART_TxBuf&#91;UART_TxTail&#93;;</div><br /><br />to jest straszny ZONK <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />bufor cykliczny przygotowany jest SPECJALNIE, podkreślam SPECJALNIE do współpracy z przerwaniami - naprawdę MUSISZ jeszcze raz o nim przeczytać rozdział, a ty sobie niefrasobliwie - bo coś tam nie działało - na zasadzie &quot;a może się uda&quot; przeniosłeś kod z przerwania UART'a do przerwania Timera - w takim wykonaniu BĘDZIE SIĘ TO GRYZŁO niestety <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br /><br /><div class="quotetitle">orideith napisał(a):</div><div class="quotecontent"><br />bibliotekę sprawdzę (ds), tą wcześniej używałem dlatego dałem.<br /></div><br /><br />A ok, no rozumiem ... ale polecam ci jednak tą z książki, tylko nie myśl że chodzi mi tu o propagowanie mojej biblioteki bo jest najlepsza na świecie - tak nawiasem mówiąc to nie moja biblioteka i podaję w książce autora, ja ją tylko co nieco zmodyfikowałem.<br /><br /><br /><div class="quotetitle">orideith napisał(a):</div><div class="quotecontent"><br />Z jednej strony z tym wysyłaniem naraz masz racje, ale danych będzie więcej. I przyznam się szczerze, że nie wiem  jak policzyć czy się zmieszczę,<br /></div><br />Jeśli chodzi o wysyłanie z poziomu pętli głównej to nie musisz nic liczyć - WSZYSTKO zmieścisz<br /><br /><div class="quotetitle">orideith napisał(a):</div><div class="quotecontent"><br />Dane będą miały format mniej więcej<br />temperatura (liczba czujników 1 do 20) wilgotność (1-5) (inne parametry sztuk 5-10) i to za jednym ciągiem wysyłane, w jakim czasie je powinienem wysyłać?, kiedy tak naprawdę zabraknie mi czasu przy wysyłaniu bez bufora, prędkość mam 9600 ale i 115200 działa ok bo mam 14745600 kwarc więc mogę więcej wyciągnąć.<br /></div><br /><br />Ty się nie martw na zapas <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo ja myślę że przy 9600 się zmieścisz a przy 115200 to zapomnij nawet o tym żeby się w najmniejszym stopniu martwić o to czy zdążysz ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... raczej musiałbyś się starać o to aby zapchać taką transmisję <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">orideith napisał(a):</div><div class="quotecontent"><br />Czy te wszystkie dane pakować do jednej zmiennej dać w pętli uart_putc czy inaczej się to rozwiązuje?, chciałbym to w jednej linii dać bo jedna paczka to jeden rekord w bazie danych <br />Pozdrawiam i dzięki za poprzednie odpowiedzi<br /></div><br /><br />ZDECYDOWANIE można w jednej paczce - w jednej linii. Zwracaj tylko uwagę na rozmiary tej wypychanej linii względem wielkości buforów cyklicznych (nadawczych)<br /><br />reasumując - wszystko ci się uda - tylko najpierw do testów - próbuj zrobić porządek na mniejszym kodzie testowym z wysyłaniem mniejszej ilości ale POPRAWNIE a nie w taki sposób OK ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 26 paź 2012, o 11:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[orideith]]></name></author>
<updated>2012-10-26T11:13:24+01:00</updated>
<published>2012-10-26T11:13:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17689#p17689</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17689#p17689"/>
<title type="html"><![CDATA[Re: [m8] Jak zgrać z sobą przerwania od uarta i zwykle z tim]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17689#p17689"><![CDATA[
Mirek, źle mnie zrozumiałeś, tam zakomentowane jest przerwanie, bo z nim nie działało, bibliotekę sprawdzę (ds), tą wcześniej używałem dlatego dałem.<br />Z jednej strony z tym wysyłaniem naraz masz racje, ale danych będzie więcej. I przyznam się szczerze, że nie wiem  jak policzyć czy się zmieszczę, <br />Dane będą miały format mniej więcej<br />temperatura (liczba czujników 1 do 20) wilgotność (1-5) (inne parametry sztuk 5-10) i to za jednym ciągiem wysyłane, w jakim czasie je powinienem wysyłać?, kiedy tak naprawdę zabraknie mi czasu przy wysyłaniu bez bufora, prędkość mam 9600 ale i 115200 działa ok bo mam 14745600 kwarc więc mogę więcej wyciągnąć.<br />Czy te wszystkie dane pakować do jednej zmiennej dać w pętli uart_putc czy inaczej się to rozwiązuje?, chciałbym to w jednej linii dać bo jedna paczka to jeden rekord w bazie danych <br />Pozdrawiam i dzięki za poprzednie odpowiedzi<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=615">orideith</a> — 26 paź 2012, o 11:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-26T10:28:29+01:00</updated>
<published>2012-10-26T10:28:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17687#p17687</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17687#p17687"/>
<title type="html"><![CDATA[Re: [m8] Jak zgrać z sobą przerwania od uarta i zwykle z tim]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17687#p17687"><![CDATA[
To co pisze kolega wyżej to JEDNO <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .... (to co zrobiłeś w tym przerwaniu timera2 to po prostu totalne nieporozumienie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />I jak można po takim kodzie pisać że timer2 gryzie się z UART'em ? One się nie gryzą - wcale - to ty je podpuściłeś na siebie i jeden blokuje drugiego ..... TAK nie można <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br /><br />masz w książce przykład jak wysyłać dane zarówno w wersji z buforem jak i bez. Ja dodam od siebie, że akurat samo wysyłanie przez UART jest tak mało krytyczne, że najspokojniej w świecie można je zrobić nawet bez buforów cyklicznych - ot tak wprost w poolingu i z pętli głównej po pomiarze<br /><br />Za to już całkowitą moją konsternację budzi fakt, że masz w książce tzn na DVD świetne biblioteki do 1wire, i to już z crc, tymczasem ty używasz innych .... które .... hmmm teraz nie będę ich analizował ale po prostu mogą mieć jeszcze błędy - skoro z marszu nie było wszczepionego crc.<br /><br />Skąd takie pomysły ?<br /><br />Wystarczyłoby użyć dokładnie tego przykładu który jest w książce i dodać bibliotekę UART do niego i po każdym pomiarze w pętli głównej (dokonywanym przy pomocy timerów programowych) od razu wysyłać dane do terminala, NAWET w tej funkcji, która wyświetla wyniki ....<br /><br />wtedy BEZ ŻADNYCH kombinacji miałbyś zrealizowane WSZYSTKO co zamierzałeś .... oczywiście wiadomo, że warto ten projekt z DVD pozmieniać nieco i dostosować do własnych potrzeb (mówię tu o main.c)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 26 paź 2012, o 10:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Malutki_27]]></name></author>
<updated>2012-10-26T10:14:07+01:00</updated>
<published>2012-10-26T10:14:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17686#p17686</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17686#p17686"/>
<title type="html"><![CDATA[Re: [m8] Jak zgrać z sobą przerwania od uarta i zwykle z tim]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17686#p17686"><![CDATA[
Jest i będzie opóźnienie .......... zobacz co żeś uczynił w przerwaniu ........ Wysyłasz tam dane <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> stąd te opóźnienia.<br />Przenieś wysyłanie do pętli głównej ..........<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=225">Malutki_27</a> — 26 paź 2012, o 10:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[orideith]]></name></author>
<updated>2012-10-26T09:57:49+01:00</updated>
<published>2012-10-26T09:57:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17685#p17685</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17685#p17685"/>
<title type="html"><![CDATA[[m8] Jak zgrać z sobą przerwania od uarta i zwykle z timera]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1708&amp;p=17685#p17685"><![CDATA[
Witam Was, zrobiłem sobie czysto testowo kod, który wyświetla temperaturę na LCD oraz wysyła ją do komputera.<br />Pomysły rozwojowe były trzy. <br />1. wszystko w pętli + delay i to działa, wiem że nie zalecane ale działa, czyli odczyt temperatury oraz wysyłanie danych za pomocą podstawowej funkcji na wysyłanie danych  z dokumentacji<br />2. wywalenie delaya dodanie timera oraz timera programowego takiego jak stosowany do odczytu temperatury w książce <br />3. to co powyżej tylko dodanie przerwania na wysyłanie danych z uarta oraz dodanie bufora cyklicznego.<br />Problem polega na tym, że timer2 (chyba) atmegi8 kłóci się z przerwaniem od uarta. Nie wiem jak ale odczyt temperatury zamiera i jest pokazywana ta sama temperatura. <br />Program nie zawiesza się, ale jest jak by opóźnienie przy wysyłaniu danych w pętli głównej.<br />Kod teraz wygląda tak<br />[syntax=c]<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/iom8.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;uart.h&quot;<br />#include &quot;HD44780.h&quot;<br />#include &quot;ds18b20.h&quot;<br />#include &quot;1WireLib.h&quot;<br />#include &quot;konwersja_temp.h&quot;<br />int16_t temp_ds[] = { 0, 1 };<br />char *temp2;<br />unsigned char temp[4];<br />volatile uint16_t Timer1, Timer2;<br />volatile uint8_t s1_flag, sekundy;<br />// 14745600<br />void Timer2_Init(void);<br />void USART_Transmit(unsigned int data);<br />union int16_t_LSB_MSB {<br />struct {<br />uint8_t LSB;<br />uint8_t MSB;<br />};<br /><br />int16_t XSB;<br />};<br />union int16_t_LSB_MSB Temperature;<br /><br />int main(void) {<br />LCD_Initalize();<br />USART_Init(9600, 0);<br />Timer2_Init();<br />sei();<br />while (1) {<br /><br />if (s1_flag) {<br />LCD_GoTo(0, 0);<br />if ((sekundy % 3) == 0) {<br /><br /><br />initConversion(1);<br />}<br />if ((sekundy % 3) == 1) {<br /><br />//LCD_WriteText(&quot;1&quot;);<br />readTemp(temp, 1);<br />Temperature.LSB = temp[0];<br />Temperature.MSB = temp[1];<br />temp_ds[1] = Temperature.XSB;<br />temp2 = Display_Temperature(temp_ds[1]);<br />}<br />if ((sekundy % 3) == 2) {<br />while (*temp2) {<br />uart_putc(*temp2++);<br />}<br />uart_putc('\n');<br />uart_putc('\r');<br />}<br /><br />s1_flag = 0;<br />LCD_GoTo(0, 0);<br /><br />LCD_WriteText(temp2);<br /><br />}<br /><br /><br /><br />}<br /><br />}<br /><br /><br />void Timer2_Init(void) {<br />TCCR2 |= (1 &lt;&lt; WGM21); // tryb CTC<br />TCCR2 |= (1 &lt;&lt; CS20) | (1 &lt;&lt; CS21) | (1 &lt;&lt; CS22); // Preskaler 1024<br />OCR2 = 144; // Przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1 &lt;&lt; OCIE2); // Odblokowanie przerwania CompareMatch<br />}<br /><br />/*<br /> ISR(USART_UDRE_vect) {<br /> if (UART_TxHead != UART_TxTail) {<br /> UART_TxTail = (UART_TxTail + 1) &amp; UART_TX_BUF_MASK;<br /> UDR = UART_TxBuf[UART_TxTail];<br /> } else {<br /> UCSRB &amp;= ~(UDRIE);<br /> }<br /><br /> }<br /> */ISR(TIMER2_COMP_vect) {<br />static uint8_t cnt = 0;<br /><br />if (++cnt &gt; 99) { // 100ms * 99 = 999ms = 1s<br />s1_flag = 1;<br />sekundy++;<br />if (sekundy &gt; 59)<br />sekundy = 0;<br />cnt = 0;<br /><br />}<br /><br />if (uart_przerwanie == 1) {<br />if (UART_TxHead != UART_TxTail) {<br />UART_TxTail = (UART_TxTail + 1) &amp; UART_TX_BUF_MASK;<br />UDR = UART_TxBuf[UART_TxTail];<br />} else {<br />//UCSRB &amp;= ~(UDRIE);<br />}<br />uart_przerwanie = 0;<br />}<br /><br />uint16_t x;<br />x = Timer1; // 100Hz Timer1<br />if (x)<br />Timer1 = --x;<br />x = Timer2; // 100Hz Timer2<br />if (x)<br />Timer2 = --x;<br />}<br /><br />[/syntax]<br /><br />kod na uart tak<br />[syntax=c]<br />#include &quot;uart.h&quot;<br />#include &lt;avr/iom8.h&gt;<br />void uart_putc(char data) {<br />uint8_t tmp_head;<br />tmp_head = (UART_TxHead + 1) &amp; UART_TX_BUF_MASK;<br />while (tmp_head == UART_TxTail) {}<br />UART_TxBuf[tmp_head] = data;<br />UART_TxHead = tmp_head;<br />//UCSRB |= (1 &lt;&lt; UDRIE);<br />uart_przerwanie = 1;<br /><br /><br />}<br /><br />void USART_Init(uint32_t baud, uint8_t speed) {<br />uint16_t _ubr;<br />if (speed == 1) {<br />UCSRA |= (1 &lt;&lt; U2X);<br />_ubr = (F_CPU / 8 / baud - 1);<br />} else {<br />_ubr = (F_CPU / 16 / baud - 1);<br />}<br />UBRRH = (unsigned char) (_ubr &gt;&gt; 8);<br />UBRRL = (unsigned char) _ubr;<br />/* Enable receiver and transmitter */<br />UCSRB = (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN);<br />/* Set frame format: 8data, 2stop bit */<br />UCSRC = (1 &lt;&lt; URSEL) | (1 &lt;&lt; USBS) | (3 &lt;&lt; UCSZ0);<br />}<br /><br />[/syntax]<br /><br />Zastosowałem zmienną uart_przerwanie która daje znać by dane zostały wysłane jeżeli coś się w buforze pojawi, nie wiem czy tak jest poprawnie ale inaczej nie chce działać. Pytanie czy dobrze robię, może coś pominąłem.<br />kod na odczyt temperatury<br /><br />[syntax=c]<br />//////////// BIBLIOTEKA OBS�UGI DS18B20///////////////<br />////////////////////////////////AUTOR:JAN G�RSKI//////<br />////////////////////////////////http://mathmed.blox.pl<br />#include &lt;avr/io.h&gt;<br />#include &quot;DS18B20.h&quot;<br />#include &quot;1WireLib.h&quot;<br />//////////////////////////////////////////////////////<br />void initConversion(unsigned char device) {<br />useDevice(device);<br />sendByte1Wire(CONVERT_T); <br />}<br /><br /><br />uint8_t CRC8_2(uint8_t *inData, uint8_t len)<br />{<br />   uint8_t crc;<br />   crc = 0;<br />   for(; len; len--)<br />   {<br />      crc ^= *inData++;<br />      crc ^= (crc &lt;&lt; 3) ^ (crc &lt;&lt; 4) ^ (crc &lt;&lt; 6);<br />      crc ^= (crc &gt;&gt; 4) ^ (crc &gt;&gt; 5);<br />   }<br />   return crc;<br />}<br /><br />//////////////////////////////////////////////////////<br />void readTemp(unsigned char* temp, unsigned char device) {<br />useDevice(device);<br />sendByte1Wire(READ_SCRATCHPAD); <br /><br />uint8_t t[ 9 ];<br />uint8_t crc = 0; <br /><br />temp[3] = 0;<br />for ( int8_t i = 0; i &lt; 9 ; ++i )<br />  {<br />    t[ i ] = readByte1Wire();<br />    <br />  }<br />  crc = CRC8_2(t, 9);<br />  if ( crc )<br />  {<br />    temp[3] = 1;<br />  } else {<br />    temp[0] = t[0];<br />    temp[1] = t[1];  <br />temp[3] = 2;<br />  }<br />}<br />//////////////////////////////////////////////////////<br /><br />[/syntax]<br /><br />[syntax=c]<br />//////////// BIBLIOTEKA OBS�UGI 1 WIRE////////////////<br />////////////////////////////////AUTOR:JAN G�RSKI//////<br />////////////////////////////////http://mathmed.blox.pl<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;1WireLib.h&quot;<br />//////////////////////////////////////////////////////<br />//RESET 1 Wire////////////////////////////////////////<br />unsigned char reset1Wire(void) {<br />unsigned char counter=12,tmp;<br />////<br />SET1WireOut;// DDRX jako wyjscie<br />PORT1WireOut&amp;=~(1&lt;&lt;N1Wire); // w stanie niskim<br />_delay_us(500); // przynajmniej na 480us, nastepnie<br />SET1WireIn;// DDRX jako wejscie (ext pullup)<br />PORT1WireOut|=(1&lt;&lt;N1Wire);// wewnetrzny pullup 20KOhm wlaczony (zeby przeladowac pin)<br />_delay_us(60);// czekaj 15 - 60 us<br />while(((PORT1WireIn&gt;&gt;N1Wire)&amp;1) &amp;&amp; (counter!=0)) {// sprawdzam, czy pomimo pullup'a  magistrala 0<br />counter--; // i licznik &gt;0<br />_delay_us(20);// masz 240 us<br />}<br />tmp = (PORT1WireIn&gt;&gt;N1Wire)&amp;1;<br />_delay_us(500);<br />return !tmp;<br />}<br />//////////////////////////////////////////////////////<br />//Sekwencja slotu/////////////////////////////////////<br />static void slotSequence() {<br />SET1WireIn;// ustaw jako wejscie (ext pullup)<br />_delay_us(2);// przerwa &gt;= 1us<br />SET1WireOut;// ustaw port jako wyjscie<br />PORT1WireOut&amp;=~(1&lt;&lt;N1Wire); // w stanie niskim<br />_delay_us(5);// poczekaj &lt;15us<br />}<br />//////////////////////////////////////////////////////<br />//Czyta bit///////////////////////////////////////////<br />void writeBit(unsigned char bit) {<br />slotSequence();<br />_delay_us(5);<br />if (bit) {// WYSYLAM logiczne 1<br />SET1WireIn;// zwalniam magistrale (ext pullup)<br />_delay_us(50);// odczekaj do konca okna transmisji<br />} else {// WYSYLAM logiczne 0<br />_delay_us(50);// odczekaj do konca okna transmisji<br />SET1WireIn;// zwalniam magistrale (ext pullup)<br />}<br />}<br />//Pisze bit///////////////////////////////////////////<br />char readBit() {<br />unsigned char counter=5,bit;// potrzebne do osiagniecia max czasu czekania<br />slotSequence();<br />SET1WireIn;// jako wejscie... <br />_delay_us(5);// czas na pullup<br />    while(((PORT1WireIn&gt;&gt;N1Wire)&amp;1) &amp;&amp; (counter!=0)) {<br />_delay_us(2);// czas na pullup<br />counter--;// pamietajmy, ze &quot;0&quot; jest stanem aktywnym<br />}<br />bit=(PORT1WireIn&gt;&gt;N1Wire)&amp;1;<br />_delay_us(50);      // czekanie na koniec okresu odczytywania <br />return(bit);<br />}<br />///////////////////////////////////////////////////////<br />//Wysylanie Bajtu &quot;data&quot;///////////////////////////////<br />void sendByte1Wire(unsigned char data) {<br />unsigned char bit;<br />for(int i=0;i&lt;8;i++) {// dla kolejnych bitow<br />bit=data&amp;(1&lt;&lt;i);<br />writeBit(bit);<br />}<br />}<br />//Odczytanie bajtu &quot;data&quot;/////////////////////////////<br />unsigned char readByte1Wire() {<br />unsigned char data=0,bit;<br />for(int i=0;i&lt;8;i++) {// dla kolejnych bitow<br />bit = readBit();<br />data|=((bit)&lt;&lt;i);// ustawienie odebranego bitu<br />}<br />return data;<br />}<br />///////////////////////////////////////////////////////<br />//Szuka urzadzen 1Wire i uaktywnia N-te urzadzenie/////<br />unsigned char useDevice(unsigned char useIt) {<br />unsigned char bit,bit_complementary,pozycja,buffer[useIt+1];<br /><br />for(unsigned char i=0;i&lt;useIt+1;i++) {<br />buffer[i]=0;<br />}<br />for(unsigned char i=0;i&lt;useIt;i++) {<br />pozycja=0;<br />if(~reset1Wire()&amp;1) return 0;<br />sendByte1Wire(SEARCH_ROM);<br />for(unsigned char bitNo=0;bitNo&lt;64;bitNo++) {<br />bit=readBit();<br />bit_complementary=readBit();<br />if ((~(bit|bit_complementary))&amp;1) { <br />if(buffer[pozycja+1]==0) {<br />buffer[pozycja]++;<br />}<br />writeBit((buffer[pozycja]-1));<br />pozycja++;<br />} else {<br />writeBit(bit);<br />} <br />}<br />while(buffer[pozycja-1]==2) {<br />buffer[pozycja]=0;<br />pozycja--;<br />}<br />}<br />return 1;<br />}<br />//////////////////////////////////////////////////////<br />[/syntax]<br /><br />Kod nie zmieniony praktycznie z oryginału, dodałem tylko co CRC<br /><br />Pozdrawiam sedecznie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=615">orideith</a> — 26 paź 2012, o 09:57</p><hr />
]]></content>
</entry>
</feed>