ds18b20 busy hatası

Başlatan yasargunaydin, 16 Aralık 2015, 20:49:39

yasargunaydin

Arkadaşlar merhaba;
pic16f877 nin 2. ayağı RA0 'a ds18b20 bağladım ve çalıştırmak için uğraşıyorum.Fakat proğram bekle bölümünde IF      Busy = 0 THEN Bekle de takılı kalıyor.Atlıyamıyor.sebebini bulamadım ve busy den kurtaramadım.pic16f628 ile Ete hocam sağolsun yapmış fakat ben bunu 16f877 yi çalıştırırsam bluetooth ile veri göndermek istiyorum ve başka çıkışlarda yapacağım için ayak sayısı 16f628de yeterli değil ve elimde 16f877 var  onun için 16f877 seçmek zorunda kaldım.Yardımınıza ihtiyacım var.Teşekkürler.

TRISC=%11000000
TRISD=%00000000
TRISA=1
TRISB=0

OPTION_REG.7=0 'pull-up dirençleri aktif
INTCON=%11000000


DEFINE LCD_DREG     PORTB
DEFINE LCD_DBIT     0
DEFINE LCD_EREG     PORTB
DEFINE LCD_EBIT     5
DEFINE LCD_RSREG    PORTB
DEFINE LCD_RSBIT    4
DEFINE LCD_BITS     4
DEFINE LCD_LINES    2

SO VAR PORTC.6
SI VAR PORTC.7
'-------------------------------------------------------------------------------

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

DEFINE OSC 4
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

ISI1    VAR     BYTE       'BU PROGRAMDA VAR. 29-04-2005 DE
ISI2    VAR     BYTE 
BUSY    VAR     BIT
HAM     VAR     WORD
ISI     VAR     WORD        ' Hesaplanmış ISI değeri
     
SIGN_BITI   VAR HAM.11'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
ISARET      VAR BYTE
TEMP        VAR BYTE         
SYMBOL Comm_Pin=PORTA.0 



LCDOUT $FE, $40, $06, $09, $09, $06, $00, $00, $00, $00 ' ' ° işareti
lcdout $fe,1,"LUTFEN  BEKLEYIN"

GOSUB SENSOROKU
gosub GONDER
LCDOUT $FE,1
lcdout $FE,$C0,"SICAKLIK:",SIGN,dec ISI1,",",DEC ISI2,0,"C  "


BASLA:
          GOSUB SENSOROKU
          lcdout $FE,$C0,"SICAKLIK:",SIGN,dec ISI1,",",DEC ISI2,0,"C  "           
          gosub gonder                 
          goto basla
         
          gonder:
       HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
       HSEROUT ["E","T","E",ISI1,ISI2,SIGN]
       HSEROUT ["E","T","E",ISI1,ISI2,SIGN]
       HSEROUT ["E","T","E",ISI1,ISI2,SIGN]
return
     
      SENSOROKU:
'          ham=$FFBF:Gosub hesapla:RETURN  'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK
           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 'bu satır alttakinin yerine kullanıldı
       Temp=625*(~HAM+2)
       ISI  = DIV32 1000
       GOTO GEC   
    endif
    TEMP = 625*(HAM)        '
    ISI = DIV32 1000          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.           
GEC:
    ISI2 = (ISI //10)
    ISI1=ISI/10
    RETURN

ete

Programın baş taraflarda bir yerine,
ADCON1=7 komutunu ilave edin. Bu analog pinleri digital yapar sizede o lazım.
Ayrıca işlemci 16F877A ise , birde CMCON=7 komutunu ilave edin. Sonra tekrar deneyin.

Ete


yasargunaydin

Tabiki yaa,ufak bir püf nokta ama atlamışım.
teşekkür ederim Ete hocam .Çalıştı.

Powered by EzPortal