» »

1-Wire protokol in DS1820

1-Wire protokol in DS1820

ameba ::

Zdravo,

ugotavljam kako deluje 1-Wire protokol v povezavi z DS1820 temperaturnim senzorjem.
Torej to ni ravno moje področje ampak me zanima :-)
Če bi nekdo lahko v parih stavkih popravil moje napake v razumevanju bi mu bil zelo hvaležen.

Spodaj piše moje razumevanje.

Hvala za pomoč

Vire črpam iz
http://pdf1.alldatasheet.com/datasheet-...
in
http://playground.arduino.cc/Learning/O...

Skratk, uporablja dve nogici za napajanje in eno za komunikacijo.
Omogoča nizke hitrosti prenosa podatkov, napajanje in signaliziranje preko ene linije.
Kaj točno pomeni da ima MASTER in SLAVE način delovanja- to si rpedstavljam kot krmilnik in temperaturni senzor ?

Rzdeli se na tri dele:

Strojna konficuracija - kaj se takrat tam dogaja ? Ko je stanje 1 je vodilo HIGH in takrat ni komunikacije med senzorjem in napravo ki krmili ?
Dostopa mora v pravem času. In da lahko krmiliš napravo mora biti vsaka ne razumem pomena FACILITATE in DRAIN v konteksu ?

Prenosna sekvcena - ne razumem tega žargona ? je pa opis protkola kako poteka komunikacija senzorja po 1-wire portu ?


1-wire siganlizacija - ne znam prevesti
All transactions on the 1–Wire bus begin with an initialization
sequence. The initialization sequence consists of a reset pulse transmitted by the bus master followed by presence pulse(s) transmitted by the slave(s).The presence pulse lets the bus master know that the DS1820 is on the bus and is ready to operate. For more
details, see the “1–Wire Signaling” section.

ameba ::

Kdorkoli kaj ve ?

Brane22 ::

Če to rabiš za šolo, ne pričakuj,d a bo folk delal tvojo domačo nalogo.

Če gre za kaj drugega, DS1820 je zastarel AFAIK in bi bilo pametno razmisliti o čem drugem.

1-Wire je mislimd a vpeljal Dallas in pričakovali so veliko priljubljenost ker je še bolj minimalističen od I2C-ja, ki pač zahteva dve žici.

Če se prav spomnim, so bili z DS1820 problemi, ker se je znal zaciklati v položaju, kjer je potem onemogočal komunikacijo vsem drugim.

Zgodovina sprememb…

  • spremenilo: Brane22 ()

ingeniero ::

Master in slave način delovanja: Master (npr. mikrokontroler) vedno začne komunikacijo in zahteva podatke od slave-a (DS1820).
Komunikacija pa poteka nekako takole. V idle načinu (nič se ne dogaja) je vodilo na 1 (zaradi pull-up upora), naprave so v open drain načinu, kar pomeni, da ne držijo pina na 0 ali na 1. 0 ali 1 se pošlje na nasleden način:
- 0: master sklene izhod proti GND (kar povzroči padec napetost na vodilu, saj je tok, ki teče preko pull-up upora dokaj majhen),
- 1: master gre v open drain način.

Prevod je pomoje: protokol 1-wire, vsaj tako se ga prevaja na UM.

Prenosna sekvenca pomeni kako se biti prenesejo po vodilu, kateri so in koliko jih je.

čuhalev ::

Brane22 je izjavil:

Če gre za kaj drugega, DS1820 je zastarel AFAIK in bi bilo pametno razmisliti o čem drugem.

Meni dela DS18B20 že eno leto brez problema. Kakorkoli že, kaj naj bi bila (po tvoje) sodobnejša varianta temperaturnega senzorja?

Celoten način komunikacije, kaj kaj pošlje in časovni intervali, je lepo napisano v datasheet senzorja.

Highlag ::

Tile senzorčki so zakon. Imam ene 2 projekta doma, ki merita temperaturo na več mestih. Eden že nekaj let krmili centralno, drugi pa od poletja meri temperaturo stanovanja. Izvedbi pa sta popolnoma drugačni.

Zelo pomembni so časovni poteki signalov. Pomembno, je da se jih držiš, pa se da lepo delat. Za zagon je fino imeti kakšen osciloskop, da vidiš ali programi pravilno delujejo.

Tole sem pa spisal med igranjem z LPC-jem. Če vzameš datasheet od čipa mislim, da je lahko slediti kodi, saj sem spisal maljon komentarjev.
Problem za začetnike je le dobiti kodo čipa, če misliš uporabiti več senzorjev na eni liniji. Sam sem v samem začetku najprej spisal kodo, ki najprej naredi poizvedbo in izpiše kodo senzorja, priklopil pa sem seveda samo en senzor hkrati. Ko sem imel kode vseh senzorjev sem kodo porabil za direktno poizvedbo na določene senzorje. Da se sicer narediti tudi program, ki najprej izlušči kode posameznih senzorjev, in jih nato uporabi. (Tako daleč pa nisem prišel) Tako dela namreč tudi RPi, ko priključiš senzorje na malino.
/******************************************************************************/
/* Programček za dostop do DS1820 senzorja                                    */
/* By P&P 24.9.2012                                                           */
/******************************************************************************/
#include <stdio.h>
#include "LPC13xx.h"                        // LPC13xx definitions ^
#include "systick_pp.h"
#include "DS1820_pp.h"
#include "LCD.h"

