ds18b20 için kodun entegre uyum sorusu

Başlatan einstain90, 18 Nisan 2008, 20:34:55

einstain90

Arkadaşlar ds1820 için olan kodu 16f628'de kullanınca çalışıyo ama 16f877 de deneyince çalışmıyo.Acaba 16f877 için ayrı bir kodmu gerekiyor.Yada ayarlamalardamı hata yapıyorum.ds1820 portb nin herhangi ucundan baglasam olurmu veya bağlanacak uc girişmi çıkışmı olmalı.Yardım ederseniz sevinirim
Her işte her zaman bir aksilik çıkar.Siz yeterki pes etmeyin...

tnen

DS1820 çift taraflı haberleşiyor yani pic DS'ye çevrime başla diyo DS başlıyor sonra DS pice sıcaklık bilgisini yolluyor. Bunun için picin pinini giriş veya çıkış yönlendirmiyorsun. Eğer one wire komutunu kullanıyorsan bu komuta gore giriş yada çıkış oluyor. OWIN de giriş OWOUT ta çıkış oluyor yani. Ama yazdığın kodu buraya koyarsan daha fazla yardımcı olmaya çalışırım.

einstain90

TRISB=%00000000                                   
TRISD=%11101111
TRISC=%10101111
TRISE=%00000000
ADCON1 =2
@ DEVICE pic16F877
@ DEVICE pic16F877, PWRT_off
@ DEVICE pic16F877, PROTECT_OFF
@ device  WDT_off
DEFINE  LCD_DREG    PORTB
DEFINE  LCD_DBIT    0
DEFINE  LCD_RSREG   PORTB
DEFINE  LCD_RSBIT   4
DEFINE  LCD_EREG    PORTB
DEFINE  LCD_EBIT    5
DEFINE  LCD_EBITS    4
DEFINE  LCD_LINES   2
DEFINE  LCD_COMMANDUS   2000
DEFINE  LCD_DATAUS   50
DEFINE OSC 4



Comm_Pin    VAR	Portb.7     ' 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


'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200
LCDOUT $FE,1

'-----------------------------------------------------------------------------
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
GOTO SENSOROKU
         
END
         
                      
Her işte her zaman bir aksilik çıkar.Siz yeterki pes etmeyin...

tnen

Oncelikle gecikme için kusura bakma ;

OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir
bu satırı
OWIN    Comm_Pin, 0, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir
olarak değiştirip denermisin.