PBP deki sample program hatası

Başlatan efe1409, 30 Haziran 2006, 14:21:33

efe1409

Arkadaşlar PBP sample'ında bulunan DS1820 için bulunan örnek programı derlediğimde aşağıdaki hatayı veriyor.Board'da bulunanları denediğimde ise simülasyon yaparken döngüye giriyor.Bu sorunu nasıl çözebiliriz.Teşekkürler.

Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
DEFINE LCD_LINES 4
Define button_pause 50
TRISC=%11111111
TRISB=%00000000
TRISD=%00001111
'TRISA=%00000

temperature var word
count_remain var byte
count_per_c var byte
DQ var PORTA.0

ADCON1=%100000010

CLEAR  
PAUSE 200
LCDOUT $FE,1

ana:
gosub isioku

goto ana

isioku:
owout DQ,1,[$CC,$28,$4c,$28,$5f,$0,$0,$0,$92,$44]
waitloop: owin DQ,4,[count_remain]
          if count_remain=0 then waitloop
          owout DQ,1,[$CC,$BE]
          owin DQ,0,[temperature.LOWBYTE,temperature.highbyte,Skip 4,count_remain,count_per_c]
         temperature=(((temperature>>1)*100)-25)+((count_per_c-cout_remain)*100) BU SATIRDA HATA VERİYOR
          lcdout $fe,$d4, dec (temperature/100),".",dec2 temperature," C"
          pause 1000
          return
Vatanın bağrına düşman dayamış hançerini, Yok mudur kurtaracak bahtı kara maderini (Anasını)                                                                       Namık Kemal

Logan

Efe1409, hata veren satırı yazarken;
((count_per_c-cout_remain)*100) iki byte'ı birbirinden çıkarmak yerine,
çıkarma işlemini komutun dışında yapıp, sonucu 100 ile çarpsan daha iyi olur bence.Mesela

Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
DEFINE LCD_LINES 4
Define button_pause 50
TRISC=%11111111
TRISB=%00000000
TRISD=%00001111
'TRISA=%00000

temperature var word
count_remain var byte
count_per_c var byte
sonuc var word
DQ var PORTA.0

ADCON1=%100000010

CLEAR
PAUSE 200
LCDOUT $FE,1

ana:
gosub isioku

goto ana

isioku:
owout DQ,1,[$CC,$28,$4c,$28,$5f,$0,$0,$0,$92,$44]
waitloop: owin DQ,4,[count_remain]
if count_remain=0 then waitloop
owout DQ,1,[$CC,$BE]
owin DQ,0,[temperature.LOWBYTE,temperature.highbyte,Skip 4,count_remain,count_per_c]
sonuc=count_per_c-count_remain
temperature=(((temperature>>1)*100)-25)+(sonuc*100)
lcdout $fe,$d4, dec (temperature/100),".",dec2 temperature," C"
pause 1000
return

Ben derledim.Gayet sağlıklı.
İmza.

ete

@efe1409,

Ds1820 veya DS18S20 sensörleri için aşağıdaki program parçasını kullan.

sensoroku:

           owout   comm_pin, 1, [$cc, $44]                 ' ısı değerini oku
bekle:
           owın    comm_pin, 4, [busy]                         ' busy değerini oku
           ıf      busy = 0 then bekle                             ' hala meşgulmü? , evet ise goto bekle..!
           owout   comm_pin, 1, [$cc, $be]                 ' scratchpad memory oku
           owın    comm_pin, 0, [ham.lowbyte, ham.hıghbyte, skip 4, kalan, sayac]
           gosub   hesapla
           return
   
hesapla:                 
    sign  = "+"
    ıf sıgn_bıtı = negat_ısı then
       sign   = "-" 
       ısı=((($ffff-ham+1)*50)-25)+ (((sayac - kalan) * 100) / sayac)
       goto gec   
    endif
    ısı = (((ham) * 50) - 25) + (((sayac - kalan) * 100) / sayac)
'    ısı=ısı-25  'bana göre bu düzeltme yapılmalı ama datasheet de verilen formül öyle demiyor
gec:
    ısı2 = (ısı //100)/10
    ısı1=ısı/100
    return


Değişkenleri tanıtılma şekli için benim saat programlarına bakabilirsin.

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

efe1409

@ete hocam;
aşağıdaki kodlarda Proteus simülasyonu yaparken döngüye giriyor.
sensoroku:

          owout   comm_pin, 1, [$cc, $44]                 ' ısı değerini oku
bekle:
          owın    comm_pin, 4, [busy]                         ' busy değerini oku BUSY DEĞİŞKENİ SÜREKLİ OLARAK 0 GÖZÜKÜYOR.Acaba kullandığım versiyondan mı yapıyor anlayamadım.           ıf      busy = 0 then bekle                             ' hala meşgulmü? , evet ise goto bekle..!
          owout   comm_pin, 1, [$cc, $be]                 ' scratchpad memory oku
          owın    comm_pin, 0, [ham.lowbyte, ham.hıghbyte, skip 4, kalan, sayac]
          gosub   hesapla
          return
   
hesapla:                  
   sign  = "+"
   ıf sıgn_bıtı = negat_ısı then
      sign   = "-"
      ısı=((($ffff-ham+1)*50)-25)+ (((sayac - kalan) * 100) / sayac)
      goto gec    
   endif
   ısı = (((ham) * 50) - 25) + (((sayac - kalan) * 100) / sayac)
'    ısı=ısı-25  'bana göre bu düzeltme yapılmalı ama datasheet de verilen formül öyle demiyor
gec:
   ısı2 = (ısı //100)/10
   ısı1=ısı/100
   return
Vatanın bağrına düşman dayamış hançerini, Yok mudur kurtaracak bahtı kara maderini (Anasını)                                                                       Namık Kemal

efe1409

@ete hocam;
Döngü problemini çözdüm.DQ port tanımlamasını değiştirince sorun haloldu.
Vatanın bağrına düşman dayamış hançerini, Yok mudur kurtaracak bahtı kara maderini (Anasını)                                                                       Namık Kemal

recebcolak

ete hocam sizin verdiginiz kodlarla + 65 den sonrasını nasıl okuda biliriz
ben herkesi sevdim bilmiyorum sevildimmi?