/******************************************************************************/
/* DS1820 je priključen na pin:                                               */
/* PIO3.1      Pin37 -> P0.26  ->P10-Pin1                                     */
/******************************************************************************/

#define PIN_DS1820                 (1 << 1)                     // ...0000 0010
// Pin da na izhod 1 ali 0
#define DS1820_Data(x) ((x) ? (LPC_GPIO3->DATA |= PIN_DS1820)  : (LPC_GPIO3->DATA &= ~PIN_DS1820) ); 
// Pin beremo
#define DS1820_beri LPC_GPIO3->DATA & PIN_DS1820
// Pin je definiran kot izhod - 1 / 0 - vhod
#define DS1820_IO(x)   ((x) ? (LPC_GPIO3->DIR |= (PIN_DS1820))  : (LPC_GPIO3->DIR &= ~(PIN_DS1820)) ); 

int Senzor_Prisoten,Delcek_Stopinje,Izmerjena_Temperatura;
int Negativna_Temperatura;

// Tule se lahko vpiše kodo prebranega senzorja, ki jo izpiše 
// funkcija PreberiSerijsko(); v prvo vrstico LCD.
// Izpis na LCD je že v Hex obliki, pred posamezne bajte je potrebno dodlati le "0x"
int koda[8]={0x94,0x00,0x08,0x01,0xD3,0x39,0x38,0x10}; // koda senzorja
int TipSenzorja=0;
int DS1820Data[]={0,0,0,0,0,0,0,0,0};
char bufer[20];
char *napis;

//**************************************************************
//    Inicializacija senzorja 
//**************************************************************
void init1820(void){
   int vrednost;
   DS1820_IO(1);
   Delay_us(500);                // počakamo 500us
   DS1820_Data(0);               // Izhod na 0
   Delay_us(500);
   DS1820_IO(0);                 // Pin je vhod
   Delay_us(100);                // Po 100us preverimo odgovor
   vrednost=DS1820_beri;         // preberemo odgovor
   Delay_us(500);
  if (vrednost & (1<<0)) {       // je bit 0 spremenljivke vrednost 1?
   Senzor_Prisoten =0;           // Napaka, senzor se ni "oglasil"
   } else {
   Senzor_Prisoten =1;           // Vse v redu, nadaljujemo...
   } 
}

//**************************************************************
// Na izhod za DS1820 zapiše 0
//**************************************************************
void write_0(){
   DS1820_IO(1)                  // Pin DS1820 je izhod
   DS1820_Data(0);               // Izhod na 0
   Delay_us(90);
   DS1820_IO(0)                  // Pin DS1820 je vhod
   Delay_us(10);
}
//**************************************************************
// Na izhod za DS1820 zapiše 1
//**************************************************************
void write_1(){
   DS1820_IO(1)                  // Pin DS1820 je izhod
   DS1820_Data(0);               // Izhod na 0
   Delay_us(3);
   DS1820_IO(0)                  // Pin DS1820 je vhod
   Delay_us(90);                 // počakamo 90us
}

//**************************************************************
// Na izhod za DS1820 pošlje 8 bitov podatkov
//**************************************************************
void send_to_ds1820(int podatki){
   int i;
   DS1820_IO(1);                 // Pin DS1820 je Izhod
   for (i=0;i<8;i++) {           // 1 byte je sestavljen iz 8 bitov
      if (podatki & (1<<i)) {    // ali je bit podatki(i) = 1?
      write_1();                 // podatiki(i) je 1, 
      } else {
      write_0();                 //podatiki(i) je 0, 
      }
   }
}

//**************************************************************
// Prebere 8 bitov z DS1820 vhoda v spremenljivko prebrano
//**************************************************************
int read_from_ds1820(void){
   int i;
   int prebrano=0;
  for (i=0;i<8;i++) {            // Podatki so sestavljenih iz 8 bitov
   DS1820_IO(1)                  // pin DS1820 je izhod
   DS1820_Data(0)                // izhod na 0
   Delay_us(3);                  // Malček počakamo
   DS1820_IO(0)                  // pin DS1820 je vhod
   Delay_us(10);                 // še malček počakamo
     if ( DS1820_beri ) {        // ali je prebran bit = 1?
      prebrano |= (1<<i);        // da, postavi bit[i] v prebrano na 1
      } else {
      prebrano &= ~(1<<i);       // ne, postavi bit[i] v prebrano na 0
      }
      Delay_us(70);
   }
   return prebrano;              // funkcija vrne spremenljivko prebrano
}
//**************************************************************
// Prebere serijsko številko DS1820 hrani jo v DS1820Data[]
//**************************************************************
void PreberiSerijsko() {
   int x;
   int x1 = 0;
   char bufer[20];
   init1820();
   send_to_ds1820(0x33);         // ukaz READ ROM
   Delay_us(200);
   for (x=0;x<8;x++) {           // tule pa že beremo serijsko št. 
   DS1820Data[x]=read_from_ds1820();
   }
   for (x1=0; x1<=8; x1++) {
   sprintf(bufer, "%02x", DS1820Data[8-x1]);// številko stolpca pretvorim v char
   LCD_print (x1*2, 1, bufer);              // ter jo izpišem na LCD  
   }
 }
