Proteusta çalışan derece yokmu?

Başlatan einstain90, 13 Ocak 2008, 21:34:48

einstain90

Arkadaşlar internette bir kaç tane termometre için kod buldum ama iki kod içinde proteusta çalışmıyor ama devrede çalışıyor demişler.Ama devreyide kurdum proteustaki hatanın aynını alıyorum ya 0 derece yazıyor yada hazır deil yazıyor.Başka ds1820lerlede denedim gene aynı hatayı aldım. Bağladığım direç değeride doğru.Acaba kodmu yanlış elinde picbasic kodu olan yollaya bilirmi.Yardım edin 4 lira verdim sensor aldım kullanamıyorum.
Her işte her zaman bir aksilik çıkar.Siz yeterki pes etmeyin...

ete

Anlaşılan sıcaklık sensörü olarak DS1820 aldın. Belkide DS18B20 aldın.
Bu iki sensörü sürekli karıştırıyorlar. İkiside aynı gibi olmasına karşılık kodlarında ufak fark var. Hangisini aldığına iyi bak. Aşağıda her iki sensöre ait okuma ve hesap program parçalarını bulacaksın.

Ete

DS1820 için Program;

        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, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Sayac]
           GOSUB   Hesapla
           RETURN
    
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    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


DS18B20 için Program
          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
           
                    
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------          
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       temp=($ffff-ham+1)*625
       ISI  = DIV32 100 
       GOTO GEC   
    endif
    TEMP = 625 * (HAM)        ' 
    ISI = DIV32 100          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    ISI2 = (ISI //100)/10
    ISI1=ISI/100
    RETURN


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

einstain90

Kullandığım entegre ds1820 aşağıdaki kodu kullandım bu seferde hep 00.2 yazıyor.Sorun ne olabilir.
TRISB=%00010000                                   

@ DEVICE pic16F877A            

DEFINE  LCD_DREG    PORTB
DEFINE  LCD_DBIT    0
DEFINE  LCD_RSREG   PORTB
DEFINE  LCD_RSBIT   7
DEFINE  LCD_EREG    PORTB
DEFINE  LCD_EBIT    6
DEFINE  LCD_EBITS    4
DEFINE  LCD_LINES   2
DEFINE  LCD_COMMANDUS   2000
DEFINE  LCD_DATAUS   50
DEFINE OSC 4


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      
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
SAYAC       VAR   WORD
KALAN        VAR WORD  
ISI2        VAR WORD
ISI1        VAR WORD       ' Div32 bit hesap için geçici değişken

 BASLA:
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, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Sayac] 
           GOSUB   Hesapla 
           RETURN 
    
Hesapla:                 ' Ham değerden Santigrat derece hesabı 
    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
    
      LCDOUT $FE,1 
    LCDOUT DEC2 ISI1,".",DEC1 ISI2," ",Deg,"C " 
    PAUSE 100
    RETURN 
    GOTO BASLA
Her işte her zaman bir aksilik çıkar.Siz yeterki pes etmeyin...

aslan_korhan

Sensörün uçlarını yanlış bağlamış olabilirmisin ?
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

einstain90

doğru bağladığıma kesin eminim ama bence kesin kodda hata var çünki hep proteusta hemde devrede aynı hata var.Sensor portb.4 e bağlı ve 1k direnç ile data ucu +5 e bağlı diğeride eksi zaten.Kodu bir incelemeniz mümkünmü?
Her işte her zaman bir aksilik çıkar.Siz yeterki pes etmeyin...

ahmet2004

Kod yazım hataları ile dolu:

BASLA: 
           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, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Sayac] 
           GOSUB   Hesapla 
           GOTO BASLA 

'************************************************************

Hesapla:                 ' Ham değerden Santigrat derece hesabı 
    Sign  = "+" 
    IF SIGN_BITI = NEGAT_ISI THEN 
       Sign   = "-"  
       ISI=((($ffff-ham+1)*50)-25)+ (((Sayac - Kalan) * 100) / Sayac)   
    ELSE 
         ISI = (((HAM) * 50) - 25) + (((Sayac - Kalan) * 100) / Sayac) 
         ISI=ISI-25
   ENDIF 
