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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-10-24T16:35:43+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16598&amp;mode</id>
<entry>
<author><name><![CDATA[Situs]]></name></author>
<updated>2016-10-24T15:57:36+01:00</updated>
<published>2016-10-24T15:57:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172666#p172666</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172666#p172666"/>
<title type="html"><![CDATA[Re: Search ROM - One Wire]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172666#p172666"><![CDATA[
zaomniałeś [/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14339">Situs</a> — 24 paź 2016, o 15:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jatsekku]]></name></author>
<updated>2016-10-24T16:35:43+01:00</updated>
<published>2016-10-23T20:27:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172584#p172584</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172584#p172584"/>
<title type="html"><![CDATA[Re: Search ROM - One Wire]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172584#p172584"><![CDATA[
To chyba jednak nie to :/<br /><br />Po kilku testach okazało się, że nie działa fragment który odczytuje kolejny adres slave, dokładniej ten fragment:<br />[syntax=c]if(ONE_WIRE_device_rom&#91;((ONE_WIRE_rom_idx - 1) * 8) + ONE_WIRE_byte_idx&#93; &amp; ONE_WIRE_bit_idx) ONE_WIRE_rom_bit = 0;<br />else ONE_WIRE_rom_bit = 1;[/syntax]<br /><br /><br />W takim wypadku, adresy powtarzają się co 2 wywołanie, nie wiem za bardzo jak to rozwiązać w tej chwili :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3920">Jatsekku</a> — 23 paź 2016, o 20:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jatsekku]]></name></author>
<updated>2016-10-23T19:11:35+01:00</updated>
<published>2016-10-23T19:11:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172573#p172573</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172573#p172573"/>
<title type="html"><![CDATA[Re: Search ROM - One Wire]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172573#p172573"><![CDATA[
@Situs, atmega16 + LCD HD44780, zmontowane na płytce stykowej, testowane przy użyciu analizatora stanów logicznych na termometrach DS18b20. Jestem niemal pewny, że ze stroną sprzętową wszystko jest w porządku.<br /><br />@janusz17<br />Przez pisanie wszystkiego samemu rozwijam swoją wiedzę.<br />Mam pełną wiedzę na temat tego co się dzieje w chwili wywołania danej funkcji.<br />Mam niemalże pełną kontrolę nad tym co będzie wykonywane i w jaki sposób.<br />Utrzymuje zgodność z innymi swoimi bibliotekami pod kątem standaryzacji nazewnictwa, komentowania oraz kompilacji selektywnej (warunkowej) wybranych bloków funkcyjnych. <br />Z tychże powodów uważam, że ma to sens i warto robić to po swojemu, nawet jeżeli początkowo biblioteki takie nie będą tak dobrze zoptymalizowane jak te wykonane przez kogoś innego.<br />Nie jestem za stosowaniem gotowców na dłuższą metę, choć zawsze stanowią one dobry punkt odniesienia dlatego też dziękuję za podane tutaj przykłady <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Może jeszcze coś napiszę, co powinno ułatwić analizę problemu:<br />Elementy funkcji odpowiedzialne za odczyt pojedynczego adresu urządzenia slave działają dobrze, więc do momentu przepisania zawartości do tablicy ONE_WIRE_rom_tmp wszystko jest ok (w tym przykładzie działa to tylko dla dwóch urządzeń, ale to tymczasowo dla uproszczenia analizy). Po przepisaniu danych do wcześniej wspomnianej tablicy następuje sprawdzenie czy jakikolwiek bajt tablicy &quot;tymczasowej&quot;  różni się od tego który został wcześniej zapisany &quot;na stałe&quot;, jeżeli ten warunek jest spełniony to zapisuje elementy pod dalsze komórki pamięci. Ten sam blok warunkowy który odpowiada za zapis bajtów adresu do zewnętrznej tablicy, opuszcza pętlę jeżeli ówcześnie zapisany adres pokrywa się z dopiero co odczytanym adresem - jeżeli są takie same to opuszcza funkcję. Albo gdzieś w tym miejscu jest błąd związany z moim rozumowaniem, albo też ma to związek z błędnym odczytem/zapisem komórek w tablicy.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 11 minutach ]</span></strong><br /><br />Teraz sobie uświadomiłem, że porównuje nowo odczytany adres jedynie z poprzednim, a iteracje 9,12 czy 146 znacznie przekraczają moją tablicę, która uwzględnia 64 bajty - czyli miejsce dla 8 adresów 64 bitowych. Problemem chyba jest to, że muszę sprawdzać nowy adres ze wszystkimi starymi adresami, bo z zasady dwa kolejne zawsze powinny się różnić. Sprawdzę to<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3920">Jatsekku</a> — 23 paź 2016, o 19:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janusz17]]></name></author>
<updated>2016-10-23T16:45:55+01:00</updated>
<published>2016-10-23T16:45:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172561#p172561</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172561#p172561"/>
<title type="html"><![CDATA[Re: Search ROM - One Wire]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172561#p172561"><![CDATA[
Ale czy jest sens tworzenia tych funkcji od nowa, skoro na stronie firmy Maxim-Dallas są podane gotowe algorytmy? Poniżej podaję kody, z których kiedyś korzystałem:<br />[syntax=c]//------------------------------------------------------------------------<br />// Find the 'first' devices on the 1-Wire bus<br />// Return TRUE : device found, ROM number in ROM_NO buffer<br />// FALSE : no device present<br />//<br />int OWFirst(void)<br />{<br />// reset the search state<br />LastDiscrepancy = 0;<br />LastDeviceFlag = FALSE;<br />LastFamilyDiscrepancy = 0;<br />return OWSearch();<br />}<br /><br /><br /><br />//------------------------------------------------------------------------<br />// Find the 'next' devices on the 1-Wire bus<br />// Return TRUE : device found, ROM number in ROM_NO buffer<br />// FALSE : device not found, end of search<br />//<br />int OWNext(void)<br />{<br />// leave the search state alone<br />return OWSearch();<br />}<br /><br /><br />//------------------------------------------------------------------------<br />// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing<br />// search state.<br />// Return TRUE : device found, ROM number in ROM_NO buffer<br />// FALSE : device not found, end of search<br />//<br />int OWSearch(void)<br />{<br />int id_bit_number;<br />int last_zero, rom_byte_number, search_result;<br />int id_bit, cmp_id_bit;<br />unsigned char rom_byte_mask, search_direction;<br />// initialize for search<br />id_bit_number = 1;<br />last_zero = 0;<br />rom_byte_number = 0;<br />rom_byte_mask = 1;<br />search_result = 0;<br />crc8 = 0;<br />// if the last call was not the last one<br />if (!LastDeviceFlag)<br />{<br />// 1-Wire reset<br />if (OWReset())<br />{<br />// reset the search<br />LastDiscrepancy = 0;<br />LastDeviceFlag = FALSE;<br />LastFamilyDiscrepancy = 0;<br />return FALSE;<br />}<br />// issue the search command<br />OWWriteByte(Search_ROM);<br />// loop to do the search<br />do<br />{<br />// read a bit and its complement<br />id_bit = OWReadBit();<br />cmp_id_bit = OWReadBit();<br />// check for no devices on 1-wire<br />if ((id_bit == 1) &amp;&amp; (cmp_id_bit == 1))<br />break;<br />else<br />{<br />// all devices coupled have 0 or 1<br />if (id_bit != cmp_id_bit)<br />search_direction = id_bit; // bit write value for search<br />else<br />{<br />// if this discrepancy if before the Last Discrepancy<br />// on a previous next then pick the same as last time<br />if (id_bit_number &lt; LastDiscrepancy)<br />search_direction = ((ROM_NO&#91;rom_byte_number&#93; &amp; rom_byte_mask) &gt; 0);<br />else<br />// if equal to last pick 1, if not then pick 0<br />search_direction = (id_bit_number == LastDiscrepancy);<br />// if 0 was picked then record its position in LastZero<br />if (search_direction == 0)<br />{<br />last_zero = id_bit_number;<br />// check for Last discrepancy in family<br />if (last_zero &lt; 9)<br />LastFamilyDiscrepancy = last_zero;<br />}<br />}<br />// set or clear the bit in the ROM byte rom_byte_number<br />// with mask rom_byte_mask<br />if (search_direction == 1)<br />ROM_NO&#91;rom_byte_number&#93; |= rom_byte_mask;<br />else<br />ROM_NO&#91;rom_byte_number&#93; &amp;= ~rom_byte_mask;<br />// serial number search direction write bit<br />OWWriteBit(search_direction);<br />// increment the byte counter id_bit_number<br />// and shift the mask rom_byte_mask<br />id_bit_number++;<br />rom_byte_mask &lt;&lt;= 1;<br />// if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask<br />if (rom_byte_mask == 0)<br />{<br />OWCalcCRC(ROM_NO&#91;rom_byte_number&#93;); // accumulate the CRC<br />//OWcrc8(ROM_NO&#91;rom_byte_number&#93;); //druga metoda poszukiwania crc<br />rom_byte_number++;<br />rom_byte_mask = 1;<br />}<br />}<br />}<br />while(rom_byte_number &lt; 8); // loop until through all ROM bytes 0-7<br />// if the search was successful then<br />if (!((id_bit_number &lt; 65) || (crc8 != 0)))<br />{<br />// search successful so set LastDiscrepancy,LastDeviceFlag,search_result<br />LastDiscrepancy = last_zero;<br />// check for last device<br />if (LastDiscrepancy == 0)<br />LastDeviceFlag = TRUE;<br />search_result = TRUE;<br />}<br />}<br />// if no device found then reset counters so next 'search' will be like a first<br />if (!search_result || !ROM_NO&#91;0&#93;)<br />{<br />LastDiscrepancy = 0;<br />LastDeviceFlag = FALSE;<br />LastFamilyDiscrepancy = 0;<br />search_result = FALSE;<br />}<br />return search_result;<br />}<br /><br /><br /><br /><br />//--------------------------------------------------------------------------<br />// Verify the device with the ROM number in ROM_NO buffer is present.<br />// Return TRUE : device verified present<br />// FALSE : device not present<br />//<br />int OWVerify(void)<br />{<br />unsigned char rom_backup&#91;8&#93;;<br />int i,rslt,ld_backup,ldf_backup,lfd_backup;<br />// keep a backup copy of the current state<br />for (i = 0; i &lt; 8; i++)<br />rom_backup&#91;i&#93; = ROM_NO&#91;i&#93;;<br />ld_backup = LastDiscrepancy;<br />ldf_backup = LastDeviceFlag;<br />lfd_backup = LastFamilyDiscrepancy;<br />// set search to find the same device<br />LastDiscrepancy = 64;<br />LastDeviceFlag = FALSE;<br />if (OWSearch())<br />{<br />// check if same device found<br />rslt = TRUE;<br />for (i = 0; i &lt; 8; i++)<br />{<br />if (rom_backup&#91;i&#93; != ROM_NO&#91;i&#93;)<br />{<br />rslt = FALSE;<br />break;<br />}<br />}<br />}<br />else<br />rslt = FALSE;<br />// restore the search state<br />for (i = 0; i &lt; 8; i++)<br />ROM_NO&#91;i&#93; = rom_backup&#91;i&#93;;<br />LastDiscrepancy = ld_backup;<br />LastDeviceFlag = ldf_backup;<br />LastFamilyDiscrepancy = lfd_backup;<br />// return the result of the verify<br />return(rslt);<br />}<br /><br /><br />//--------------------------------------------------------------------------<br />// Verify the device with the ROM number in EEPROM_ROM_NO buffer is present.<br />// Return TRUE : device verified present<br />// FALSE : device not present<br />//<br />int OWVerifyEEPROM(unsigned char *wsk)<br />{<br />unsigned char rom_backup&#91;8&#93;;<br />int i,rslt,ld_backup,ldf_backup,lfd_backup;<br />// keep a backup copy of the current state<br />for (i = 0; i &lt; 8; i++)<br />rom_backup&#91;i&#93; = eeprom_read_byte(wsk++);<br />ld_backup = LastDiscrepancy;<br />ldf_backup = LastDeviceFlag;<br />lfd_backup = LastFamilyDiscrepancy;<br />// set search to find the same device<br />LastDiscrepancy = 64;<br />LastDeviceFlag = FALSE;<br />if (OWSearch())<br />{<br />// check if same device found<br />rslt = TRUE;<br />for (i = 0; i &lt; 8; i++)<br />{<br />if (rom_backup&#91;i&#93; != ROM_NO&#91;i&#93;)<br />{<br />rslt = FALSE;<br />break;<br />}<br />}<br />}<br />else<br />rslt = FALSE;<br />// restore the search state<br />for (i = 0; i &lt; 8; i++)<br />ROM_NO&#91;i&#93; = rom_backup&#91;i&#93;;<br />LastDiscrepancy = ld_backup;<br />LastDeviceFlag = ldf_backup;<br />LastFamilyDiscrepancy = lfd_backup;<br />// return the result of the verify<br />return(rslt);<br />}<br /><br /><br />//--------------------------------------------------------------------------<br />// Setup the search to find the device type 'family_code' on the next call<br />// to OWNext() if it is present.<br />//<br />void OWTargetSetup(unsigned char family_code)<br />{<br />int i;<br />// set the search state to find SearchFamily type devices<br />ROM_NO&#91;0&#93; = family_code;<br />for (i = 1; i &lt; 8; i++)<br />ROM_NO&#91;i&#93; = 0;<br />LastDiscrepancy = 64;<br />LastFamilyDiscrepancy = 0;<br />LastDeviceFlag = FALSE;<br />}<br /><br />//--------------------------------------------------------------------------<br />// Setup the search to skip the current device type on the next call<br />// to OWNext().<br />//<br />void OWFamilySkipSetup(void)<br />{<br />// set the Last discrepancy to last family discrepancy<br />LastDiscrepancy = LastFamilyDiscrepancy;<br />LastFamilyDiscrepancy = 0;<br />// check for end of list<br />if (LastDiscrepancy == 0)<br />LastDeviceFlag = TRUE;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1226">janusz17</a> — 23 paź 2016, o 16:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Situs]]></name></author>
<updated>2016-10-23T16:41:57+01:00</updated>
<published>2016-10-23T16:41:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172560#p172560</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172560#p172560"/>
<title type="html"><![CDATA[Re: Search ROM - One Wire]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172560#p172560"><![CDATA[
A czym testujesz program? Czy to urządzenie działa bezbłędnie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14339">Situs</a> — 23 paź 2016, o 16:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jatsekku]]></name></author>
<updated>2016-10-23T16:12:15+01:00</updated>
<published>2016-10-23T16:12:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172558#p172558</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172558#p172558"/>
<title type="html"><![CDATA[Search ROM - One Wire]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16598&amp;p=172558#p172558"><![CDATA[
Witam,<br />koledzy, mam taki problem, piszę sobie biblioteki do One Wire od podstaw i nie potrafię poprawnie rozwiązać problemu odczytu adresów urządzeń slave na magistrali. Funkcja ta ma realizować następujące założenia:<br />- zapisywać kolejny adres urządzenia do tablicy <br />- nie powtarzać adresów<br />- nie zapisywać nadmiarowych danych do tablicy.<br /><br />Aktualnie eksperymentalny kod wygląda tak:<br /><br />[syntax=c]uint8_t ONE_WIRE_Search_Devices(uint8_t *ONE_WIRE_device_rom)<br />{<br />uint8_t ONE_WIRE_errors;//Zmienna przechowująca flagi błędów<br />uint8_t ONE_WIRE_rom_bit;//Zmienna pomocnicza<br />uint8_t ONE_WIRE_bit_idx;//Indeks aktualnie analizowanego bitu<br />uint8_t ONE_WIRE_byte_idx = 0;<br />uint8_t ONE_WIRE_rom_tmp&#91;ONE_WIRE_ROM_SIZE&#93;;<br />uint8_t ONE_WIRE_rom_opposite;<br />uint8_t ONE_WIRE_rom_idx = 0;//Indeks odczytywanego adresu ROM<br />uint8_t i = 0;<br /><br />//Powtarzanie odczytu adresów slave aż do momentu odczytania ostatenigo z nich lub<br />//przekroczenia ich maksymalnej ilośco<br />while(1)<br />{<br />//Zwrócenie informacji o błędach resetu magistrali w razie ich wystąpienia<br />//Funkcja w wypadku błędu zwraca 0<br />if((ONE_WIRE_errors = ONE_WIRE_Reset())) return ONE_WIRE_errors;<br />//Wysłanie komendy odczytu ROM wszystkich urządzeń slave<br />ONE_WIRE_Transfer_Byte(0xF0);<br /><br />//Odczytanie liczby bajtów określonych makrem ONE_WIRE_ROM_SIZE<br />//Odczyt pełnego ID<br />for(ONE_WIRE_byte_idx = 0; ONE_WIRE_byte_idx &lt; 8; ONE_WIRE_byte_idx ++)<br />{<br />//Odczytanie pojedynczego bajtu przynależącego do adresu urządzenia slave<br />for(ONE_WIRE_bit_idx = 0; ONE_WIRE_bit_idx &lt; 8; ONE_WIRE_bit_idx ++)<br />{<br />//Odczyt pierwszego bitu adresu urządzenia slave<br />ONE_WIRE_rom_bit = ONE_WIRE_Transfer_Bit(1);<br />//Odczyt pierwszego bitu adresu urządzenia slave w postaci zanegowanej<br />if(ONE_WIRE_Transfer_Bit(1))<br />{<br />//Odebrano 11 - zgłoszenie błędu transmisji danych<br />if(ONE_WIRE_rom_bit) return ONE_WIRE_DATA_ERR;<br />}<br />else<br />{<br /> //Odebrano 00 - wykryto więcej niż jedno urządzenie posiadające bit 0 na<br />//wybranej pozycji adresu<br />if(!ONE_WIRE_rom_bit)<br />{<br />//Sprawdzenie czy odczytywany jest adres kolejnego urządzenia slave<br />if(ONE_WIRE_rom_idx)<br />{<br />ONE_WIRE_rom_bit = 0;<br />}<br />//adres pierwszego urządzenia<br />else ONE_WIRE_rom_bit = 1;<br />}<br />}<br />//Wysłanie odebranego wcześniej bajtu na magistralę<br />ONE_WIRE_Transfer_Bit(ONE_WIRE_rom_bit);<br />//Przesunięcie bitowe pozycji adresu o 1 w lewo<br />ONE_WIRE_rom_tmp&#91;ONE_WIRE_byte_idx&#93; &gt;&gt;= 1;<br />//Ustaweienie na tej pozycji &quot;1&quot; jeżeli odebrany bit był &quot;1&quot;<br />if(ONE_WIRE_rom_bit) ONE_WIRE_rom_tmp&#91;ONE_WIRE_byte_idx&#93; |=0x80;<br />}<br />}<br />for(ONE_WIRE_byte_idx = 0; ONE_WIRE_byte_idx &lt; 8; ONE_WIRE_byte_idx++)<br />{<br />if(ONE_WIRE_rom_tmp&#91;ONE_WIRE_byte_idx&#93; !=<br />   ONE_WIRE_device_rom&#91;(ONE_WIRE_rom_idx * 8) + ONE_WIRE_byte_idx&#93;)<br />{<br />ONE_WIRE_rom_opposite = 1;<br />}<br />}<br />//Adresy są różne - zapisz kolejny<br />if(ONE_WIRE_rom_opposite)<br />{<br />for(ONE_WIRE_byte_idx = 0; ONE_WIRE_byte_idx &lt; 8; ONE_WIRE_byte_idx++)<br />{<br />ONE_WIRE_device_rom&#91;(ONE_WIRE_rom_idx * 8) + ONE_WIRE_byte_idx&#93; =<br />ONE_WIRE_rom_tmp&#91;ONE_WIRE_byte_idx&#93;;<br />}<br />ONE_WIRE_rom_opposite = 0;<br />ONE_WIRE_rom_idx++;<br />}<br />else<br />{<br />//ONE_WIRE_rom_amount = ONE_WIRE_rom_idx;<br />return ONE_WIRE_rom_idx;//8<br />}<br />}<br />return ONE_WIRE_rom_idx;<br />}[/syntax]<br /><br />Jestem pewny, że zawiera parę podstawowych błędów, szczególnie odnośnie pracy przy tablicach i wskaźnikach. Aktualnie funkcja mniej więcej działa, tylko z niezrozumiałego dla mnie powodu funkcja opuszcza pętlę po 9, 12 albo 146 procedurach odczytu. Siedzę już nad tym trochę i nie potrafię do tego podejść ze świeżym spojrzeniem. Ma ktoś jakieś pomysły?<br /><br />PS: Komentarze nie zawsze są adekwatne do wykonywanych instrukcji ze względu na ciągłe zmiany<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3920">Jatsekku</a> — 23 paź 2016, o 16:12</p><hr />
]]></content>
</entry>
</feed>