/**************************************************************/
//    Preberi scratchapd ob enem senzorju brez naslova
/**************************************************************/
void PreberiScratcpad() {
   int x;
   int x1 = 0;
   char bufer[20];
   init1820();
   send_to_ds1820(0xCC);         // 0xCC = Skip rom
   Delay_us(100);
   send_to_ds1820(0x44);         // 0x44 = Convert T
   Delay_us(750000);             // počakamo 750ms za pretvorbo
   init1820();
   send_to_ds1820(0xCC);         // 0xCC = Skip rom  
   Delay_us(100);  
   send_to_ds1820(0xBE);         // 0xBE = Read scratchpad
   Delay_us(100);
   
   for (x=0;x<8;x++) {           // tule pa že beremo vsebino scratcpada 
   DS1820Data[x]=read_from_ds1820();
   }
   for (x1=0; x1<=8; x1++) {
   sprintf(bufer, "%02x", DS1820Data[8-x1]);// številko stolpca pretvorim v char
   LCD_print (x1*2, 2, bufer);              // ter jo izpišem na LCD  
   }
 }

 /**************************************************************/
//    Pošlje ukaz 0x55 - Match rom skupaj s serijsko številko
/**************************************************************/
void SendMatchROM() {
   int temp;
   send_to_ds1820(0x55);
   for (temp=0; temp<8; temp++) {
      send_to_ds1820(koda[7-temp]);
   }
}
 
void PreberiIzbraniDS1820() {
   int x;
   init1820();
   SendMatchROM();
   send_to_ds1820(0x44);         // 0x44 = Convert T
   Delay_us(750000);             // počakamo 750ms za pretvorbo
   init1820();
   SendMatchROM(); 
   Delay_us(100);  
   send_to_ds1820(0xBE);         // 0xBE = Read scratchpad
   Delay_us(100);
   for (x=0;x<8;x++) {           // tule pa že beremo vsebino scratcpada 
   DS1820Data[x]=read_from_ds1820();
   }
 }

/**************************************************************/
//    Prebere vsebino scratchpada in iz nje izlušči temperaturo
//    primerno za prikaz na LCD 
/**************************************************************/ 
void PreberiTemperaturo(){
  char decimalka;
  int temperatura;
  char predznak;
  
//  PreberiScratcpad();
  PreberiIzbraniDS1820();
  
// Določitev vrednosti za decimalno piko  
  if (DS1820Data[0] & (1<<0)){   // ali je bit 0 = 1
    decimalka=5;                 // da -> decimalka = 5
  } else {
    decimalka=0;                 // ne -> decimalka = 0
  }

  temperatura = DS1820Data[0] >> 1;// Določitev temperature  

  if (DS1820Data[1] & (1<<0)){   // Je temperatura pozitivna ali negativna?  
    predznak='-';
  } else{
    predznak='+';
  }    
// Sprintf tule združi nekaj spremenljivk in besedila in shrani v niz
// buffer  
sprintf(bufer, "Temperatura = %c%d.%d", predznak, temperatura, decimalka);  
napis=&bufer[0];                 // kazalec na niz buffer
}    
Never trust a computer you can't throw out a window

madog ::

Za arduinota imaš spisanih malo morje librarys, od finding code do parasite mode.....

fenomenalne male stvaarce ki jih do sedaj še nisem uspel uničiti brez da bi na njih nevedoč priklopil prevelike napetosti...

Low cost in za moje pojme outstanding life span!!
Phenom II X4 955 BlackEdition|M4A87TD EVO|OCZ 2x2GB @1333MHz|Sapphire HD5770 OC

ameba ::

Brane 22, prosil sem zgolj za pomoč in usmeritev. Učim se še. Nisem vseved. Že na podlagi vprašanj, se vidi da nimam pojma.
Ostali pa hvala za odgovore in pomoč :-)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

PIC18F4550 in ds18s20

Oddelek: Elektrotehnika in elektronika
191984 (1663) snow
»

temp data logger

Oddelek: Elektrotehnika in elektronika
323293 (2713) maticm
»

pic ds1820 asm

Oddelek: Elektrotehnika in elektronika
132272 (2085) neoto
»

Vodno hlajenje-kako narediti oz. kakšen termostat kupiti?

Oddelek: Hlajenje in modifikacije
241974 (1686) zlabo
»

temperaturni senzorji

Oddelek: Hlajenje in modifikacije
181844 (1467) DJroky

Več podobnih tem