www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

ds 1820 na pic mikrokontrolerju

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vulgaris
Neznanec
Neznanec



Pridružen-a: Tor 25 Mar 2008 19:37
Prispevkov: 7
Aktiv.: 0.03
Kraj: prlekija

PrispevekObjavljeno: Tor Sep 06, 2011 11:32 am    Naslov sporočila:  ds 1820 na pic mikrokontrolerju Odgovori s citatom

Pozdravljeni, trenutno se ukvarjam z temperaturno regulacijo. Zadeve pridno delujejo z senzorjem lm35, vendar želim preklopiti na ds1820. Imam vzorčni program za uporabo omenjenega senzorja ( ds1820) kateri deluje in izmerjeno temperaturo pokaže na lcd-ju, težava pa se pojavi ko hočem še kaj drugega kot samo gledati izmerjrno temp. na lcd-ju. Na primer vklopiti ledico na nekem pinu ob določeni temperaturi ( termostat).
Da poenostavim: kako temperaturo ki jo pokaže lcd "zapakirati " v neko spremenljivko katero bi potem nadalje uporabljal. uporabljam picbasicpro.
Vzorec kode:
' Picbasic Pro program to read DS1820 1-wire temperature sensor
' and display temperature on LCD

' Define LCD pins
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1


' Allocate variables
command var byte ' Storage for command
i var byte ' Storage for loop counter
temp var word ' Storage for temperature
DQ var PORTC.0 ' Alias DS1820 data pin
DQ_DIR var TRISC.0 ' Alias DS1820 data direction pin


ADCON1 = 7 ' Set PORTA and PORTE to digital

Low PORTE.2 ' LCD R/W line low (W)
Pause 100 ' Wait for LCD to start

Lcdout $fe, 1, "Temp in degrees C"' Display sign-on message


' Mainloop to read the temperature and display on LCD
mainloop:
Gosub init1820 ' Init the DS1820

command = $cc ' Issue Skip ROM command
Gosub write1820

command = $44 ' Start temperature conversion
Gosub write1820

Pause 2000 ' Wait 2 seconds for conversion to complete

Gosub init1820 ' Do another init

command = $cc ' Issue Skip ROM command
Gosub write1820

command = $be ' Read the temperature
Gosub write1820
Gosub read1820

' Display the decimal temperature
Lcdout $fe, 1, dec (temp >> 1),".",dec(temp.0 * 5)," degrees C"

Goto mainloop ' Do it forever


' Initialize DS1820 and check for presence
init1820:
Low DQ ' Set the data pin low to init
Pauseus 500 ' Wait > 480us
DQ_DIR = 1 ' Release data pin (set to input for high)

Pauseus 100 ' Wait > 60us
If DQ = 1 Then
Lcdout $fe, 1, "DS1820 not present"
Pause 500
Goto mainloop ' Try again
Endif
Pauseus 400 ' Wait for end of presence pulse
Return


' Write "command" byte to the DS1820
write1820:
For i = 1 to 8 ' 8 bits to a byte
If command.0 = 0 Then
Gosub write0 ' Write a 0 bit
Else
Gosub write1 ' Write a 1 bit
Endif
command = command >> 1 ' Shift to next bit
Next i
Return

' Write a 0 bit to the DS1820
write0:
Low DQ
Pauseus 60 ' Low for > 60us for 0
DQ_DIR = 1 ' Release data pin (set to input for high)
Return

' Write a 1 bit to the DS1820
write1:
Low DQ ' Low for < 15us for 1
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 60 ' Use up rest of time slot
Return


' Read temperature from the DS1820
read1820:
For i = 1 to 16 ' 16 bits to a word
temp = temp >> 1 ' Shift down bits
Gosub readbit ' Get the bit to the top of temp
Next i
Return

' Read a bit from the DS1820
readbit:
temp.15 = 1 ' Preset read bit to 1
Low DQ ' Start the time slot
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
If DQ = 0 Then
temp.15 = 0 ' Set bit to 0
Endif
Pauseus 60 ' Wait out rest of time slot
Return

Najlepsa hvala za kakršen koli preedlog.

End

_________________
nikoli ni prepozno
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gkrusi
Član
Član



Pridružen-a: Tor 24 Jul 2007 17:22
Prispevkov: 812
Aktiv.: 3.56
Kraj: Ptuj

