Ete hocamın termometre devresindeki çözemediğim problem

Başlatan dyonizos, 21 Mayıs 2011, 09:38:18

dyonizos

merhabalar,aşağıda ete hocanın hazırladığı termometre devresinde sürekli - değer alıyorum.
nerde hata yapıyorum acaba 16f628 yerine 16f628A kullanıyorum bir değişiklik yapmam gerekiyormu acaba?


'*********************************
'*  Name    : KESMETMR0.BAS
'*  Author  : [Erol Tahir Erdal]
'*  Notice  : Copyright (c) 2005 [ETE]
'*          : All Rights Reserved
'*  Date    : 23.04.2005
'*  Version : 1.0
'*  Notes   :
'*          : (1) LCD
'*********************************
PORTA=0:portb=0
TRISB=%11110000   'PortB tamamı giriş yapıldı.
TRISA=%00000111   'A portu tamamı çıkış yapıldı.
'----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılıyor.
'@ DEVICE pic16F628, XT_OSC
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
DEFINE LCD_DREG      PORTB   'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT      4      'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG      PORTB   'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT      3      'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    2       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG   PORTB   'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   1      'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS      4      'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES   2      'LCD Kaç sıra yazabiliyor
DEFINE OSC 4
'-----------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-----------------------------------------------------------------
Comm_Pin    VAR   Portb.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
SIGN_BITI   VAR HAM.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
SAYAC       VAR   BYTE
SN          VAR   BYTE
DAK         VAR   BYTE
SAAT        VAR   BYTE
GUN         VAR   BYTE
symbol  SEC=PORTA.0
SYMBOL  YUKARI=PORTA.2
SYMBOL  ASAGI =PORTA.1
'------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200
LCDOUT $FE,1

'-----------------------------------------

BASLA:
      GOSUB EKRAN0        'SAATİ EKRANA YAZ
      if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT
      gosub SENSOROKU     'SONSÖR OKU VE SICAKLIĞI EKRANA YAZ
      GOTO BASLA

EKRAN0:
       LCDOUT $FE,$84,DEC2 SAAT,":",DEC2 DAK:RETURN

AYAR:
       WHILE SEC=0
       WEND
HOUR:  GOSUB EKRAN0
       LCDOUT $FE,$84
       lcdout $FE,$0E  'ÇİZGİLİ KURSÖR AÇIK
       IF SEC=0 THEN MINBIR
       IF YUKARI=0 THEN
          SAAT=SAAT+1
          IF SAAT=24 THEN SAAT=0
        ENDIF
        IF ASAGI=0 THEN
           SAAT=SAAT-1
           IF SAAT=255 THEN SAAT=23
        ENDIF
        GOSUB GECIKME
        GOTO HOUR

MINBIR: WHILE SEC=0
        WEND

MINUTE: GOSUB EKRAN0
       LCDOUT $FE,$87
        IF SEC=0 THEN SECBIR
        IF YUKARI=0 THEN
           DAK=DAK+1
           IF DAK=60 THEN DAK=0
        ENDIF
        IF ASAGI=0 THEN
           DAK=DAK-1
           IF DAK=255 THEN DAK=59
        ENDIF
        GOSUB GECIKME
        GOTO MINUTE

SECBIR: WHILE SEC=0
        WEND
SECOND:
        GOSUB EKRAN0
        LCDOUT $FE,$8A
        IF SEC=0 THEN ARA
        IF YUKARI=0 THEN
           SN=SN+1
           IF SN=60 THEN SN=0
        ENDIF
        IF ASAGI=0 THEN
           SN=SN-1
           IF SN=255 THEN SN=0
        ENDIF
        GOSUB GECIKME
        GOTO SECOND

GECIKME:
        FOR X=0 TO 1800
        PAUSEUS 100
        NEXT
        RETURN

ARA:    LCDOUT $FE,$0C
        WHILE SEC=0
        wend
'        gosub GECIKME
        goto BASLA

'-------ISI SENSÖR OKUMA BÖLÜMÜ ----------
SENSOROKU:
           'ham=$FE6F:Gosub hesapla:RETURN bu satır normal devrede silinecek
           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

Hesapla:                 ' Ham değerden Santigrat derece hesabı
    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          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=ISI/1000
    LCDOUT $FE,$C4,Sign,DEC ISI,".",DEC1 (Float)," ",Deg,"C " '2. satırda ısı
    RETURN

DISABLE
KESME:
      SAYAC=SAYAC+1  'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      IF SAYAC=61 then  '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0        'sayaç sıfırlanıyor
          SN=SN+1
          toggle portb.0       'saniye değeri bir artırılıyor
            IF SN=60 THEN  'saniye 60 olmuş ise 1 dakika süre geçti ohalde
              SN=0        ' saniye sıfırlanıyor
               DAK=DAK+1   ' dakika değeri bir artırılıyor
                  IF DAK=60 then   'dakika 60 olmuş ise 1 saat süre geçti
                     DAK=0         ' dakika sıfırlanıyor
                     SAAT=SAAT+1   ' saat değeri bir artırılıyor
                        IF SAAT=24 THEN  'saat 24 olmuş ise 1 gün geçti
                           SAAT=0        'saat sıfırlanıyor
'                           GUN=GUN+1     'gün değeri bir artırılıyor
'                              IF GUN=365 THEN GUN=0  'gün 365 olmuş ise
                        endif                    'gün sıfırlanıyor 1 yıl geçti
                  ENDIF
            ENDIF
           lcdout $fe,$89,":",DEC2 SN
          ENDIF
