adc0831 ile okunan değeri volt'a çevirmek...?

Başlatan mustafa_cmbz, 28 Ocak 2009, 13:20:33

mustafa_cmbz

Include "Modedefs.Bas"
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
csenable var portA.0 'ADC0831 ENABLE GİRİŞİ
clock var portA.1 'ADC0831 CLOCK GİRİŞİ
veri var portA.2 'ADC0831 DATA ÇIKIŞI
i var byte
digital var byte 'ADC DEN OKUNAN DEĞERİN YAZILDIĞI BYTE
TRISA=%00000100
PORTA=%00000000
MAIN:
WHILE 1 'SONSUZ DÖNGÜ
GOSUB ADC 'ADC ALT PROGRAMINA GİT
LCDOUT $FE,1,"ADC= ", #digital 'LCD YE OKUNAN DEĞERİ YAZ
pulsout PORTA.3,digital
WEND 'SONSUZ DÖNGÜ
ADC:
low csenable 'ENABLE 0
PAUSEUS 10 'BEKLE
'veri Yİ OKUMAYA BAŞLAMADAN ÖNCE 2 CLOCK GÖNDERME KISMI........
for i=0 to 1 '2 DEFA
high clock 'CLOCK 1
PAUSEUS 1 'BEKLE
low clock 'CLOCK 0
PAUSEUS 1 'BEKLE
next i
'MSB BİTİ OKUMA VE BİR SONRAKİ BİT İÇİN CLOCK GÖNDERME KISMI
for i=7 to 0 STEP -1 '8 DEFA DÖN
digital.0[i]=veri 'veri PİNİNİN DEĞERİNİ digital İÇİNE YAZ
'veri DEN ÖNCE MSB BİT GELİR.... ( 7 TO 0 STEP -1 )
high clock 'CLOCK 1
PAUSEUS 1 'BEKLE
low clock 'CLOCK 0
PAUSEUS 1 'BEKLE
next i
'veri Yİ OKUDUKTAN SONRA veri SONU İÇİN 2 SON CLOCK DARBESİ
for i=0 to 1 '2 DEFA
high clock 'CLOCK 1
PAUSEUS 1 'BEKLE
low clock 'CLOCK 0
PAUSEUS 1 'BEKLE
next i
PAUSEUS 10 'BEKLE
high csenable 'veri Yİ OKUDUKTAN SONRA ENABLE 1
PAUSE 200 'BEKLE
RETURN 'ALT PROGRAM SONU
END


arkadaşlar bir dedektör devresinde 18v akünün doluluk seviyesini kontrol etmem gerek.bunun içinde en basitinden adc0831 ile bu işi halletmeyi düşünüyorum.pic olarak 16f877a kullanacağım.aslında bu pic'te de adc modül var var olmasına ama ben program açısından düşündüğümde başka işlemlerde yaptıracağım için adc işini harici bir entegre ile yapacağım.(çaktırmayın pic ile daha önce hiç adc uygulamam olmadı birazda o yüzden altından kalkamayacağımdan korkuyorum)...

neyse kısacası nette bu yukarıdaki kodu buldum denedim çalışıyor ama lcd'de sadece ham değeri yazıyor..bu değerleri ekranda nasıl v değeri olarak yansıtabilirim_? nasıl bir hesaplama yapmam lazım_?

erkan614

yok canım sen pice adc okutamıyacak adam değilsin yaparsın bence ve daha kolay olur benim sana tavsiyem
soruna gelince 8bit adc işlemi +5v +vref 0v -vref olarak
2^8=256 çözünürlük ise [5-(-0)]/255=0.0196v dan (yaklaşık) 19.6mV çözünürlüğün var
eğer ham değerin eğer 185 ise okuduğun adc değeri 185*0.0196=3,627v dur
bak ben sana 0-1 sn lik zamjan devresi programımı veriyim 2 sene önce yaptım burdan bak ve direkt pic ile okut



LIST    p=12F675	; configurasyon: external osc no clkout xt
	#include "P12F675.INC"	; wdt pwrt boden diable
				; cp cpd mclr enable




B1	EQU	020H
B2	EQU	021H
A1	EQU	022H
ACU	EQU	023H

;****************************

	
	ORG	00H
	GOTO	BASLA

	ORG	04H
BASLA	CALL	SRTLA
	CLRF	GPIO

;******************************



BTBK1	MOVLW	0FFH
	MOVWF	ACU
BTBK	BTFSC	GPIO,GP2
	GOTO	BTBK1
	DECFSZ	ACU,1
	GOTO	BTBK
	BSF	GPIO,GP1
	CALL	ADC
	CALL	BK
	CALL	BK1
	BCF	GPIO,GP1
	CALL	BK1
SLK1	MOVLW	0FFH
	MOVWF	ACU
SLK	BTFSS	GPIO,GP2
	GOTO	SLK1
	DECFSZ	ACU,1
	GOTO	SLK
	GOTO	BTBK1


;*******************************


