Pic Basic Pro - DS1820 Termometre Sorunu

Başlatan umberto, 28 Nisan 2009, 10:15:50

umberto

Selamlar

DS18S20 - 1 Wire Dijital Termometre Entegresi ile termometre devresi yapmaya çalışıyorum. Aşağıdaki kod ile denemeler yapıyorum fakat ısı 0'ın altına düşünce 65500 gibi değerler yazıyor. -5 -10 vb gibi anlamlı değerler okuyabilmem için ne yapmam gerekiyor?

Teşekkürler

   TEMP     VAR  WORD			
    TEMP1    VAR  BYTE			
    TEMP2    VAR  BYTE
    
    TRISA=%00000000
    TRISB=%00000001
  
    DQ	VAR	PORTB.0		' 1-wire data pini

    CMCON=7				
    clear
       
START:
   Call  THERM
   Call  DISP
   ;PAUSE  1000
   GoTo  START
                                             
THERM
     OWOut DQ, 1, [$CC, $44]       
THERM1
     OWIn DQ, 4, [TEMP1]	
     IF TEMP1 = 0 Then
       GoTo THERM1
     EndIF
     
     OWOut DQ, 1, [$CC, $BE]		
     OWIn DQ, 0, [TEMP.LowByte, TEMP.HighByte, Skip 4, TEMP1, TEMP2]
     TEMP = (((TEMP >> 1) * 100) - 25) + (((TEMP2 - TEMP1) * 100) / TEMP2)
         	
return              
;                         
DISP
   LCDOut $fe, 1
   LCDOut $fe, 2   
   LCDOut  "   TERMOMETRE   "   
   LCDOut $fe, $C0,"    ",DEC (TEMP / 100), ".", DEC2 TEMP, " C" 
return            		
;    
End

ete

Birde aşağıdakileri dene;
Önce değişkenler bölümünde SIGN VAR BYTE isimli bir değişken tanımla.
sonra,
  OWOut DQ, 1, [$CC, $BE]      
     OWIn DQ, 0, [TEMP.LowByte, TEMP.HighByte, Skip 4, TEMP1, TEMP2]
  Sign  = "+"
    IF TEMP.11=1 THEN
       Sign   = "-"  
       TEMP=((($ffff-TEMP+1)*50)-25)+ (((TEMP2 -TEMP1) * 100) / TEMP2)
       RETURN
    endif
   TEMP = (((TEMP) * 50) - 25) + (((TEMP2 - TEMP1) * 100) / TEMP2)
   RETURN            
                       
DISP:
   LCDOut $fe, 1
   LCDOut $fe, 2   
   LCDOut  "   TERMOMETRE   "   
   LCDOut $fe, $C0,"    ",SIGN,DEC (TEMP / 100), ".", DEC2 (TEMP//100), " C"
return   
  


Okunan sıcaklık TEMP değişkeninde tutulmaktadır. Bunun 11. biti sıcaklığın sıfırın altındamı yoksa üstündemi olduğunu belirlemektedir. Bu bit 1 ise sıcaklık eksi sıfır ise sıcaklık artı değerde olacaktır. Bu nedenle program içinde bu bitin kontrolünü yapıp ona göre eksi sıcaklığı gösterecek bir tedbir alınması gerekir. Yukarıda bu yapılmıştır.


              E T E
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ferit06

TEMP değişkeniniz WORD olarak atamışşınız. WORD değişkenler 0-65535 arası değer alabilir (-) değer alamazlar bu nedenle sonuç (-) değer olduğunda işaretsiz olarak 65500 gibi değerler çıkar.

Formulunüzde değişiklik yaparak (-) değer çıkmamasını sağlamalısınız.

Status, Carry bitini kontrol ederek işlem yapmanız gerekir.

Murat Mert

Akadaşım ETE hocamız burada "-" işertini sembol olarak göstermiş.
Buda benim Proton basic de yaptığım program. Kolay gelsin.

 
        Device = 16F628    
        XTAL = 4
        REMARKS = On
        WATCHDOG = OFF
        MACRO_PARAMS = On

		LCD_DTPIN = PORTB.4	
		LCD_RSPIN = PORTB.3
		LCD_ENPIN = PORTB.0
		LCD_INTERFACE = 4	
		LCD_LINES = 2
              LCD_TYPE = 0
                                

        Symbol DQ = PORTA.0   
        Dim Temp As Word    
        Dim D As Byte
        Dim C As Byte     
        Dim CPerD As Byte    
        Dim ISARET As Byte
        Symbol AR = "+" 
        Symbol EK = "-"
        Symbol SIF = " "
        Symbol RS485 = PORTA.2
        Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00
        Cls             
        ACILIS:
        Print At 1,1, "     DS1820     "
        Print At 2,1, "   TERMOMETRE   "
        DelayMS 1000
        Print At 1,1, "     Dizayn     "
        Print At 2,1, "   muratmert4   "
        DelayMS 1000
        Cls
        GoTo BASLA
        BASLA:  
        '***DS OKUMA VE HESAPLAMA***
        OWrite DQ, 1, [$CC, $44]   
        Repeat 
        DelayMS 30     
        ORead DQ, 4, [C]     
        Until C <> 0    
        OWrite DQ, 1, [$CC, $BE]  
        ORead DQ, 2,[Temp.LowByte,Temp.HighByte, C, C, C, C, C, CPerD] 
        Print At 2,1, Dec C
        If C = 255 Then ARIZA  '***SENSOR KOPUK ISE***

        '***ISARET KISMI "-" VE "+"***

        If Temp=0 Then ISARET = SIF
        If Temp>0 Then ISARET = AR
        If Temp>500 Then  '***EGER DEGER EKSI ISE***
        Temp=65536-Temp
        ISARET = EK
        EndIf
        
         '***EKRANA VE YAZILACAK DEGER HESAPLAMASI***
        
        Print At 1, 1, ISARET, Dec (Temp>>1), ".", Dec (Temp.0 * 5),0,"C  DERECE "
       Print At 2, 1, "   muratmert4   "
      GoTo BASLA
        
        '***SENSOR ARIZA KISMI ARIZA***
        
        ARIZA:

        Print At 1,1, "  DS1820 SENSOR  "
        Print At 2,1, "BAGLANTI HATASI "
        DelayMs 5000
                Cls
        GoTo BASLA '***SENSORU TEKRAR KONTROL ET***
mert07

ferit06

mert07,
protonda yazmış olduğunuz programda temp değişkenini float olarak tanımlayabilirdiniz. Bu durumda negatif değer kontrolune gerek kalmazdı ve kolayca LCD de gösterebilirdiniz. Sanırım temp değişkeninin float olarak tanımlanması bu program için 16F628 de program belleği sorunu yaratmaz idi.....

Diğer taraftan ETE hocamızın yazdığı program parçasında ise "GOTO DISP komutunun olduğu satıra gerek yoktu...

ete

Yazdığım kod da goto disp yerine Return olması gerek. Orda hata yapmışım düzeltiyorum.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

muhittin_kaplan

iyi çalışmalar
protonla ds1820 ile "termostat" yapmayı planlıyorum. yanlız takıldığım konu 1820 den alınan bilginin hesaplanması. yani nasıl ondalık kısmı ve tam kısımlar ayırd ediliyor.- ve + kısım nasıl anlaşılıyor. yardım ederseniz sevinirim.