DS18B20 ISI SENSÖRÜ KULLANIMI

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

kaganayanoglu

Merhabalar,

SENSOROKU:

 OWIN    Comm_Pin, 0, [Busy]    ' Busy değerini oku
 Bekle:
 IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
 OWOUT   Comm_Pin, 1, [$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


kaganayanoglu


kaganayanoglu

#3
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?

#header
  errorlevel -306  ; Crossing page boundry
#ENDHEADER

;****************************************************************
;*  Name    : UNTITLED.BAS                                      *
;*  Author  : [select VIEW...EDITOR OPTIONS]                    *
;*  Notice  : Copyright (c) 2008 [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 oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O 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 input, MCLR 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/O, HV on MCLR must be used for programming
cfg1&= _DEBUG_OFF             ; In-Circuit Debugger disabled, RB6/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]----------------
;       Note: Only include this routine once, after 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, $94, DEC2 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_ORTAM, 2, [HAM.Lowbyte, HAM.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

#5
Virgülden sonra 2 hane ondalik için;
ISI=HAM*10/16
    ORTAM = ISI/10
    ONDA_ORTAM = ISI//10
 RETURN

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

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

kaganayanoglu

#6
Sensörün takılı olup olmadığını tespit edebilmek için A0 portunu yoklayıp sensörden "buradayım" şeklinde bir bilgi isteyebilirmiyiz. Bu bilgiyi kullanıp sensör yok alt menüsüne gitsin istiyorum.

Teşekkürler