Merhaba arkadaşlar
Analog bir işimiz yoksa ve pici tamamen dijital kullanıyorsak aşağıdaki başlangıç satırlarını vermeyebilirmiyiz.
DEFINE OSC 4 'KRİSTAL FREKANSI
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3 ' IC KRISTAL KULLANILIYOR
DEFINE ADC_SAMPLEUS 20 ADC ÖRNEKLEME
Yani sadece şöyle olurmu?
DEFINE OSC 4 'KRİSTAL FREKANSI
DEFINE ADC_CLOCK 3 'IC KRISTAL KULLANILIYOR
hatta sadece
DEFINE OSC 4 'KRİSTAL FREKANSI
olabilirmi?
Birde ilaveten
ADCON1 = 7 'hepsi analog
yazıldığında
ANSEL= 0 'A portu analog pinler iptal
ANSELH=0 'B portu Analog pinler iptal
CM1CON0=0 'C1 Komparatör iptal
CM2CON0=0 'C2 Komparatör iptal
yukardaki gibi ansel, anselh, cmcon tanımlamalarını ayrıca yapmak gereklimi?
ben soruyu tam anlayamadım.
analog giriş yani adc kullanılmayacaksa;
TRIS ve ADPCFG registerleri ayarlaması yapılması yeterli olup, ADCON - ADCSSL gibi adc ye özel register ayarlamaları gerekmez diyebilirim.
analog giriş - adc kullanılacaksa;
ozaman 3 register çeşidininde ayarlamaları yapılmalı, hatta gerekiyorsa ADCON registerleri birden fazla olarak bile gerekliyse ayarlanabiliyor. picin çeşidine göre. ADCON1-2-3 registerleri olabiliyor.
burada ADPCFG ile bir pini adc için tercih ettiğinizde aynı pinin TRIS registeri yönlendirmesinin 0-1 olması hiç farketmez. ADPCFG ayarlaması öncelik kazanır.
konuyu ben böyle biliyor ve uyguluyorum.
komparatör, seri haberleşme, input capture output compare motor control vesaire dahada sayılabilir bu gibi işlerin yürütüldüğü pinlerde bu özellikteki modülleri aktif etmediğiniz sürece, ayrıca baştan yazılımda kapatmanız gerekmez herhalde, bende durum böyle. bunlar default modunda kapalı olur genelde, yinede sizin pic in default modunda bu modüllerin durumuna bakmak gerekebilir. başlangıçta yani defaultda her bir pinin ne olduğu yardım dosyalarında veriliyor olmalı.
Analog ÇIKIŞ apayrı bir olay, zaten çoğu mcu da bu yok.
Analog GİRİŞ için ise işlemcideki registerlerden açılıp kapanır.
İşlemciye göre bu register ismi değişebilir. Hangi işlemci?
Ayrıca (genelde) bu register ilk enerjilendiğinde (default durumu) digital olarak açılır.
Hiç değişiklik yapmaz iseniz girişleri digital değerlendirir.
16F887 analog girişleri kapatıp 18b20 ile sıcaklık ölçmek için çalışıyordum. Fakat sensörü algılatamıyorum. Kodum şöyle;
#header
errorlevel -306 ; Crossing page boundry
#ENDHEADER
;----[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 ' ADC KULLANMAYACAĞIM. BU SATIRA GEREK VARMI?*************-------------****************/////////////////
DEFINE ADC_CLOCK 3 ' IC KRISTAL KULLANILIYOR
DEFINE ADC_SAMPLEUS 20 'ADC KULLANMAYACAĞIM. BU SATIRA GEREK VARMI?*************-------------****************/////////////////
'*************************************
TRISA = %00000111 'ISI SENSOR GIRISLERI
TRISB = %00000000 'LCD UCLARI VE PROGRAMLAMA UCLARI
ADCON1 = 7 'hepsi DİJİTAL
ANSEL = 0 'A portu analog pinler iptal
ANSELH = 0 'B portu Analog pinler iptal
CM1CON0 = 0 'C1 Komparatör iptal
CM2CON0 = 0 'C2 Komparatör iptal
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
SYMBOL BUZZER = PORTD.2
'--------------DIŞ ISI 18B20 değişkenler------------------------------
SYMBOL SENSOR_ORTAM_18B20 = PORTA.1 'GIRIS
OWOut SENSOR_ORTAM_18B20, 1, [$CC,$4E, $00,$00,$1F] ;sensor 9bit ayarlanır(1F)
BUSY VAR BIT
SSD VAR WORD
ISIORTAM_HAM VAR WORD
ORTAM VAR BYTE
ONDA_ORTAM VAR BYTE
ISIAL_1 VAR Word
'-----------------------------B A Ş L A N G I Ç ---------------------------
ISARET VAR BIT
PAUSE 200: ISARET=0
LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0 'derece işareti dataları
LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
LCDOut $FE,1
BASLA:
OWOUT SENSOR_ORTAM_18B20,1,[$CC,$44] 'Sensöre sıcaklığı okumasını söyle.
PAUSE 750
LCDOut $FE,1
LCDOut $FE,$80, " DIS ISI "
LCDOut $FE,$C0, DEC2 ORTAM, ",", DEC1 ONDA_ORTAM," ",0,"C " 'ORTAM ISI DEGERI
LCDOut $FE,$94, "ISIAL_1 : ", DEC ISIAL_1
LCDOut $FE,$D4, "SSD : ", DEC SSD
PAUSE 100
GOSUB ORTAM_OKU
Goto BASLA
ORTAM_OKU:
SSD=0
OWOUT SENSOR_ORTAM_18B20,1,[$CC,$44] 'Sensöre sıcaklığı okumasını söyle.
BEKLE:
OWIN SENSOR_ORTAM_18B20, 4, [Busy] ' Busy değerini oku
Pause 750
IF BUSY=0 then
Gosub ORTAMSENS_ARIZA
ENDIF
OWOUT SENSOR_ORTAM_18B20,1,[$CC,$BE] 'Sensöre okuduğu değeri göndermesini söyle.
OWIN SENSOR_ORTAM_18B20,2,[SSD.LOWBYTE,SSD.HIGHBYTE] 'Gelen 16 bitlik bilgiyi al.
LCDOut $FE,1
LCDOUT $FE,$80,"ortam 18B20 OKUNDU "
pause 1000
ISIORTAM_HAM=SSD*10/16 ' Ham değerden Santigrat derece hesabı
ORTAM=ISIORTAM_HAM/10 '12 bit hassasiyet kullandığımız için her değer 0.0625 santigrat dereceye denk geliyor.
ONDA_ORTAM=ISIORTAM_HAM//10
pause 100
RETURN
DIT:
HIGH BUZZER
PAUSE 50
LOW BUZZER
RETURN
ORTAMSENS_ARIZA:
LCDOut $FE,1
LCDOUT $FE,$80," ORTAM ISI SENSORU "
LCDOUT $FE,$C0," ARIZALI "
PAUSE 1000
RETURN
Sensörü çıkartsamda değer gösteriyor. Sensör yok uyarısı verdiremiyorum. Bir türlü BUSY değerini algılamıyor.
DQ pinine pull up bağlı mı?
Şema?
DS18B20 nin bağanacağı pine led bağlayıp deneyebilirsin dijital kurabilmiş misin diye.
1 wire kütüphanende veya ds18b20 rutinlerinde problem olabilir.
Sensör çalışıyor ve sıcaklığı ölçüyor. Fakat sensörü çıkardığımda sensör yok uyarısı verdiremiyorum.
Merhaba arkadaşlar.
Günlerdir 18b20 ile ilgili araştırma yapıyorum. Ama en sonunda hallettim.
Heryerde bulunan aşağıdaki koddan
OWOUT HEATING_SENSOR, 1, [$CC, $44] 'Skip ROM search & do temp conversion
Wait_Up:
OWIN HEATING_SENSOR, 4, [Busy] 'Read busy-bit
IF Busy = 0 THEN goto Wait_Up 'Still busy..?, Wait_Up..!
OWOUT HEATING_SENSOR, 1, [$CC, $BE] 'Skip ROM search & read scratchpad memory
OWIN HEATING_SENSOR, 2, [TEMP1_WORD.Lowbyte, TEMP1_WORD.Highbyte] 'Read two bytes to Temp1_word variable
CURRENT_TEMPERATURE = (TEMP1_WORD / 16)*10 'resolution is 16
TEMP1_BYTE = TEMP1_WORD // 16 'store temporarilly remainder
lookup TEMP1_BYTE, [0,0,1,1,2,3,3,4,5,5,6,7,7,8,9,9,9], TEMP2_BYTE
CURRENT_TEMPERATURE = CURRENT_TEMPERATURE + TEMP2_BYTE / here is the temperature value eg for 23,8 degrees celsius in this variable is 238
Busy değeri BUSY=0 olduğunda sensörden veri alınamadığını ve beklenmesi gerektiğini anlamıştım. Ve eğer bu doğruysa sensör çıkarılınca sensör yok menüsüne gitmeliydi. Ama pratikte öyle olmuyor. Sensörü çıkarsanızda kafadan bir değer çıkıyor ekranda.
Sonunda aşağıdaki kodla sensör yok uyarısını alabildim. Meğerse Busy=0 olduğunda veri alınıyormuş.
#header
errorlevel -306 ; Crossing page boundry
#ENDHEADER
;----[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 ' ADC KULLANMAYACAĞIM. BU SATIRA GEREK VARMI?*************-------------****************/////////////////
DEFINE ADC_CLOCK 3 ' IC KRISTAL KULLANILIYOR
DEFINE ADC_SAMPLEUS 20 'ADC KULLANMAYACAĞIM. BU SATIRA GEREK VARMI?*************-------------****************/////////////////
'*************************************
TRISA = %00000111 'ISI SENSOR GIRISLERI
TRISB = %00000000 'LCD UCLARI VE PROGRAMLAMA UCLARI
ADCON1 = 7 'hepsi DİJİTAL
ANSEL = 0 'A portu analog pinler iptal
ANSELH = 0 'B portu Analog pinler iptal
CM1CON0 = 0 'C1 Komparatör iptal
CM2CON0 = 0 'C2 Komparatör iptal
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
SYMBOL BUZZER = PORTD.2
'--------------DIŞ ISI 18B20 değişkenler------------------------------
SYMBOL SENSOR_ORTAM_18B20 = PORTA.1 'GIRIS
OWOut SENSOR_ORTAM_18B20, 1, [$CC,$4E, $00,$00,$1F] ;sensor 9bit ayarlanır(1F)
BUSY VAR BIT
SSD VAR WORD
ISIORTAM_HAM VAR WORD
ORTAM VAR BYTE
ONDA_ORTAM VAR BYTE
ISIAL_1 VAR Word
'-----------------------------B A Ş L A N G I Ç ---------------------------
ISARET VAR BIT
PAUSE 200: ISARET=0
LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0 'derece işareti dataları
LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
LCDOut $FE,1
BASLA:
OWOUT SENSOR_ORTAM_18B20,1,[$CC,$44] 'Sensöre sıcaklığı okumasını söyle.
PAUSE 750
LCDOut $FE,1
LCDOut $FE,$80, " DIS ISI "
LCDOut $FE,$C0, DEC2 ORTAM, ",", DEC1 ONDA_ORTAM," ",0,"C " 'ORTAM ISI DEGERI
LCDOut $FE,$94, "ISIAL_1 : ", DEC ISIAL_1
LCDOut $FE,$D4, "SSD : ", DEC SSD
PAUSE 100
GOSUB ORTAM_OKU
Goto BASLA
ORTAM_OKU:
SSD=0
OWOUT SENSOR_ORTAM_18B20,1,[$CC,$44] 'Sensöre sıcaklığı okumasını söyle.
BEKLE:
OWIN SENSOR_ORTAM_18B20, 4, [Busy] ' Busy değerini oku
Pause 750
IF BUSY=1 then
Gosub ORTAMSENS_ARIZA
ENDIF
'IF Busy = 0 THEN BEKLE ' hala meşgulmü? , evet ise goto Bekle2..!
OWOUT SENSOR_ORTAM_18B20,1,[$CC,$BE] 'Sensöre okuduğu değeri göndermesini söyle.
OWIN SENSOR_ORTAM_18B20,2,[SSD.LOWBYTE,SSD.HIGHBYTE] 'Gelen 16 bitlik bilgiyi al.
LCDOut $FE,1
LCDOUT $FE,$80,"ortam 18B20 OKUNDU "
pause 1000
ISIORTAM_HAM=SSD*10/16 ' Ham değerden Santigrat derece hesabı
ORTAM=ISIORTAM_HAM/10 '12 bit hassasiyet kullandığımız için her değer 0.0625 santigrat dereceye denk geliyor.
ONDA_ORTAM=ISIORTAM_HAM//10
pause 100
RETURN
DIT:
HIGH BUZZER
PAUSE 50
LOW BUZZER
RETURN
ORTAMSENS_ARIZA:
LCDOut $FE,1
LCDOUT $FE,$80," ORTAM ISI SENSORU "
LCDOUT $FE,$C0," ARIZALI "
PAUSE 1000
goto ORTAM_OKU
Bu konuya takılanlara yardımcı olabilir diye yazıyorum. Herkese teşekkürler. Ayrıca yakında foruma 18B20 nin kullanımıyla ilgili ayrıntılı bir döküman koymak istiyorum.
Bu konuda biraz mantık çalıştırmak iyi olur diye düşünüyorum.Kullanılan sensör tekhattan haberleşen bir sensör ve haberleşme şartları büyük ölçüde çıkışına bağlanan pullup direnci ile sağlanır. Dolayısıyla haberleşme anında sensör tarafından LOW a çekilen Busy değeri sensör yok iken sürekli HIGH da kalır ve bunuda pullup direnci sağlar. Ama burada dikkat edilecek husus devrenizde sensör olmasada mutlaka pullup direnci bağlı olmalıdır. AKsi taktide sensör pini float konumunda kalır ve ne busy ile neden başka yolla sensörün varlığını tespit edemezsiniz.
Aslında Busy hiç kullanmadan da devrede sensör yok iken okuma yapmaya kalkarsanız okuyacağınız değer pullup direnciden dolayı her zaman 65535 olur. Bu sensörün olmadığının işaretidir.
Ben bu veriyi kullanarak sensör olmadığını yada bir şekilde devre dışı kaldığını kolaylıkla anlayabiliyorum.
Ete