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


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