PrispevekObjavljeno: Tor Sep 06, 2011 12:55 pm    Naslov sporočila:   Odgovori s citatom

Jaz uporabljam tole kodo in mi v float obliki vrne temperaturo. Je pa za CCS C compiler, tako da boš jo moral predelati. Morda vseeno kaj koristi.
Koda:

int n;

int1 ds18b20_initialization();
void ds18b20_write_byte(int8 B);
int8 ds18b20_read_byte(void);

void call_device(int address[8])
{
      ds18b20_initialization();     
      ds18b20_write_byte(0x55);
      for (n=0; n<8; n++)
      {
         ds18b20_write_byte(address[n]);
      }
}

int1 ds18b20_initialization(void){
   int1 ready;
   
   output_low(DS18B20_IO);
   delay_us(488);          //min 480us
   output_float(DS18B20_IO);
   delay_us(60);           //15 - 60us da se naprava odzove
   ready=!input(DS18B20_IO);
   delay_us(424);
   return ready;
}

void ds18b20_write_bit(int8 b){
   output_low(DS18B20_IO);
   if(b == 1){
      delay_us(2);         //min 1
      output_float(DS18B20_IO);
   }
   delay_us(125);
   output_float(DS18B20_IO);
}

void ds18b20_write_byte(int8 B)
{

   int8 i, aux;
   
   //output_high(PIN_A);
   
   for(i=0; i<8; i++){
      aux = B >> i;     //aux equals B shifted i times to the right
      aux &= 0x01;      //least significant bit survives
      ds18b20_write_bit(aux);
   }
   delay_us(120);
   //output_low(PIN_A1);
}

int1 ds18b20_read_bit(void){
   output_low(DS18B20_IO);
   delay_us(2);         //min 1us
   output_float(DS18B20_IO);
   delay_us(8);
   return(input(DS18B20_IO)); //next a delay of 60 to 120us must be done!
}

int8 ds18b20_read_byte(void){
   int8 i, result=0x00;
   
   //output_high(PIN_A0);
   
   for(i=0; i<8; i++){
      if(ds18b20_read_bit())
         result |= (0x01 << i);
      delay_us(125);
   }
   //output_low(PIN_A0);
   return result;
}




void zahtevajNaslov(int address[8])
{
   int i;
   ds18b20_initialization();
   ds18b20_write_byte(0x33);
   for(i=0; i<8; i++)
   {
      address[i] = 1;
      address[i] = ds18b20_read_byte();
   }
   
   
   
   ds18b20_write_byte(0x44);  // zahteva meritev temperature
}


void izmeri_temp_A()   //int deviceN[]) // zahteva meritev
{
   int i;
   
   ds18b20_initialization();  // resetira senzorje
   ds18b20_write_byte(0xCC);  // izbere vse naprave
   //   call_device(deviceN);
   ds18b20_write_byte(0x44);  // zahteva meritev temperature
}

float izmeri_temp_B(int deviceN[8]) // prebere meritev
{
   int8 i=0;
   int8 scratchpad_data[9];
   signed int16 temp=0;

   for(i=0; i<9; i++) { scratchpad_data[i] = 0x00; }     // inicializacija 1-wire senzorjev

   call_device(deviceN);
   ds18b20_write_byte(0xBE);  // zahteva scratch pad
   for(i=0; i<9; i++) scratchpad_data[i]=ds18b20_read_byte();
   temp = (int)((make16(scratchpad_data[1], scratchpad_data[0]))/2);
   return ((float)temp - (float)0.25 + (float)((float)(scratchpad_data[7]-scratchpad_data[6])/(float)scratchpad_data[7]));
}

_________________
Zakaj bi bilo preprosto, če je lahko zakomplicirano???
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
vulgaris
Neznanec
Neznanec



Pridružen-a: Tor 25 Mar 2008 19:37
Prispevkov: 7
Aktiv.: 0.03
Kraj: prlekija

PrispevekObjavljeno: Tor Sep 06, 2011 5:29 pm    Naslov sporočila:   Odgovori s citatom

hvala za odgovor ampak se zame programska jezika prevec razlikujeta. prosil bi, da me nekdo usmeri na pravo pot, namreč problem je samo to da ne vem kako bi iz rezultata ds senzorja v bin obliki dobil rezultat v decimalni obliki in to shranil v neko variablo.
hvala