GEC: 
    ISI2 = (ISI //100)/10 
    ISI1=ISI/100 
    
    LCDOUT $FE,1 
    LCDOUT DEC2 ISI1,".",DEC1 ISI2," ",Deg,"C " 
    PAUSE 100 
    RETURN



Kod bu şekli ile ds18s20 ile çalışıyor.
Kodda eksikler var.ete'nin vermiş olduğu kod yazılımın sadece bir kısmı.
O yüzden yanlış yazmışsın.Stack hatası veriyor.

ete

Ahmet'in de dediği gibi kod yalnızca sensörün okuma ve hesap kısmını içeriyor. Bu okuma kısmı benim önceden Ds1820 ve DS18S20 sensörlerinde kullandığım bir bölüm ve çalışıyor. Üstelik denenmiştir.
Bu arada hemen belirteyim DS18S20 ve DS1820 sensörleri aynı kodu kullanmaktadır. Yalnızca 18B20 farklı kodla çalışmaktadır.

Verdiğim kod bir programın parçası olduğu için orada bu bölüme GOSUB ile gelinmekte ve RETURN ile dönülmektedir.
Sen bu kısmı aynen aldığın için GOTO ile geldiğin yerden RETURN ile dönmeye çalıştığından bir müddet sonra STACK şişecek ve program ya kitlenecek yada hata verip duracaktır.

Yapılacak işler;

- Öncelikle 18f877A kullandığın için analog girişleri digitale çevirmek üzere program başına ADCON1=7 komutunu ilave et.

- Gosub Hesapla
 RETURN
şeklindeki satırları şu şekilde düzelt
  GOSUB HESAPLA
  GOTO BASLA

- Hesapla adlı etiketin en sonlarındaki satırlar olan
 RETURN
 GOTO BASLA

satırlarından GOTO BASLA satırını çıkart (sil) zaten önünde RETURN şeklinde bir satır olunca program Goto Basla satırına hiç ulaşamıyacaktır. Fazlalık yalnızca.
Bu düzeltmeler ile çalışması gerek.
Şayet yinede çalışmıyor ise kullandığın isis sürümü veya DS18xx sensör model dosyaları hatalıdır.

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

einstain90

Malesef gene olmadı işte resmi ve kodlar.Acaba aynı kodla sizde deneye bilirmisiniz sizde çalışacakmı?

TRISB=%00010000                                   

@ DEVICE pic16F877A            

DEFINE  LCD_DREG    PORTB
DEFINE  LCD_DBIT    0
DEFINE  LCD_RSREG   PORTB
DEFINE  LCD_RSBIT   7
DEFINE  LCD_EREG    PORTB
DEFINE  LCD_EBIT    6
DEFINE  LCD_EBITS    4
DEFINE  LCD_LINES   2
DEFINE  LCD_COMMANDUS   2000
DEFINE  LCD_DATAUS   50
DEFINE OSC 4
ADCON1=7

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      
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
SAYAC       VAR   WORD
KALAN        VAR WORD  
ISI2        VAR WORD
ISI1        VAR WORD       ' Div32 bit hesap için geçici değişken

 BASLA:
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, 0, [HAM.LOWBYTE, HAM.HIGHBYTE, Skip 4, Kalan, Sayac] 
           GOSUB HESAPLA 
           GOTO BASLA 
    
Hesapla:                 ' Ham değerden Santigrat derece hesabı 
    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
    
      LCDOUT $FE,1 
    LCDOUT DEC2 ISI1,".",DEC1 ISI2," ",Deg,"C " 
    PAUSE 100
    RETURN 
  
Her işte her zaman bir aksilik çıkar.Siz yeterki pes etmeyin...

ete

Programı aynen kopyaladım ve çalıştırdım. DS yi 28,5 dereceye ayarladım ekranda da 28,5 gösterdi. Buda ormal çalıştığını gösteriyor
Dediğim gibi isis de yada model dosyalarında bir problemin var.

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

einstain90

Her işte her zaman bir aksilik çıkar.Siz yeterki pes etmeyin...

mustafa_cmbz

hocam bu vermiş olduğunuz kodlar ile ilgili basit bir seviye ayarlı ısı kesici yapabilirmiyiz yani mesela benim uyuglamamda diyelimki ısı 20  derece ise ısıtıclar çalışacak eğer 30 derece ise havalandırma bunun gibi bir kodu sizin verdiğiniz kodlar üzerinde oynama yaparak nasıl yapabilirim? yani sadece 2 değer değil tam daha belirlemedim sera için kullancağım 2 veya 3 değer tespit edip pic'ten belirli çıkışları 1 yapacağım ve bu pinler devrede ana pic'e gidecek ve ordan programa dahil olacak yani sistemde ısı ölçme işini ayrı bir pic'e yaptırmak istiyorum ayak sayısı yüzünden ve ana pic'teki program sade bişey olsun diye yardım edermisiniz hocam?

ete

Yardım ederim. Sen devreni yap şemayı buraya koy ona göre yaparız.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

recebcolak

selam.
arkadaşlar ds1820 ısı sensörü bu kodlarla -55 ile +65 derece arasında çalışıyor +65 den yukarı ısıları ölçmek için ne yapmak gerekli.teşekkürler.
ben herkesi sevdim bilmiyorum sevildimmi?

solidus

ds18b20 datasheetini bi inceleyiniz.. -55 ile +120 derece arasında olması gerek..
Kimine göre kralım kimine göre yalanım… Herkes rahatına baksın, ben adamına göre adamım..

recebcolak

Alıntı yapılan: "solidus"ds18b20 datasheetini bi inceleyiniz.. -55 ile +120 derece arasında olması gerek..

evet datasheetini inceledim benim sormak stedigim ete ustanın yazdıgı kodlar +65 dereceden yukarısını ölçmüyor bunu nasıl arttıra bilirim.
ben herkesi sevdim bilmiyorum sevildimmi?