DS18B20 ISI SENSÖRÜ KULLANIMI

Başlatan kaganayanoglu, 04 Mart 2019, 19:09:45

kaganayanoglu

Merhabalar,

Kod Seç
SENSOROKU:

 
OWIN    Comm_Pin0, [Busy]    ' Busy değerini oku
 Bekle:
 IF      Busy = 0 THEN Bekle  ' 
hala meşgulmü? , evet ise goto Bekle..!
 
OWOUT   Comm_Pin1, [$CC$BE]' scratchpad memory oku
 OWIN    Comm_Pin, 0, [HAM.Lowbyte, HAM.Highbyte,skip 3]' 
İki byte oku ve okumayı bitir.
 
GOSUB   Hesapla
 
RETURN   

Yukardaki kodda 18B20 nin data kodu "[$CC, $BE] köşeli parantezler arasına mı yerleştiriliyor?

Yani örneğin [$55,$28,$30,$C5,$B8,$00,$00,$00,$8E,$44] kodu bu arayamı geliyor. Yoksa sadece aradaki 6 bitmi [$30,$C5,$B8,$00,$00,$00] alınıyor?

Teşekkürler



kaganayanoglu

14 Mart 2019, 16:24:38 #3 Son düzenlenme: 14 Mart 2019, 16:40:11 kaganayanoglu
Bu kadar çok gösterim alan bir konu ama nedense ustalardan hiç biri yorum yazmıyor. Ben yinede soru sormaya devam edeceğim.

Aşağıdaki kod belli bir kanaldaki tek sensörü okuyor ve ekranda gösterebiliyor. Fakat ondalık kısmı çok hızlı yukarı aşağı değişiyor. Birde tek ondalık gösteriyor. 2 ondalik gösteremedim.

Ayrıca DS18B20 aynı hatta çok sayıda nasıl bağlanır hala öğrenemedim.  Diyelimki her sensörün [$55,$28,$30,$C5,$B8,$00,$00,$00,$8E,$44] benzeri kodunu öğrendik. Bu kodu nasıl kullanacağız?

Kod Seç
#header
  
errorlevel -306  Crossing page boundry
#ENDHEADER