CIK:     INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE

END

Mucit23

configürasyon ayarlarını bu şekilde değiştir yeter
@ 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_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

Başkada bir değişiklik yapmana gerek yok

dyonizos

bu değişiklikleri yapmıştım zaten kodlarda kopyalarken buraya eski  hali gelmiş. Zaten bu değişiklikler olmayınca Compile edemiyorsun.
Ancak bu değişiklikler devrenin çalışmasını sağlıyor ancak ekranda -30 derece görüyorum ısı arttıkca - deger azalıyor yani ısı artısını normal algılıyor ancak ortam ısısını yaklasık 50 derece eksık goruyor .

dyonizos

her şekli denedim nette ki ete termometre devrelerinin neredeyse hepsini denedim hepsinde -30-32 derece arası bir deger alıyorum ısı arttıkca deger 0 a dogru ılerlıyor ve sonunda + ya gecıyor ancak ısıyı kestıgım anda sankı oda sıcaklıgı -32 dereceymıs gıbı pat dıye yıne bu degerlere donuyor.
kımsenın basına gelmedımı acaba bu ?

hatmeto

DS18B20 bozuk. Aynı problemle karşılaştım. değiştirince düzeldi.. ;)
Bir admin ataasözü derki: "biliyorsan paylaş mod yapsınlar. bilmiyorsan sus banlamasınlar"

dyonizos

bugun yeni bir DS18b20 aldım onu taktım ancak yıne aynı sonucu alıyorum. Orda sıcaklıgında bıle -30 derece gösterıyor. Bır turlu pozitif deger alamadım.
Bu konuda fikri olan varmı acaba?

fatihkuzucu

Exp.Kits http://tinyurl.com/3qhs8pm   Küçük adamların, küçük fikirleri... Büyük adamların, büyük hayalleri...

ete

Programda sensör okuma alt programını bul. Orada yer alan ilk satırın açık olup olmadığına bir bak lütfen.
Muhtemelen aşağıdaki gibi bir satır olması gerek.
'           ham=$FFBF:Gosub hesapla:RETURN  'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK
Bu satırı bazen sensörü okunmuş gibi yaptırmak ve okumada zaman kaybetmeden bir şey denemek için koymuştum. Satır açık kalmış olabilir. Oda "-30" derece gösteriyor olabilir.

Bence o satrı tamamen sil ve yeniden dene bakalım.

Ete

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

dyonizos

 'ham=$FE6F:Gosub hesapla:RETURN  'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK
seklınde bır satır var ve kapatmısım zaten o satırı.
Bu oda sıcaklıgındakı deger zaten sabıt degıl yani -30 sürekli gösterdıgı deger degıl. Isındıgı zaman -28 ve daha farklı degerlere dogru cıkıyor yani 0 a yaklasıyor. Cok ısıtırsam + degere cıkıyor. Sogudugu zamanda -30 un altına ınıyor.
ıkı tane var elımde bugun aldım bır tanesını 18b20 ıkısınınde bozuk olma ıhtımalı yoktur sanırım. Bır yerde bır hata yapıyorum ama nerde bulamadım. Acaba 18b20 degılde 1820 mı kullanmam gerekıyor.

F.T

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

dyonizos

valla yarın bır tane daha alıcam ama pek ıhtımal vermıyorum cunku elımdekı ıkı sensorder (aslında ıkısıde yenı) ayını ısı degerlerını verıyor. farklı degerler vermıyor.

ete

Programı yazdıktan sonra belkide 100 denfazla çalışmıyor , eksik gösteriyor hiç göstermiyor şeklinde mesajlar aldım.
Zaman zaman yine de alıyorum bu tip mesajları. Şimdiye kadar çalışmayan hiç bir devrem olmadı. Pek çoğunu kendim bizzat yaparak test etmişimdir. Termometre devrelerinden pek çok kere fiziki olarak yaptım ve hiç sorun yaşamadım.
Bu durumda kusur sende olmalı. Sende derken devreni kast ediyorum.
Yapılacak kontroller şunlar olmalı bence,
Bir defa besleme voltajını kontrol et. Tam olarak 5V pic'e ve sensöre geliyormu?
Pullup direncini küçült şayet 10K kullandı isen. Aslında 4K7 kullanmanı öneririm.
Sensör kablosu uzunmudur?. Şayet uzun ise 30 Cm lik bir kabloile deneme yapmanı da öneriyorum.
Başkada yapacak bir şey yok sanırım.
Üstelik internette başka devreler de bulduğunu ve onlarında aynı neticeyi verdiğini söylemişsin.
Bu da sensörün arızalı olması ihtimalini kuvvetlendiriyor.
Yeni aldım diye sensöre pek güvenme. Piyasada o kadar çok bozuk malzeme varki şaşarsın.
Yeni sensör alırken mutlaka dükkan değiştir . Başka yerden almaya çalış.

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

dyonizos

tesekkurler hocam.
yarın farklı yerden alacagım sensorlerı denıycem.
dedıgınız gıbı sorun benım kodlarımda yada sensorumde. dırenclerde her zaman ve heryerde 4.7k kullanıyorum zaten alıskanlık oldu :)
breadboard uzerınde calısıtıg ıcın devre sensorle pıc arasındakı kablo en fazla 10cm.
dedıgınız gıbı devreyı yanımda goturup aldıgım yerdekı sensorlerı tek tek takıp denıycem.

tesekkurler tekrar