DS HABERLEŞMESİ SORU

Başlatan ozlefatih, 25 Eylül 2006, 23:45:31

ozlefatih

LIST	P=16F84
	INCLUDE	"P16F84.INC"

	input1		equ	H'20'
	input2		equ	H'21'
	HESTEM		equ	H'22'
	SICAKLIK	equ	H'23'
	_DATA		equ	H'24'
	
	dlycnt		equ	H'26'
	count2		equ	H'27'
	cntmsec		equ	H'28'



			
	org	h'00'

basla

DERECE 
	CALL	DSOKU		;SENSOR OKU 
	BCF	STATUS,0 

	BTFSS	input2,7	;DERECE EKSİ 
	GOTO	$+8		;İŞLEM 
	COMF 	input1,1	;BURDA 
	MOVF 	input1,0	; 
	MOVWF 	HESTEM		; 
	RRF 	HESTEM,1	; 
	MOVF 	HESTEM,0 
	SUBLW 	D'128'		; 
	MOVWF 	SICAKLIK
				;HESAPLAMADA KULANILCAKDEGER 
	BTFSC 	input2,7	;DERECE ARTI 
	GOTO	$+5		;İŞLEM BURADA 
	RRF 	input1,1 
	MOVF 	input1,0 
	ADDLW 	D'128' 
	MOVWF 	SICAKLIK	;HESAPLAMADA KULANILCAKDEGER 
	goto	basla

	
 
;******************************************* 
;DALLAS CHIP PROG ROUTION OKUMA -İSE İNPUT2 FF 
; +İSE 00 DEGER İNPUT1 DE + NORMAL - DE TERS CEVİR 
;******************************************* 

DSOKU 
	CALL 	DLSRST2 
	MOVLW 	0xcc 		;Skip ROM 
	MOVWF 	_DATA 
	CALL 	SENDDls 

	MOVLW 	0x44 
	MOVWF 	_DATA 
	CALL 	SENDDls 


	MOVLW 	0xff 
	CALL 	ENMSEC 
	MOVLW 	0xff 
	CALL 	ENMSEC 
	MOVLW 	0xff 
	CALL 	ENMSEC 

	CALL 	DLSRST2 
	MOVLW 	0xcc 		;Skip ROM 
	MOVWF 	_DATA 
	CALL 	SENDDls 

	MOVLW 	0xbe 
	MOVWF 	_DATA 
	CALL 	SENDDls 
	CALL 	RDDls 
	MOVF 	_DATA,w 
	MOVWF 	input1 
	CALL 	RDDls 
	MOVF 	_DATA,w 
	MOVWF 	input2 

	RETURN 

DLSRST2 
	BCF 	PORTA,0 
	MOVLW 	0xb7 
	MOVWF 	dlycnt 
	DECFSZ 	dlycnt,f 
	GOTO 	$-1 
	BSF 	STATUS,5 	;bank1 
	BSF 	PORTA,0 	;PORTA,0 input 
	BCF 	STATUS,5 	;bank0 
	MOVLW 	0x17 
	MOVWF 	dlycnt 
	DECFSZ 	dlycnt,f 
	GOTO 	$-1 
	BTFSC 	PORTA,0  
	GOTO 	$-1 
	MOVLW 	0x01 
	CALL 	ENMSEC		;450 USN OLACAK 
	BSF 	STATUS,5 	;bank1 
	BCF 	PORTA,0 	;PORTA,0 OUTPUT 
	BCF 	STATUS,5 	;bank0 
	RETURN 

SENDDls 
	MOVLW 	0x08 
	MOVWF 	count2 
SEND2 
	RRF 	_DATA,f 
	BCF 	PORTA,0  
	MOVLW 	0x03 
	MOVWF 	dlycnt 
	DECFSZ 	dlycnt,f 
	GOTO 	$-1 
	BTFSC 	STATUS,C 
	BSF 	PORTA,0 
	MOVLW 	0x14 
	MOVWF 	dlycnt 
	DECFSZ 	dlycnt,f 
	GOTO 	$-1 
	BSF 	PORTA,0  
	DECFSZ 	count2,f 
	GOTO 	SEND2 
	RETURN
 

RDDls 	
	MOVLW 	0x08 
	MOVWF 	count2 
RD2 
	BCF 	PORTA,0 
	MOVLW 	0x01 
	MOVWF 	dlycnt 
	DECFSZ 	dlycnt,f 
	GOTO 	$-1 
	BSF 	STATUS,5 	;bank1 
	BSF 	PORTA,0 	;PORTA,0 input 
	BCF 	STATUS,5 	;bank0 
	BCF 	STATUS,C 
	BTFSC 	PORTA,0 
	BSF 	STATUS,C 
	MOVLW 	0x17 
	MOVWF 	dlycnt 
	DECFSZ	dlycnt,f 
	GOTO	$-1 
	RRF 	_DATA,f 
	BSF 	STATUS,5 	;bank1 
	BCF 	PORTA,0 	;PORTA,0 output 
	BCF 	STATUS,5 	;bank0 
	BSF 	PORTA,0 
	DECFSZ 	count2,f 
	GOTO 	RD2 
	RETURN 

ENMSEC 
	MOVLW 	D'111' 
	MOVWF 	cntmsec 
EMSECL 
	NOP 
	DECFSZ 	cntmsec,F 
	GOTO 	EMSECL 
	RETURN

	END


Bu kodları 18b20 haberleşmesi için kullanmak istiyorum ama programın dogrulugundan emin değilim aynı zamanda eger sıcaklık degişkenine deger atanıyorsa bu degeri lcd de nasıl göstermem gerek bu rutinlerde sıcaklık degişkeni var bunun artı yada eksi deger oldugunu söyleyen bir register varmı bu programda . Teşekkürler
   FATiH KABAKÇI ELEKTRONİK ÖĞRETMENİ

mytap

Asm olarak bi örnek inceleyebilirsin

http://www.hemenpaylas.com/download/1613871/ds1820.txt.html


ASM olması şartmı? Ben sana picbasic öneririm. ASM de bu gibi sensörleri okumak veriye çevirip bir LCD de göstermek oldukça zahmetlidir. İstersen bu DS118B20 ile LCD li termometre devresi ve basic kodlarını gönderebilirim. Hatta şimdi hatırladım forumda aratırsan ETE arkadaşımızın ders notlarınında bulabilirsin. Kendine göre modifiye edip farklı amaçlar için kullanabilirsin

iyi çalışmalar.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

ozlefatih

teşekkür ederim arkadaşım.
   FATiH KABAKÇI ELEKTRONİK ÖĞRETMENİ

mytap

Bu sensör ile  takıldığın yerler olursa (picbasic ama) elimden geldiği kadarı ile yardımcı olmaya çalışırım..


iyi çalışmalar......
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

aslan_korhan

temp var word
X   var byte
DQ   var PORTB.0            ' DS18S20'nin DATA ucu.

main:
owout DQ, 1,[$CC, $44]                                    
owin DQ, 4,[X]                                         
if X = 0 then                                         
owout DQ, 1, [$cc, $BE]                                 
endif                                                       
owin DQ,2, [temp.lowbyte,temp.highbyte]                  
temp = temp / 8                                             
LCDOut $FE,1,"isi : ",dec (temp>>1),".",dec (temp.0*5)," C"
pause 1000
goto main

--------------------------------------------------------------------------

Bu kod ile yanlız + sıcaklıkları okursun...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

mytap

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

CMCON = 7  '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------------------
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
ISARET_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI   CON 1           ' Sıfır altında isaret biti=1  oluyor kontrol için
DERECE     CON 223         ' ° işareti
ISARET     VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE       ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.0    ' One-wire Data-Pin "DQ" PortB.0 da
'-----------------------------------------------------------------------------
Clear  'tüm değişkenler sıfırlandı
PAUSE 200
LCDOUT $FE,1

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

BASLA:lcdout $fe,2," DS18B20 ile ISI"
      GoSub SENSOROKU     'SONSÖR OKU VE SICAKLIĞI EKRANA YAZ
      GoTo BASLA
              
'----------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SENSOROKU:
           ham=$FE6F: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
    
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    ISARET = "+"
    If ISARET_BITI = EKSI_ISI Then
       ISARET = "-"
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10
       GoTo GEC
    End If
    TEMP = 625 * HAM        '
    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,ISARET,DEC ISI,".",DEC1 (Float)," ",Derece,"C " '2. satırda ısı
    Return

End

------------------------------
bu kod eksi ve artı dereceleri hassasiyetle okuyabilirsin
ETE arkadaşımızın notlarından
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------