Fórum témák

» Több friss téma
Fórum » 1-wire
 
Témaindító: peti79, idő: Nov 13, 2006
Lapozás: OK   2 / 2
(#) csovaril hozzászólása Feb 13, 2012 /
 
Hi,

Két forrást tudok ajánlani, ami alapján bárki megértheti a 1-wire alapjait, és írhat magának egy rutint:
DS28EA00 adatlap (én ezzel szórakoztam)(kiemelném a 27. oldaltól kezdődő részt)
valamint a fent említett segédlet.

Sok sikert!
(#) brato hozzászólása Jan 19, 2013 /
 
Üdv!

Elmondható az az 1 wire eszközökről, hogy mindegyikben megtalálhatóak az alábbi parancsok?
SEARCHROM, READROM, MATCHROM, SKIPROM.
(#) Thowra válasza brato hozzászólására (») Jan 19, 2013 /
 
Üdv!
Amikkel eddig találkoztam azokba volt.
(#) Novak válasza Thowra hozzászólására (») Jan 19, 2013 /
 
Azokban!
(#) nemesimi hozzászólása Ápr 16, 2013 /
 
Sziasztok!

Egy DS1990 iButtonal küzdök!Nem tudom mi lehet a baj!A kódot értem is meg nem is de inkább nem!Valaki tudna segíteni aki ilyet csinált már!

A kimenet: 8080808080

A kód:

  1.  
  2. #include <avr/io.h>
  3. #include <avr/delay.h>
  4.  
  5. #define F_CPU 8000000UL
  6.  
  7. #define _1W_SET_0() {DDRC |= (1<<PC4);}
  8. #define _1W_SET_1() {DDRC &= (0<<PC4);}
  9.  
  10. #define UART_BAUDRATE 9600 // 9600 bps
  11. #define UBRR_ERTEK ((F_CPU / (UART_BAUDRATE * 16UL)) - 1)
  12.  
  13. void KonfigUART()
  14.     {
  15.        // 9600 bps soros kommunikacio sebesseg beallitasa
  16.        UBRRL = UBRR_ERTEK;        // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
  17.        UBRRH = (UBRR_ERTEK>>8);   // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
  18.        // Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
  19.        UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
  20.        //Ado es Vevo aramkorok bekapcsolasa
  21.        UCSRB |= (1 << RXEN) | (1 << TXEN) | (1<<RXCIE);
  22.     }
  23. char UARTAdatFogad()
  24.     {
  25.               while(!(UCSRA & (1<<RXC))) // Varakozas amig nincs uj bejovo adat
  26.               {
  27.                  //  Varakozas
  28.               }
  29.               //Most mar van beerkezett adat, amit kiolvasunk a pufferbol
  30.               return UDR;
  31.     }
  32. char UARTAdatKuld(char data)
  33.     {
  34.               while(!(UCSRA & (1<<UDRE)))  // Varakozas amig az Ado kesz nem lesz az adatkuldesre
  35.               {
  36.                  //  Varakozas
  37.               }
  38.               // Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
  39.               UDR=data;
  40.     }
  41. void UARTStringKuld(char *s)
  42. {
  43.         while(*s != 0)
  44.         {
  45.                 UARTAdatKuld(*s);
  46.                 s++;
  47.         }
  48. }
  49.  
  50.  
  51. int _1WireInit(void)
  52. {
  53.         int InitBit;
  54.        
  55.         _delay_us(0);
  56.         _1W_SET_0();
  57.         _delay_us(480);
  58.         _1W_SET_1();
  59.         _delay_us(70);
  60.         InitBit = (PINC & (1<<PC4));
  61.         _delay_us(410);
  62.         return InitBit;
  63. }
  64. void _1WireWriteSlot(int bit)
  65. {
  66.         if(bit)
  67.         {
  68.                 _1W_SET_0();
  69.                 _delay_us(6);
  70.                 _1W_SET_1();
  71.                 _delay_us(64);
  72.         }
  73.         else
  74.         {
  75.                 _1W_SET_0();
  76.                 _delay_us(60);
  77.                 _1W_SET_1();
  78.                 _delay_us(10);
  79.         }
  80. }
  81. int _1WireReadSlot(void)
  82. {
  83.         int _bit;
  84.        
  85.         _1W_SET_0();
  86.         _delay_us(6);
  87.         _1W_SET_1();
  88.         _delay_us(9);
  89.         _bit = (PINC & (1<<PC4));
  90.        
  91.         _delay_us(55);
  92.         return _bit;   
  93. }
  94. int _1WireReadByte(void)
  95. {
  96.         int i;
  97.         int data = 0;
  98.        
  99.         for( i = 0; i<8 ; i++)
  100.         {
  101.                 data >>= 1;
  102.                 if(_1WireReadSlot())
  103.                 {
  104.                         data |= 0x80;
  105.                 }
  106.                
  107.                 return data;
  108.         }
  109. }
  110. void _1WireWriteByte(int data)
  111. {
  112.         int i;
  113.         for(i = 0; i<8 ;i++)
  114.         {
  115.                 _1WireWriteSlot(data & 0x01);
  116.                 data >>= 1;
  117.         }
  118. }
  119.  
  120. int main(void)
  121. {
  122.         KonfigUART();
  123.        
  124.         int WireBuffer[10];
  125.         char buffer[12] ="";
  126.         char xx[3] = "";
  127.         int data1;
  128.         int i;
  129.        
  130.         DDRC = 0b00000000;
  131.         PORTC = 0b00000000;
  132.  
  133.     while(1)
  134.         {      
  135.                
  136.                 data1 = _1WireInit();
  137.                 if(!data1)
  138.                 {
  139.                         _1WireWriteByte(0x0F);
  140.                        
  141.                         for (i=0; i<8;i++)
  142.                         {
  143.                                 WireBuffer[i] = _1WireReadByte();
  144.                                 if(i == 0)
  145.                                 {
  146.                                         if(WireBuffer[i] == 0x01)
  147.                                         {
  148.                                                 UARTStringKuld("DS1990 Serial Number: ");
  149.                                         }                                      
  150.                                 }
  151.                                 if((i>=1) && (i<7))
  152.                                 {
  153.                                         itoa(WireBuffer[i],xx,16);
  154.                                         //UARTStringKuld(xx);
  155.                                         strcat(buffer,xx);
  156.                                 }
  157.  
  158.                         }      
  159.  
  160.                         UARTStringKuld(buffer);
  161.                         UARTAdatKuld('\r');
  162.                         UARTAdatKuld('\n');
  163.                         strcpy(buffer,"");
  164.                        
  165.                 }
  166.         }              
  167. }


Köszi szépen!
A hozzászólás módosítva: Ápr 16, 2013
(#) Tetye hozzászólása Márc 14, 2016 /
 
Sziasztok!
1 Wire buszt szeretnék galvanikusan leválasztani az avr-ről . Szerintetek használható a kép amit csatoltam? Vagy inkább az EZEN a linken lévőt kéne megcsinálni?
DS1820/18B20 szenzorok írás/olvasása a cél.
Ebben milyen opto lehet? Innen van a kép.
Köszi előre is.
A hozzászólás módosítva: Márc 14, 2016

1wire_iso.gif
    
(#) obenhof hozzászólása Márc 3, 2019 /
 
Sziasztok!

Arduinoval használok DS18B20-as szenzorokat 4 darabot egy buszra felfűzve. A program indexeket oszt ki 0-3-ig az elhelyezkedésük szerint. Akárhogy variálom az érzékelőket mindig helyes a sorrend. Hogyan képes erre, és mennyire bízhatok meg ebben?
(#) eSDi válasza obenhof hozzászólására (») Márc 3, 2019 /
 
A DS18B20 adatlapjának első oldalán van a válasz.
Idézet:
„Each Device has a Unique 64-Bit Serial Code Stored in an On-Board ROM”

A programot, pedig te látod, hogy mit csinál.
(#) Bakman válasza obenhof hozzászólására (») Márc 3, 2019 /
 
Gondolom innen van a kód(részlet): 1-Wire Search Algorithm.

Az igazi megoldás az, hogy egyenként lekérdezed a ROM kódokat és az alapján szólítod meg az érzékelőket nem pedig index alapján. A négy közül vegyél ki egyet és tegyél be egy ötödiket, azonnal borul a sorrend, ha nincs szerencséd.
(#) obenhof válasza Bakman hozzászólására (») Márc 3, 2019 /
 
A DallasTemperature példaprogramjából:

  1. Serial.print("Temperature is: ");
  2.  Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"?  
  3.    // You can have more than one DS18B20 on the same bus.  
  4.    // 0 refers to the first IC on the wire


Ezek az indexek hogyan keletkeznek? Nekem eddig úgy tűnik megtalálja a sorrendet, de akkor azt mondod ez nem megbízható.
(#) Bakman válasza obenhof hozzászólására (») Márc 3, 2019 /
 
Nem tudom, hogyan keletkeznek az indexek, nem tudom, mennyire stabil. Annó arra jutottam, hogy:
A: Minden érzékelőnek kell a ROM kódja.
B: Minden érzékelő egy-egy lábat foglaljon a kontrolleren.
C: Multiplexer IC-vel oldom meg a dolgot (pl. CD4066).

B és C esetben szabadon cserélgethetőek a szenzorok. A esetben nem cserélhetőek szabadon a szenzorok, viszont egy kontroller láb elég.
(#) Tetye válasza obenhof hozzászólására (») Márc 8, 2019 /
 
Szia!
Ebből a kódrészletből ki tudod mazsolázni simán ami kell.
Minden szenzornak van egyedi azonosítója, az alapján kérdezem le alakítom és adom át.
Ebben benne van a felbontás beállítása is .
  1. void takeReading()
  2. {
  3. sensors.begin();  //inicializálás
  4. asc = sensors.getDeviceCount(); // buszon lógó eszközök száma
  5. sensors.requestTemperatures();  // konverzió indít
  6. delay(250); //450  // itt várunk kicsit amit amíg  mér
  7. Mb.R[8] = (asc); // itt átadom másnak hogy hány szenzorom van
  8. for (a=0; a<db; a++)    // na itt kezdődik a buli, ahány szenzorom van annyiszor léptetve kérem le a szenzorok ID-ját, aztán....
  9. {
  10.   for (b=0; b<=7; b++) getid[b] = dsid[a][b] ;
  11. if(getid[0] == 0x10) sensors.setResolution(getid, 9);  //beállítom a felbontásukat
  12. if(getid[0] == 0x28) sensors.setResolution(getid, 12); // típustól függően
  13.   tempC = sensors.getTempC(getid);  // elkérem az adatokat
  14.  
  15.   Serial.print("id: ");    //itt id alapján megkapod az értékeket.
  16.   Serial.print(getid);
  17.   Serial.print("temp: ");
  18.   Serial.print(tempC);
  19. }
  20.   toggle = !toggle;
  21.   digitalWrite(13,toggle);
  22. wdt_reset();
  23. }
(#) Junkie hozzászólása Feb 3, 2022 /
 
Sziasztok ds2430 tipusú eepromokkal küzdök, megépítettem hozzá ezt a programozót:Open Programmer , működik is szépen , viszont egy két dolgot nem értek a chippel kapcsolatban, a 256 bites memoriát tudom írni is meg olvasni is, ez eddig rendben is van, viszont van neki egy egyszer írható 64 bites Application Registere, azt hogytan tudnám vajon irni? a másik meg az , hogy nem is igazán értem hogyan kéne azt cimezzem ugyanis az adatlap 00h tol írja a Data Memoryt és az Application Memoryt is. Adatlap szerint az Application Registert 99h koddal lehet írni , de nem értem én ezt a programozónak hogy tudom megmondani, a hex fileba kéne valahogy beirni ? Igazából Mimaki nyomtatónak lenne a festék chipje és úgy tünik nem elég sajnos csak a Program Memoryt lemásolni ,ugyanis a nyomtató azonnal IC errort ad, most vagy a széria szám alapján változik a program memory valamilyen algoritmus alapján, (viszont a serial nem másolható mivel egyedi minden chipnek,) vagy jobbik esetben az App.Reg.-el hasonlitja össze, ez esetben talán ha másolnám az app.reg-et is az segítene. Valakinek valami ötlete ?

Köszi.
(#) eSDi válasza Junkie hozzászólására (») Feb 3, 2022 /
 
Hali!

Normál esetben kiadod a WRITE SCRATCHPAD [0Fh] parancsot, kiküldöd az összes adatot, majd kiadod a COPY SCRATCHPAD [55h] parancsot. Ekkor scratchpad összes adata beíródik az EEPROM-ba.
A másik eset ugyan ez, csak a WRITE APPLICATION REGISTER [99h] és a COPY & LOCK APPLICATION REGISTER [5Ah] parancsokat kell kiküldened.

Ezt, hogy hogyan magyarázod meg a programozónak, azt nem tudom. Kipróbálni nem tudom, nálam nem fut valamiért.
(#) eSDi válasza Junkie hozzászólására (») Feb 3, 2022 /
 
Közben bele néztem a program forráskódjába. Sajnos nincs támogatva ez a funkció. Kiolvassa az egészet, de írni már nem írja. Az előzőleg említett két parancs definiálva van, de nem használja semmire. Szóval lehet, előbb-utóbb belekerül.
(#) Junkie válasza eSDi hozzászólására (») Feb 3, 2022 /
 
Tehát akkor elvileg nem kell cimeznem , alapból gondolom 00h adressel kezdi beirni az adatot, azt sajnos még nem fejtettem meg hogyan adok neki parancsot mert gondolom az a programozó chippjén belül történik, mindenesetre a programozó fejlesztőjének is irtam a fórumon, talán van neki valami megoldása erre mert a softon belül nem látok erre lehetőséget..de mindenképp köszönöm a segítséged..

Üdv. Szabi
(#) Junkie válasza eSDi hozzászólására (») Feb 3, 2022 /
 
Hát én irtam neki, reménykedem hogy fejlesztenek rajta valamit, esetleg megprobállom arduinoval valahogy irni, legalább azt a részt..

Köszi szépen hogy belenéztél ..
A hozzászólás módosítva: Feb 3, 2022
(#) 0123qwe hozzászólása Szept 19, 2022 /
 
üdv

Egyik projecthez szükségem lenne ds2482-100 1wire masterre. de ilyent nem lehet kapni, kb 2 év múlvára van visszaigazolva. az jutott eszembe, hogy STM8S001J3-re megírom a OW kodot, és ezt illesztem be a rendszerve ugyanúgy i2c-vel. és talán egyszerűbb lenne az i2c lekérdezés a hostban mint a dsben...

van-e valakinek hasonló megoldása? hajlandó eladni?
(#) Bakman válasza 0123qwe hozzászólására (») Szept 19, 2022 /
 
Anélkül, hogy érdemben tudnék válaszolni...
Mire jó ez az IC? I2C hosszú vezetéken nem nyerő, 1-Wire pedig szoftveres úton viszonylag könnyen ugorható, hacsak nem a sok megszakítás elrontja az időzítéseket. UART - 1Wire átalakítónak több értelmét látnám de ahogy írtad, ilyesmit egy kis mikrokontrollerrel meg lehet ugrani.
(#) 0123qwe válasza Bakman hozzászólására (») Szept 20, 2022 /
 
a betervezett ds2482 3.5 cmre van a host processzortról. a hostnak semmilyen szabad lába nincs, plusz nem akarom a host egyetlen lábát sem 4+ méteres vezetékre kötni. legegyszerűbb megoldás letenni mégegy footprintet az új procinak és alternatívan lenne ültetve. pl 16 onewire hőmérő olvasása is sok időbe került, sok a várakozás, nem is lehet egybe megcsinálni, mert blokkolt mindent. még lehet jobb ötlet a külső dedikált proci erre, mert az megold mindent, én meg egy index+temp adatokat elkérek, minden időigényes műveletet áttolok erre a picire. esetleg igény szerint uuid-ket az azonosítához, bár ezt még annyira nem találtam fel hogy működjön
(#) Andralin hozzászólása Ápr 7, 2023 /
 
Sziasztok!

Segítséget kérnék 1 wire kapcsolattal. Megoldható lenne az valahogy, hogy mindössze két vezeték erem van csak, és a távoli oldalon szeretnék egy kapcsolót figyelni illetve egy LED-et is kapcsolgatni? Úgy, hogy a végoldalon külön tápfeszültség nem áll rendelkezésre?

Kis olvasgatás után a DS2413-re gondoltam. Itt magának az IC-nek nem kell táp, de a kapcsoló figyeléséhez és a LED meghajtásához kellene táp az IC adatlapja szerint (local power).

Az a megoldás működőképes lehet, hogy az adatvonalról az IC előtt magamnak is külön leválasztok egy parazita tápot (ahogy azt az IC is teszi) és azt használom fel a "local power" helyett? Ha igen, akkor az adatvezetékről elég lenne egy dióda és egy kondenzátor a parazita táp leválasztáshoz, vagy valami komolyabb áramkör kellene?

1wire.jpg
    
(#) Bakman válasza Andralin hozzászólására (») Ápr 7, 2023 / 1
 
Lásd melléklet.

1: 'A' pont H szinten van, 'B' pedig L szinten, LED világít.
2: 'A' pont nagy impedanciás bemenet, 'B' H szinten van. Ha az 'A' ponton H mérhető, akkor a kapcsoló nyitva, ha ettől eltérő (ellenállások értékétől függ), akkor a kapcsoló nyitva. Ha R1 lehúzó ellenállás nagy értékű R3-hoz képest, akkor nyitott kapcsolónál közel H szint mérhető de érzékenyebb is lesz a zavarokra a rendszer.

Nagy távolságokra érdemes optocsatolós leválasztásokkal elkészíteni. Pl. 10 ms jut a LED-nek, 10 ms jut a kapcsolónak felváltva, ezt egy mikrokontroller lazán kezeli. Ettől a LED kicsit vibrálni fog és a fényereje is korlátozódik de talán elég, nem írtad a konkrét alkalmazást.
A hozzászólás módosítva: Ápr 7, 2023
(#) Andralin válasza Bakman hozzászólására (») Ápr 8, 2023 /
 
Nagyszerű megoldás! Köszönöm a tippet!
Nem kellene nagy távolság, kb. 7-8 méter lenne. A LED vibrálás nem gond. Ez a megoldás akár egy Arduinoval is működne, ha az A lábon váltogatom a I/O irányt?
(#) Bakman válasza Andralin hozzászólására (») Ápr 8, 2023 / 1
 
Minden olyan lábbal működik, amelyik be- és kimenetként is tud szolgálni.

szerk.:
Kicsit összekevertem az előzőben a 2. variációt. Nyitott kapcsolónál az 'A' pont L szinten van.
A hozzászólás módosítva: Ápr 8, 2023
(#) Andralin válasza Bakman hozzászólására (») Ápr 8, 2023 /
 
Értem, akkor ez lesz a megfelelő megoldás nekem. Még egyszer nagyon köszönöm!
Következő: »»   2 / 2
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem