4x18B20 ile sıcaklık ölçün

Başlatan ilker_32, 15 Şubat 2009, 22:50:05

ilker_32


DEFINE LCD_DREG     PORTB      
DEFINE LCD_DBIT     4           
DEFINE LCD_RSREG    PORTB       
DEFINE LCD_RSBIT    0          
DEFINE LCD_EREG     PORTB      
DEFINE LCD_EBIT     1           
DEFINE LCD_BITS     4          
DEFINE LCD_LINES    4           

TRISB=0
TRISD=%00001111
PORTB=0
PORTD=0

Comm_Pin     VAR Portd.0
Comm_Pin1    VAR Portd.1
Comm_Pin2    VAR Portd.2
Comm_Pin3    VAR Portd.3
Busy         VAR BIT
HAM          VAR WORD
ISI          VAR WORD
ISI1         VAR WORD
ISI2         VAR WORD
ISI3         VAR WORD
SIGN         VAR BYTE
SIGN1        VAR BYTE
SIGN2        VAR BYTE
SIGN3        VAR BYTE

SIGN_BITI   VAR HAM.Bit11
NEGAT_ISI   CON 1
Deg         con 223
TEMP        VAR BYTE
Float       VAR WORD

basla:
gosub sensor
gosub sensor1
gosub sensor2
gosub sensor3
gosub reklam
gosub disp
goto basla
;*******************************************************************************
sensor

           OWOUT   Comm_Pin, 1, [$CC, $44]
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    
           IF      Busy = 0 THEN Bekle  
           OWOUT   Comm_Pin, 1, [$CC, $BE]
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]
           GOSUB   Hesapla
           RETURN
    
Hesapla:              
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10 
       GOTO GEC   
    endif
    TEMP = 625 * (HAM+1)       
    ISI = DIV32 10          
GEC:
    FLOAT = (ISI //1000)/100
    ISI=ISI/1000
    RETURN
 ;******************************************************************************   
 sensor1

           OWOUT   Comm_Pin1, 1, [$CC, $44]
Bekle1:
           OWIN    Comm_Pin1, 4, [Busy]    
           IF      Busy = 0 THEN Bekle1  
           OWOUT   Comm_Pin1, 1, [$CC, $BE]
           OWIN    Comm_Pin1, 2, [HAM.Lowbyte, HAM.Highbyte]
           GOSUB   Hesapla1
           RETURN
    
Hesapla1:              
    Sign1  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign1   = "-"  
       temp=($ffff-ham+1)*625
       ISI1  = DIV32 10 
       GOTO GEC1   
    endif
    TEMP = 625 * (HAM+1)       
    ISI1 = DIV32 10          
GEC1:
    FLOAT = (ISI1 //1000)/100
    ISI1=ISI1/1000
    RETURN
 ;******************************************************************************
  sensor2

           OWOUT   Comm_Pin2, 1, [$CC, $44]
Bekle2:
           OWIN    Comm_Pin2, 4, [Busy]    
           IF      Busy = 0 THEN Bekle2  
           OWOUT   Comm_Pin2, 1, [$CC, $BE]
           OWIN    Comm_Pin2, 2, [HAM.Lowbyte, HAM.Highbyte]
           GOSUB   Hesapla2
           RETURN
    
Hesapla2:              
    Sign2  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign2   = "-"  
       temp=($ffff-ham+1)*625
       ISI2  = DIV32 10 
       GOTO GEC2   
    endif
    TEMP = 625 * (HAM+1)       
    ISI2 = DIV32 10          
GEC2:
    FLOAT = (ISI2 //1000)/100
    ISI2=ISI2/1000
    RETURN
 ;******************************************************************************
  sensor3

           OWOUT   Comm_Pin3, 1, [$CC, $44]
Bekle3:
           OWIN    Comm_Pin3, 4, [Busy]    
           IF      Busy = 0 THEN Bekle3  
           OWOUT   Comm_Pin3, 1, [$CC, $BE]
           OWIN    Comm_Pin3, 2, [HAM.Lowbyte, HAM.Highbyte]
           GOSUB   Hesapla3
           RETURN
    
Hesapla3:              
    Sign3  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign3   = "-"  
       temp=($ffff-ham+1)*625
       ISI3  = DIV32 10 
       GOTO GEC3   
    endif
    TEMP = 625 * (HAM+1)       
    ISI3 = DIV32 10          
GEC3:
    FLOAT = (ISI3 //1000)/100
    ISI3=ISI3/1000
    RETURN
 ;******************************************************************************
   reklam
   LCDOut $fe, 1 : PAUSEUS 50
   LCDOUT "********************"
   lcdout $fe, $C0,"********SOFIE********"
   LCDOut $fe, $94,"*****ELECTRONICS*****"
   LCDOut $fe, $D4,"********************"
   PAUSE 4000
RETURN 
    
    disp
    lcdout $FE,1 : pauseus 50
    LCDOUT " 1.SICAKLIK : ",Sign,DEC ISI,Deg,"C"
    LCDOUT $FE, $C0," 2.SICAKLIK : ",Sign1,DEC ISI1,Deg,"C" 
    LCDOUT $FE, $94," 3.SICAKLIK : ",Sign2,DEC ISI2,Deg,"C"
    LCDOUT $FE, $D4," 4.SICAKLIK : ",Sign3,DEC ISI3,Deg,"C"
    pause 1000    
    return     		
End


Değerli bilgilerini bizimle paylaşan ETE hocaya sonsuz teşekkürler...

Kolay Gelsin...

aykut54

selam ilker paylaştığın uygulama için teşekkürler

sensör sayısını arttırabilirmiyiz?arttırırsak mesela  o yaptın uygulamada göre kaç tane sensör daha koyabiliriz?

sevgili ete hocamızın müstesna bilgileri sağolsun programcıı yaptı bizi:D

ilker_32

Tabi arttırabilirsin. Fakat, sensör okuma oldukça yavaşlar eğer daha fazla sensör okuyacaksan tüm DS'lerin datalarını ortak yapabilirsin. Gerekli bilgi datasheet'de yazıyor.

Maxim

bu sensörleri tek hat üzerine takabilmemiz lazım ,
ama bu konuda hiç bir örneğe rastlamadım ,

yani her DS18B20 sensöründe fabrika tarafından verilmiş bir ID numarası var ,dolayısı ile 10 tane sensörü bile tek bir hat üzerine takabiliyor olmamız lazım.

hatta ,
bu sensörlerin farklı bir versiyonu daha var ,
parasite power .
DS18B20-PAR
bunlarda ise gerçekten tek bir hat üzerinden bilgi alıyorsunuz ,
yani sadece data ve şase ,besleme yok .

normalde ,data + besleme + şase .

MURSEL

aynı hatta 78 adet sensorü baglayarak  kontrol sistemi kurmustum

alayli

@maxiboost'un da dediği gibi tek bir pin ile bir çok 1 wire cihazı okumak mümkün. Fakat bunun için maxim'in 187 nolu uygulama notunu iyice anlamak gerekiyor. Bu uygulama notu bir tür "arama algoritması (search algorithm)"nı açıkça anlatır. Bit bazında ROM taraması esasına dayanır. Buradan bakabilirsiniz...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

alayli

Alıntı yapılan: "maxiboost"........ama bu konuda hiç bir örneğe rastlamadım......

Artık rastlaşabilirsiniz örnekle... Sanırım sen proton+ kullanıyordun.Burada bir örnek var.
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

Maxim

Alaylı ,
şunları inceleyeyim ,sağol ..

cetinkaya

bu devredeki elemanlar ds18s20 mi yoksa ds18b20 arasinda fark varmi ??

Maxim

Alıntı yapılan: "rck8942"bu devredeki elemanlar ds18s20 mi yoksa ds18b20 arasinda fark varmi ??

farklı ,

devrede DS18B20 kullanılmış ,

DS18S20 nin kodları biraz farklı ,

aynı zamanda
DS18S20 ,DS1820 nin yeni versiyonu
o yüzden DS18S20 ile DS1820 nin kodları aynı

cetinkaya

ayni islemi ds18s20 de yapmak istiyorum bu kodu derlemeye calisinca pbp hata veriyor bi yardim ederseniz sevinirim tesekkürler

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 16.02.2009                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F877A  
@ DEVICE pic16F877A, WDT_OFF 
@ DEVICE pic16F877A, PWRT_ON 
@ DEVICE pic16F877A, PROTECT_OFF 
@ DEVICE pic16F877A, HS_OSC 
Define OSC	20

DEFINE LCD_DREG     PORTB       
DEFINE LCD_DBIT     0           
DEFINE LCD_RSREG    PORTB       
DEFINE LCD_RSBIT    4           
DEFINE LCD_EREG     PORTB       
DEFINE LCD_EBIT     5           
DEFINE LCD_BITS     4           
DEFINE LCD_LINES    2           
            

TRISB=0 
TRISD=%00001111 
PORTB=0 
PORTD=0 
Comm_Pin     VAR Porta.5
Busy         VAR BIT 
HAM          VAR WORD 
ISI          VAR WORD
SIGN         VAR BYTE

SIGN_BITI   VAR HAM.Bit11 
NEGAT_ISI   CON 1 
Deg         con 223 
TEMP        VAR BYTE 
Float       VAR WORD 

basla: 
gosub sensoroku

SENSOROKU: 
OWOUT Comm_Pin, 1, [$CC, $44]' ISI degerini oku 
Bekle: 
OWIN Comm_Pin, 4, [Busy] ' Busy degerini oku 
IF Busy = 0 THEN Bekle ' hala mesgulmü? , evet ise goto Bekle..! 
OWOUT Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku 
OWIn Comm_Pin, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Sayac] 
GOSUB Hesapla 
RETURN 


Hesapla: ' Ham degerden Santigrat derece hesabi 
Sign = "+" 
IF SIGN_BITI = NEGAT_ISI THEN 
Sign = "-" 
ISI=((($ffff-ham+1)*50)-25)+ (((Sayac - Kalan) * 100) / Sayac) 
GOTO GEC 
endif 
ISI = (((HAM) * 50) - 25) + (((Sayac - Kalan) * 100) / Sayac) 
' ISI=ISI-25 
GEC: 
ISI2 = (ISI //100)/10 
ISI1=ISI/100 
RETURN

tnen

http://picproje.org/index.php/topic,16168&highlight=

buradada DS nin seri numarası family codeu ve CRC kodu okuyabileceğiniz kod mevcut arkadaşlar. Bunları bildikten sonra tek hat üzerinden DSler bağlanabilir.

cetinkaya

tm ustada benim sorunum baska

tnen

Kalan , sayac, ısı1 ve ısı2 yi tanımlamamışsın bunları değişken   turune gore program başında tanımla

solidus

İlker tebrik ediyorum seni. Kodlar bu hali ile - ısılarda çalışıyor. +65 derecenin üzerini okumuyor. Hata bendemi yoksa proteus kandırıyormu beni ? Birde sanırsam bu şekilde düzenlenen devreler 1wire teknolojisinin mantığına biraz aykırı değil mi ?
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..