10 BIT ADC IKILI SAYIDA GOSTERME?

Başlatan mesmert, 10 Nisan 2007, 15:04:32

mesmert

Slm arkadaşlar PIC16F877 okuduğum ADC bilgisini iki digit te göstermek istiyorum bunun mantığı nedir veya ellinde örnek kod olan varmı?

arslan74

Merhaba,

10bit ADC sayisını 2 dijite gösteremessin. Cünkü 10 bit onluk tabanda 1024'e tekabül eder. Oda 4 dijitlik bir sayidir. Yanlız son iki dijitlik sayıyı göstermez isen ancak öyle olur.

Bunu göstermek cok basit.

Önce ADC girişinden okuma yaparsın. Okuduğun değeri okuyub bir registerde saklarsın. 10 bit olduğu için 8 bit lik registerde saklanamiyor. O yüzden iki ayrı registerde saklaniyor. Bu değeri onluk tabanına cevirib nasıl bir ekran kullaniyorsan ona göre bir yazılımla ekrana iletmelisin.

ADC okumasıyla örnek kod:

;*****************************************************
; ADC Değeri oku
; Sonucları F1,f0 regifterine ata.
ADC
	BSF	ADCON0,GO	; ADC start.
ADCloop
	BTFSC	ADCON0,GO	; okuma bitti mi?
	GOTO	ADCloop		; Hayir bitmedi, tekrar bekle.
	movfw	ADRESH		; üst  2 Bit oku.
	movwf	f1		; üst  2-Bit  f1 registerine ata.
	bsf	STATUS,RP0	; Bank1
	movfw	ADRESL		; alt 8 Bit oku.
	bcf	STATUS,RP0	; Bank0
	movwf	f0		; alt 8-Bit f0 resiterine ata.
	return


Sonra bu sayı 10luk tabanına cevirmek için. örnek kod veriyorum.

;*****************************************************
; Dönüşüm değeri 10000 den kücük olmalı.
; Binary sayılar f1,f0 saklı.
; Onluk sayılar  ST (binler), SH (yüzler),
; SZ (onlar) und SE (birler) registerinde BCD olarak saklanır.

B2D
	; Binlik testi 1000d = 0x03E8
	movlw	0x03
	movwf	xw1
	movlw	0xE8
	movwf	xw0
	call	B2Da
	movwf	ST
	; Yüzlük testi 100d = 0x0064
	clrf	xw1
	movlw	0x64
	movwf	xw0
	call	B2Da
	movwf	SH
	; Onluk testi 10d = 0x000A
	clrf	xw1
	movlw	0x0A
	movwf	xw0
	call	B2Da
	movwf	SZ
	movfw	f0
	movwf	SE
	return

B2Da
	clrf	counter
B2Sb
	incf	counter, f	; Kac kere cağrıldı?
	call	Sub16		; f:=f-xw	
	btfss	STATUS, C	; Cok fazla cağrıldı?
	goto	B2Sb		; Hayır: tekrar dene.
	call	Add16		; f:=f+xw
	decf	counter, w	; Cünkü her zaman bit tane fazla sayıldığı için
	return

mesmert

Arslan_74 verdiğin bilgi icin sağol benim asıl sorunum iki ayrı sıcaklık ölçmemdi ve yan yana iki adet LM 35 bağladım ama okunan değerler arasında yaklaşık 5 derece gibi bir fark var ben yaptığım ADC bölümünden şüpelenmiştim onun için sordum

2-) Lm35 birini ısıttığım zaman gayet güzel bir şekilde sıcaklık lcd ekranda yükseliyor ama ikincisini ısıttığımda ise lcd ekran 25 derece sonra sapıtıyor . Aşağı yaptığım kodları koyuyorum

MOVLW		B'01000001' ;RA0 1TH READ TEMPATURE
	MOVWF		ADCON0
	BSF		ADCON0,GO
	BCF		PIR1,ADIF
	BTFSS		PIR1,ADIF
	GOTO		$-1
	MOVF		ADRESH,0		
	MOVWF		LM1_35
                return

	MOVLW		B'01001001';RA1 2TH READ TEMPATURE
	MOVWF		ADCON0
	BSF		ADCON0,GO
	BCF		PIR1,ADIF
	BTFSS		PIR1,ADIF
	GOTO		$-1
	MOVF		ADRESH,0
	MOVWF		LM2_35
                return

arslan74

Merhaba,

Kanallar arasında geçişte araya bekleme süresi koymalısın. Aksi takdirde kanalı değiştirdikten sonra bekleme süresi koymassan, ölçmeleri düzgün yapamaz..

Selamlar.

mesmert

Merhaba,

Arslan hocam ilgin için sağol benim kendi yaptığım hatadan dolayı yanlış değer okuyormuşum. Port'un birini giriş diğerini çıkış yapmışım port ayarlarını düzeltim sorun çözüldü. Program yazarken eski yazdığım softwarelerden copy paste yaptığımdan bu tür  hatalar devamlı  gözden kaçıyor.