Analog Giriş Çıkış Kullanılmıyorsa ???

Başlatan kaganayanoglu, 17 Aralık 2019, 17:58:32

kaganayanoglu

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?

HAKKITANIR

#1
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ı.

OG

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.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

kaganayanoglu

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

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

kaganayanoglu

Sensör çalışıyor ve sıcaklığı ölçüyor. Fakat sensörü çıkardığımda sensör yok uyarısı verdiremiyorum.

kaganayanoglu

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.

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com