SRTLA	BSF	STATUS,RP0
	MOVLW	0FFH
	MOVWF	OSCCAL
	MOVLW	080H
	MOVWF	OPTION_REG
	CLRF	INTCON
	CLRF	PIE1
	MOVLW	03H
	MOVWF	PCON
	CLRF	VRCON
	BCF	STATUS,RP0
	MOVLW	007H
	MOVWF	CMCON
	BSF	STATUS,RP0
	MOVLW	011H
	MOVWF	ANSEL
	MOVLW	03DH
	MOVWF	TRISIO
	MOVLW	034H
	MOVWF	WPU
	CLRF	IOC
	BCF	STATUS,RP0
	MOVLW	001H
	MOVWF	T1CON
	MOVLW	001H
	MOVWF	ADCON0
	CLRF	GPIO

	RETURN
	
	;***********************

ADC	BSF	ADCON0,GO	;convert basladı
ADBK	BTFSC	ADCON0,GO	;islemin bimesi 
	GOTO	ADBK		;bekleniyor
	MOVF	ADRESH,w
	MOVWF	A1		;adresh a1'e yuklendi
	BCF	STATUS,C
	RRF	A1,1		;2 e bolunerek 
	MOVLW	.01
	ADDWF	A1,1		;1-129	ARASİ
	MOVF	A1,0
	MOVWF	B1
	RETURN


;*******************************
BK	BCF	PIR1,TMR1IF
	MOVLW	0B8H
	MOVWF	TMR1L
	MOVLW	0E1H
	MOVWF	TMR1H
BKL	BTFSS	PIR1,TMR1IF
	GOTO	BKL
	MOVLW	0B8H
	MOVWF	TMR1L
	MOVLW	0E1H
	MOVWF	TMR1H
	BCF	PIR1,TMR1IF
	DECFSZ	B1,1
	GOTO	BKL
	RETURN

;*********************************

BK1	BCF	PIR1,TMR1IF
	MOVLW	0B8H
	MOVWF	TMR1L
	MOVLW	0E1H
	MOVWF	TMR1H
	MOVLW	.30
	MOVWF	ACU
BK2	BTFSS	PIR1,TMR1IF
	GOTO	BK2
	MOVLW	0B8H
	MOVWF	TMR1L
	MOVLW	0E1H
	MOVWF	TMR1H
	BCF	PIR1,TMR1IF
	DECFSZ	ACU,1
	GOTO	BK2
	RETURN


	
	;***********************
	END

EDIT
bardon yukarıdaki kod basic miş farkedemedim
e şimdi bana göre örnek kod bile vermeye gerek yok asm den dolayı yapamıon sandımdı

mustafa_cmbz

hocam pic ile yapmayı düşünüyorum elbet ama bilmediğim için soruyorum..16f877 ile aynı anda hem adc ile ölçüm yaparak ekrana yazmak hemde butonlara basılıp basılmadığını kontrol etmek ve aynı zamanda dedektörden gelen sinyali okutmam ve lcd'ye yazmam gerekli bunun için fazla da kasmak istemiyorum...dedektörün haricinde boş bir zaman bulabilsem adc ile ilgili uygulamalar yapacağım ama şu zaman kısıtlı birde matematik zayıf olduğundan herzaman formül hesap kitap olan işlerdne kaçıyorum...aslında istesem yaparım ama huyum kurusun hep kolaya kaçmayı seviyorum yoksa üstüne gitsem yaparım yaparım ama bunun yanında zamanım pek fazla yok...düşünün işte ustam tv tamiri yapıyor ben karşısına geçmiş pc başında dedektör için adc araştırması yapıyorum isiste devre çiziyorum...allahtan genç kafa dengi insan halinden anlıyor...kolay gelsin...

erkan614

adc değerini entegreden okumak için yazılan satırların yerine pic in dahili adc okuma işlemlerinin kodlarını yazarsan program açısından hiçbirşey değişmez

mustafa_cmbz

pic ile olayı çözdüm hocam çok basitmiş...bu kadar kolay olacağını bilseydim hiç boşa vakit kaybetmezdim.ham veri olarak ekranda ne görüyorsam onu IF  ile şartlandırıyorum misal 143'ten büyükse şunu yap küçükse şunu yap gibi çok ta güzel ve hassas çalışıyor 10 olarak çalışsam kimbilir neler olacak :D  çok teşekkürler...

bu işlem benim hoşuma gitti..ben bişey daha soracağım...elimde (aşağıdaki resimde)  dedektörün belli noktalarından çıkan sinyaller var bunları da aynı pic ile ölçebilirmiyiz acaba_?



birde pic'in ölçüm yapılan ucuna filtre amaçlı kondastör vs. atmamız gerekirmi acaba_?

bunların dışında dedektörden çıkan voltaja göre de lcd'ye vumetre gibi sinyali yansıtacağız...bir tek dedektörden çıkan sinyalleri algılatıp ekrana basmak kaldı...bunlarıda halledersem daha sonralarda pic'i değiştirip 18f452 gibi gelişmiş bir pic kullanıp mesafe ve sinyale göre tek tek metal ayrımı yaptıracağım...bu konuda fikirlerinize ihtiyacım var...iyi çalışmalar...