B

16F den 18F'e

Başlatan BAHAR, 01 Mart 2013, 14:28:45

BAHAR

Merhabalar, bir kod konusunda birşey farkettim ancak durumu anlayamadım. Forumdan ETE bey'in yazmış olduğu DS18B20 sensöründen sıcaklık okuma basic kodlarını 18F452'ye uyarlamaya çalıştım. Fakat şu sorun var; 16F serisi Pic'ler de sensörden sıcaklık ondalıklı okunabilirken(20.0,20.1 ... gibi) 18F452 ile sıcaklık sadece şu şekilde okunabiliyor;

20.0 -> 20.5 -> 21.0 ...

Acaba neden bu şekilde okuma yapılıyor?  :o


16F serisi ile sağlıklı okunan kodlar, 18F452 için çevirme yapıldığında ondalıklı okunamıyor.

TRISB=0   
TRISA=0
CMCON=7 '16f serisinde etkin. 
'ADCON1=7 ' 18f serisinde etkin.
'----------------------------------------------------------------------------
SYMBOL Comm_Pin=PortA.0     ' 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
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD 
SAYI        VAR BYTE   
SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1           ' Negatif_Cold = 1
SIGN        VAR BYTE        '  ISI değeri için  +/-  işaret

CLEAR

SYMBOL  DTA=PortB.0
SYMBOL  CLK=PORTB.1
symbol  ST=PORTB.2

Gosub sensoryaz
gosub sensoroku
GOSUB BEKLE

BASLA:
GOSUB BEKLE
GOSUB SENSOROKU
GOSUB EKRAN1         

GOTO BASLA
'-----------------------alt programlar-------------------------------------------       
TEKRAR:
       SHIFTOUT DTA,CLK,1,[SAYI]
       RETURN

AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
     

EKRAN1: 
     
X=11:GOSUB AL:GOSUB TEKRAR
X=10:GOSUB AL:GOSUB TEKRAR

X=FLOAT DIG 0
GOSUB AL
GOSUB TEKRAR
X=FLOAT DIG 1
GOSUB AL
;SAYI=SAYI+128
GOSUB TEKRAR
X=FLOAT DIG 2
GOSUB AL
IF X=0 THEN SAYI=0
GOSUB TEKRAR       

SAYI=0
GOSUB TEKRAR
GOSUB STYAZ

RETURN

STYAZ:     
HIGH st:PAUSEUS 2:LOW st
RETURN         

'-------------------------------------------------------------------------------     
'----------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SENSOROKU:
'-----------------DİKKAT İSİS'de BU SATIR AKTİF EDİLECEK----------------------
'           ham=$005e:Gosub hesapla:return 'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK
'------------------------------------------------------------------------------
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
           return
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:
          OWOUT   COMM_Pin, 1, [$CC, $4E, $00,$00,$00,$00,$7F]
          return           
             
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16  'sıcaklık 23,7 iken  FLOAT=237 hesaplanır.        '       
    ISI=FLOAT/10      'ISI=23 hesaplanır
    RETURN               
         
END

         
                     

Mucit23

#1
Sensör 9 bit okuma yapmak için ayarlanmış. 9 bitte 0.5 derece hassasiyetle ölçüm yapılır.

SENSORYAZ isimli alt programı aşağıdaki gibi değiştirin

SENSORYAZ:
          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

Edit...

Pardon. 16F de çalışıyor diyorsun. O halde Sorun başka yerde olmalı...
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal