Eksi derece gösteren Termometre

Başlatan POWER, 07 Aralık 2016, 00:14:14

POWER

Herkeze iyi geceler,
Elimde 3 digit led display ile ds18b20 kullanılarak yapılmış bir termometre devresi var.Genel çalışmasında problem yok.Sadece eksi derece gösterirken 0 ile 9 derece arasını -0.1  .......   -9.9 şeklinde,  sonrasını -10  -11   -12    -13 ........  şeklinde (3 digit olduğundan) gösdermesini istiyorum. tüm çabama rağmen tarif ettiğim gibi düzenleyemedim malesef.
isis dosyasını ekliyorum.
http://s3.dosya.tc/server9/i0m36a/TERMOMETRE.rar.html
DEFINE OSC 4
Include "MODEDEFS.BAS"
TRISB=%00010000    
TRISA=%00000000  
PORTA=0 
PORTB=0 
'-------------------------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_ON          'Kod Protek açık
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanıımıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-------------------------------------------------------------------------------
OPTION_REG=1   'Pull up dirençleri iptal
CMCON=7        '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-------------------------------------------------------------------------------
Comm_Pin    VAR	Portb.4  ' One-wire Data-Pin "DQ" PortB.0 da
Busy        VAR BIT      ' Busy Status-Bit
HAM         VAR	WORD     ' Sensör HAM okuma değeri
ISI         VAR WORD     ' Hesaplanmış ISI değeri
ISI1        VAR BYTE     ' Holds remainder for + temp C display
ISI2        VAR BYTE
X           VAR WORD  
SAYI        VAR BYTE
SYMBOL      DP=PORTB.0  

SIGN_BITI   VAR HAM.11'Bit11' +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
Negat_ISI   CON 1        ' Negatif_Cold = 1
Deg         CON 223      ' ° işareti
SIGN        VAR BYTE     ' ISI değeri için  +/-  işaret
TEMP        VAR BYTE     ' Div32 bit hesap için geçici değişken

gosub sensoryaz
gosub sensoroku
PAUSE 500
BASLA: 
         GOSUB SENSOROKU
         IF Sign = "+" then GOSUB EKRAN1
         IF Sign = "-" Then GOSUB EKRAN2
        
GOTO BASLA


EKRAN1:
       X=ISI1 Dig 1  'ISI1'in onlar basamağı((2.hane)
       GoSub AL
       IF X=0 THEN SAYI=0  
       GOSUB Cevir
       PORTB.1=1 
       PAUSE 3
       PORTB.1=0
            
       X=ISI1 Dig 0  'ISI1'in birler basamağı(3.hane)
       GoSub AL 
       GOSUB Cevir
       DP=1
       PORTB.2=1 
       PAUSE 3
       PORTB.2=0
                              
       X=ISI2 Dig 0  'ISI2'nin birler basamağı(4.hane)
       GoSub AL
       GOSUB Cevir 
       DP=0
       PORTB.3=1 
       PAUSE 3
       PORTB.3=0 
     
       RETURN

EKRAN2:
       IF Sign = "-" then                 '(2.hane)
       SAYI=64 
       else
       SAYI=0
       endif
       GOSUB Cevir
       PORTB.1=1 
       PAUSE 3
       PORTB.1=0
      
       X=ISI1 Dig 1  'ISI1'in onlar basamağı(3.hane)
       GoSub AL 
       GOSUB Cevir
       PORTB.2=1 
       PAUSE 3
       PORTB.2=0
                             
       X=ISI1 Dig 0  'ISI1'nin birler basamağı(4.hane)
       GoSub AL
       GOSUB Cevir 
       PORTB.3=1 
       PAUSE 3
       PORTB.3=0        
       
       Return  


AL:    LookUp X,[63,6,91,79,102,109,125,7,127,111,64],SAYI 
       Return 

Cevir:
PORTA.0=SAYI.0
PORTA.1=SAYI.1
PORTA.2=SAYI.2
PORTA.3=SAYI.3
PORTA.4=SAYI.4
PORTA.6=SAYI.5
PORTA.7=SAYI.6
RETURN
    
SENSOROKU: 
OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
GOSUB   Hesapla
        RETURN

SENSORYAZ: 'okumaya hazırlan..          
OWOUT   Comm_Pin, 1, [$CC,$4E,$FF,$FF,$7F];Hassasiyet 12 bit olarak ayarlanıyor
OWOUT   Comm_Pin, 1, [$CC,$48]          
OWOUT   Comm_Pin, 1, [$CC,$B8]          
OWOUT   Comm_Pin, 1, [$CC,$BE]          
return 
 
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN    'yani 1 ise
       Sign   = "-"  
       HAM=($FFFF-HAM)+1
    endif
    ISI = ham*10/16       ' 
GEC:
    ISI2 = (ISI //10)
    ISI1=ISI/10
RETURN       '
'Burada ISI1=sıcaklığın tam sayı kısmını,ISI2 ise ondalık kısmını göstermektedir.

END
TB6BKG

gönül_dostu

elinize  emeğinize sağlık  çok güzel olmuş....

mert3162

http://pdfserv.maximintegrated.com/en/ds/DS18S20.pdf

Burdaki pdf e göre

• Measures Temperatures from -55°C to +125°C
(-67°F to +257°F)
• ±0.5°C Accuracy from -10°C to +85°C

Elindeki sensörün ölçüm aralığının dar olmasından dolayı oluşuyor olabilirmi ?
|^^^^^^^^^^^^\ ||\
|__PICPROJE.ORG __
||'""|""\___
| _____________ l | |__|__|___| )
(@!)!(@)"""""**|(@) (@)****|(@)---------

 Üstadlarım nonstradam & Logan

ete

Sensör eksi dereceleri okur hassasiyetide iyidir. Zaten ondalık 1 hane gerekiyor ki kullandığı yönteme göre okuma zaten direk ondalıklı olarak yapılıyor. Bu durumda sıcaklık -10 derece ninaltında ise ondalık gösterecek değilse ondalık göstermeyecek. Bütün mesele bif if satırı eklenmesinde. Okunan derece -10 derece için (ISI değeri) 100 olarak okunuyor. Bu -10,0 dereceninkarşılığıdır. 9,5 derece için ise 95 olarak okunuyor. Bu durumda programa ISI değeri 100 den küçük ise ondalıklı göster değilse sadece tam sayı kısmını göster demek gerekiyor.
Çözüm EKRAN2 etiketi altındakilerin değiştirilmesinde yatıyor. Oradaki kodları tamamen silip şunları yazarsa olacak bu iş ;
EKRAN2:
       SAYI=64 :GOSUB Cevir
       PULSOUT PORTB.1,300
   
       IF ISI<100 THEN
         X=ISI1:GOSUB al:GOSUB CEVIR:DP=1
         PULSOUT PORTB.2,300:DP=0
         X=ISI2:GOSUB al:GOSUB CEVIR
         PULSOUT PORTB.3,300
       ELSE
         X=ISI1 DIG 1:GOSUB al:GOSUB CEVIR
         PULSOUT PORTB.2,300
         X=ISI1 DIG 0:GOSUB al:GOSUB CEVIR
         PULSOUT PORTB.3,300     
       ENDIF
       RETURN


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

POWER

TB6BKG