_________________
nikoli ni prepozno
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.15

PrispevekObjavljeno: Tor Sep 06, 2011 5:48 pm    Naslov sporočila:   Odgovori s citatom

V basicu sicer picev nisem nikoli programiral ampak v tvojem programu ne najdem dela, ki bi preklapljal kako ledico. Pripel si samo demo, ki izpisuje temperaturo na LCD. Drugače pa je spremenljivka temp tista, ki vsebuje vrednost izmerjene temperature. Če veš koliko je temp, potem res ni težko vklopit in izklopit lediko pri eni fiksni vrednosti. Žal ne vem kako se v basicu to napiše, ampak kar rabiš storiti, je v inicializaciji definirat pin na katerem je ledika kot output (TRISX,Y = 0) ter ga postavit na 0 (PORTX,Y = 0) ter definirat konstanto pri kateri želiš preklop.

Kasneje pri primerjavi vrednosti temp in konstante postaviš s pogojnim stavkom LED na 1 ali 0.

Upam, da je opis razumljiv...
Če ne ti pa bo kakšen basic programer naprej pomagal.

_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vulgaris
Neznanec
Neznanec



Pridružen-a: Tor 25 Mar 2008 19:37
Prispevkov: 7
Aktiv.: 0.03
Kraj: prlekija

PrispevekObjavljeno: Tor Sep 06, 2011 6:56 pm    Naslov sporočila:   Odgovori s citatom

hvala za post, ocitno sem se napacno izrazil, to je demo program ja, v njem res ni nobenega stavka za preklop ledice ali cesa drugega, niti ni problem v tem, problem se pojavi ker varibla temp enostavno ne deluje, verjetno je rezultat v binarni oblik,i jaz pa rabim decimalni zapis.

"moji poizkus uporabe temp variable:
if temp>20 then vklop
.
.
.
vklop:
high portb.1
.
.
""

kaki predlogi?

_________________
nikoli ni prepozno
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 17.60

PrispevekObjavljeno: Tor Sep 06, 2011 7:08 pm    Naslov sporočila:   Odgovori s citatom

Malo poglej, v kaki obliki senzor pošilja temperaturo... vrednost spremenljivke "temp" ni direktno temperatura v stopinjah Exclamation
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
vulgaris
Neznanec
Neznanec



Pridružen-a: Tor 25 Mar 2008 19:37
Prispevkov: 7
Aktiv.: 0.03
Kraj: prlekija

PrispevekObjavljeno: Sre Sep 07, 2011 7:11 am    Naslov sporočila:   Odgovori s citatom

ja to mi je jasno da temp ni direktna spremenljivka, dal sem samo primer kako bi spremenljivko uporabil. senzor poda temp v binarni obliki. v gornjem demo programu je ze pretvorjena in jo lcd izpise, jaz bi rabil samo kako spremenljivko dec (temp >> 1) pretvorim v uporabno obliko, saj if stavek z dec (temp >> 1) spremenljivko ne deluje. Rabil bi nekaj podobnega kot " senz=dec (temp >> 1), tako da bi potem spremenljivko senz uporabil v if stafku .
upam da je bolj razumljivo.
Hvala

_________________
nikoli ni prepozno
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 17.60

PrispevekObjavljeno: Sre Sep 07, 2011 7:32 am    Naslov sporočila:   Odgovori s citatom

Kaj je "binarno"?
Poglej datasheet od senzorja, kjer lepo piše, kaj kateri bit pomeni. Ko boš to vedel, ti tudi ne bo več problem pretvorit v kako drugo obliko. Ali pa kar direktno primerjavo naredit v if(), kot si v prejšnjem primeru naredil, samo cifra mora biti prava.
"20" pomeni +1,25 stopinje in ne +20 stopinj, kot si pričakoval Wink

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
vulgaris
Neznanec
Neznanec



Pridružen-a: Tor 25 Mar 2008 19:37
Prispevkov: 7
Aktiv.: 0.03
Kraj: prlekija

PrispevekObjavljeno: Sre Sep 07, 2011 8:48 am    Naslov sporočila:   Odgovori s citatom

Hvala na namigu, zadeva ze nekoliko bolj jasna in deluje, vsaj v proteusu Smile).
Najlepsa hvala.

_________________
nikoli ni prepozno
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 233 dni


Powered by phpBB © 2001, 2005 phpBB Group