;****************************************************************
;*  
Name    UNTITLED.BAS                                      *
;*  
Author  : [select VIEW...EDITOR OPTIONS]                    *
;*  
Notice  Copyright (c2008 [select VIEW...EDITOR OPTIONS] *
;*          : 
All Rights Reserved                               *
;*  
Date    11.03.2019                                        *
;*  
Version 1.01                                              *
;*  
Notes   MARINKLIMA VER_1.01 -- 11.03.2019                 *
;*          : 
16f887 DS18B20 ISI SENSORLU KUVOZ KART MODIFIYE*
;****************************************************************

;----[
16F887 Hardware Configuration]--------------------------------------------
#IF __PROCESSOR__ = "16F887"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg1 _INTRC_OSC_NOCLKOUT    INTOSCIO oscillatorI/function on RA6/OSC2/CLKOUT pinI/function on RA7/OSC1/CLKIN
cfg1
&= _WDT_OFF               WDT disabled and can be enabled by SWDTEN bit of the WDTCON register
cfg1
&= _PWRTE_OFF             PWRT disabled
cfg1
&= _MCLRE_OFF             RE3/MCLR pin function is digital inputMCLR internally tied to VDD
cfg1
&= _CP_OFF                Program memory code protection is disabled
cfg1
&= _CPD_ON                Data memory code protection is enabled
cfg1
&= _BOR_OFF               BOR disabled
cfg1
&= _IESO_OFF              Internal/External Switchover mode is disabled
cfg1
&= _FCMEN_OFF             Fail-Safe Clock Monitor is disabled
cfg1
&= _LVP_OFF               RB3 pin has digital I/OHV on MCLR must be used for programming
cfg1
&= _DEBUG_OFF             In-Circuit Debugger disabledRB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins
  __CONFIG _CONFIG1
cfg1

cfg2 
_BOR40V                Brown-out Reset set to 4.0V
cfg2
&= _WRT_OFF               Write protection off
  __CONFIG _CONFIG2
cfg2

#ENDCONFIG

#ENDIF

;----[Verify Configs have been specified for Selected Processor]----------------
;       
NoteOnly include this routine onceafter all #CONFIG blocks
#IFNDEF MCU_FOUND
  #ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF


'*************************************
'
ISLEMCI TANIMLAMALARI
DEFINE OSC 4       
'KRİSTAL FREKANSI        
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 ' 
IC KRISTAL KULLANILIYOR 
DEFINE ADC_SAMPLEUS 20
'*************************************
ADCON1 = %10000000 '
SAGA YASLANIK sonuç almak için
ADCON0 
= %01000000 'FOSC/8
CM1CON0 = 7
CM2CON0 = 7
TRISA = %00000111  '
ISI SENSOR GIRISLERI
PORTA 
0          'HEPSI I/O PORT
TRISB = %00000000  '
LCD UCLARI VE PROGRAMLAMA UCLARI
PORTB 
0          'HEPSI I/O PORT
TRISC = %00110011  '
PORTC 0          'HEPSI I/O PORT
TRISD = %11100010  '
PORTD 0          'HEPSI I/O PORT
TRISE = %00000001  '
PORTE 0          'HEPSI I/O PORT
ANSELH = 0         '
AN8-9-10-11-12-13   DIGITAL GIRIS CIKIS OLACAK CUNKU ORADA LCD BAGLI
ANSEL 
0          'HEPSİ DIGITAL GIRIS CIKIS OLACAK.ANALOG KANAL KULLANIMI YOK.
PSTRCON = %00000000 '
PULSE STEERING MODE kapalı


Pause 100 
' 100 ms AÇILIŞ GECİKMESİ

DEFINE LCD_DREG PORTB      '
LCD data bacakları hangi porta bağlıLCD nin D0 D1 D2 D3 
DEFINE LCD_DBIT 0          
'LCD data bacakları hangi bitten başlıyor? ***
DEFINE LCD_RSREG PORTB     '
LCD RS Bacağı Hangi Porta bağlı ?         
DEFINE LCD_RSBIT 4         'LCD RS bacağı Hangi Bite bağlı ?        4 ***
DEFINE LCD_EREG PORTB      '
LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 5          'LCD Enable Bacağı Hangi bite bağlı ?    5
DEFINE LCD_BITS 4          '
LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 4
'***********Sensör Tanımlamaları***********

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

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

DERECE        CON 223         ' ° işareti
ISARET        VAR BYTE        '  
ISI değeri için  +/-  işaret
TEMP          
VAR word        ' Div32 bit hesap için geçici değişken
SET           var byte        ' 
ISI SET DEGERI 
SET1          
VAR BYTE        ' ISI ONDALIK SET DEGERI
SENSOR_ORTAM    VAR PORTA.0   '
GIRIS
ORTAM           
VAR WORD
ONDA_ORTAM      
VAR WORD
'***********Program Başlangıcı***********        
BASLA:
OWOUT SENSOR_ORTAM,1,[$CC,$44]   '
Sensöre sıcaklığı okumasını söyle.



LCDOUT $FE,1   
LCDOUT $FE
, $80" SISTEM ISILARI "
LCDOUT $FE$C0"ORTAM   MOTOR   G.SU"
LCDOUT $FE, $94DEC2 ORTAM","DEC ONDA_ORTAM,Derece,"C "

PAUSE 500

GOSUB SENSOR_ORTAM_OKU

Goto BASLA

 
'*******************************************************
SENSOR_ORTAM_OKU:
 HAM=0
 OWIN    SENSOR_ORTAM, 0, [Busy]    ' 
Busy değerini oku
 
IF      Busy 0 THEN GOSUB BEKLE        ' hala meşgulmü? , evet ise goto Bekle..!
 OWOUT   SENSOR_ORTAM, 1, [$CC, $BE]'
Sensöre okuduğu değeri göndermesini söyle.
 
OWIN    SENSOR_ORTAM2, [HAM.LowbyteHAM.Highbyte]' İki byte oku ve okumayı bitir.,skip 3  
 
 ISI=HAM*10/16
    ORTAM = ISI/10
    ONDA_ORTAM = ISI//10
 RETURN
    
 BEKLE:
 IF      Busy = 0 THEN Bekle        ' 
hala meşgulmü? , evet ise goto Bekle..!
 RETURN

Mucit23

12 bit çözünürlükte 0.0625°C hassasiyet elde ediliyor. Bu yüzden virgülden sonra 2 hane olsa bile tam çözünürlükte kullanılamayacak. 

ete

14 Mart 2019, 17:54:26 #5 Son düzenlenme: 14 Mart 2019, 17:55:28 ete
Virgülden sonra 2 hane ondalik için;
Kod Seç
 ISI=HAM*10/16
    ORTAM 
ISI/10
    ONDA_ORTAM 
ISI//10
 
RETURN

satırlarında şöyle değişiklik yapmak gerekiyor.

Kod Seç
 ISI=HAM*100/16
    ORTAM 
ISI/100
    ONDA_ORTAM 
ISI//100
 
RETURN

Aynı hatta birden fazla sensör bağlayıp aynı hattan istediğin birisi okumak mümkün ancak zahmetli bir iş.
Bu sensörlerin her birinin fabrikada verilmiş bir 64 bitlik seri numarası vardır ve numara sensöre haz tek numaradır (factory code). Öncelikle bu kodları birer birer okumanız gerekiyor.
Sonra istediğini zbirinin numarasını verip match rom komutunu göndererek ardından convert komutunu vermeli ve ardından da read scratchpad memory komutu ile okunan değeri almalısınız.
Bu işi yeterince bilmeyenler için zor gelebilir. O nedenle Data sheet'i yutup yalamak ve ardından icraata geçmek en iyisidir. Orada her şeyi yazmış adamlar bir seferde anlaşılamıyor olabilir ama bir kaç okumadan sonra bilgiler kafaya oturuyor.

Tek sensörle çalışan sistemdeki komutlara bir göz atarsak;
sırası ile
- [$CC,$44]  komutunu veriyorsunuz. Burada yer alan $CC komutu SKIP ROM komutudur. Diğer bir deyimle factoru codu okumayı atla çünki zaten 1 tane sensör var.
$44 rakamı ise "CONVERT T" komutu oluyor ve sıcaklığı okuyup scratchpad hafızasına kaydediyor sensör. Bu işlemi yapması 750 ms sürüyor o nedenle arada sürekli sensör meşgulmü değilmi diye bakıyoruz.Yeterince bekledikten meşguliyet sona eriyor ve sonra;
- [$CC, $BE] komutunu veriyoruz. Burada dikkat ederseniz yeniden $CC (skip ROM) komutu veriyoruz. Rom la işimiz yok çünki. Ardından $BE ise "READ SCRATCHPAD" komutu oluyor. Bunu sensöre bildiriyoruz ve ardından da,
-[HAM.Lowbyte, HAM.Highbyte] komutları yada bildirimi ile okunan sıcaklığın HAM isimli değişkene 8 er bitlik iki Byte halinde aktarılmasını sağlmaış oluyoruz.

Peki çoklu sensör kullanınca ne yapacağız;
- OWOUT DQ, 1, [$55]  'Match ROM komutu
- OWOUT DQ, 1, [STR SERINR\8]   'rom kodunu ver
- OWOUT DQ, 1, [$CC, $44]   ' ISI değerini oku
- OWOUT DQ, 1, [$CC, $BE]   ' Scratchpad hafızayı oku
- OWIN  DQ, 0, [HAM.Lowbyte, HAM.Highbyte] sıcaklığı ham değişkenine aktarıyoruz.

Burada kilit nokta 8 byte lık SERINR isimli dizi değişkenidir. Bu 64 itlik değerler önceden okunup programa yerleştirilmeleri gerekir.
Elbette kaç tane sensör aynı hatta bağlı ise ona ait SERINR sını diziye aktarıp ona ait okuma için istek yapmak zorundasınız.
İşin donanım kısmında ise bütün sensörlerin data hatları birleştirilerek tek hat olarak işlemciye girmesi gerekiyor. Zaten geriye sensörlerin Besleme uçları kalıyor ki onlarıda bağlıyorsunuz. Böylece sistemde sanki tek sensör bağlı imiş gibi gözüküyor.
Umarım anlamışsınızdır. Daha fazlası data sheet de yazıyor.
Bütün bunları data sheet den okudum. Öyle süper bir ingilizcem yok. Ana ylmadan defalarca okuyup bazı şeyleride deneyerek öğrendim. Sizde yapabilirsiniz.
Kolay gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com