10 bit veri ile desimal bulma işlemi....

Başlatan SpeedyX, 29 Ağustos 2004, 00:06:32

SpeedyX

ben adc ile veri okuyorum (16f818) ve bunu adresl ve adresh adlı registerlara yazıyor.
normalde 8bitlik verilerle işlem yaparken kullandığım desimal bul ma prosedürüm vardı.. (display,lcd için.)
bunu 10 bitlik sistemde değiştirmeliyim...
ama nasıl yapacağımı düşünemedim. bir türlü...

eski desimal bul u yolluyorum.. yardımcı olursanız sevinirim. (asm)

---------------------------------------------
desimalbul
movwf sayac1
bsf status,0
clrf yuzler
clrf onlar
clrf birler
goto yuzlerbul
yuzlerbul
movlw d'100'
subwf sayac1,1
btfsc status,0
incf yuzler,1
btfsc status,0
goto yuzlerbul
addwf sayac1,1
bsf status,0
goto onlarbul
onlarbul
movlw d'10'
subwf sayac1,1
btfsc status,0
incf onlar,1
btfsc status,0
goto onlarbul
addwf sayac1,1
bsf status,0
goto birlerbul
birlerbul
movlw d'1'
subwf sayac1,1
btfsc status,0
incf birler,1
btfsc status,0
goto birlerbul
addwf sayac1,1
bcf status,0
bsf yuzler,4
bsf yuzler,5
bsf onlar,4
bsf onlar,5
bsf birler,4
bsf birler,5
return

---------------------------------------------------
lütfen bana yardımcı olunuz... teşekkürler

axanc

arkadaşım assemble yerine PicBasic kullanırsan işin çok daha kolay olacaktır, şuan kimse assemble ile çok fazla uğraşmadığından senin yazmış olduğun prosedürü çevirmek bize biraz uzun iş gibi geliyor.. zira PicBasic ile LCD'e "word" tipinde yani 16 bitlik bilgiyi desimal olarak yazdırmak
LCDOUT   #degisken
işte bu kadar kolay.. :)
Uzmanlık: Bilgisayar Müh. öğrenci Derleyici: PicBasic Pro Compiler Ver. 2.45 Program: Proteus 6.2.5 ve MCSP

haltug

slm kardeş... sen en güzelini yapıyorsun asm kullanmakla... ilerde anlarsın ne demek istediğimi...zaman gerek sana...
öncelikle adcon saga dayalı byte düzenini sececeksin,yani h registerde en fazla 3, L registerde 255 elde edeceksin.buraya kadar tam 10 bit ok mi?
 2"10 = 1024 yani decimal karşılığı 4 basamaklı...4 sayıcı ayarla tamam mı?
  genel sayma icinde 1 tane register oluştur hazırsan başla... yada izle

dec1      equ h' '
dec10    equ h' '
dec100  equ h' '
dec1000 equ h' '
say equ h' '
;************************************************************
start_main_program
...................
....................
....................
call start_adc_conv
....................
goto start_main_program
;************************************************************
start_adc_conv:
...... ;önce adc konversiyonu oluşturduktan sonra
......
...... ; şimdi decimal tabanlara sayma tekniği ile aktaralım

adc_dec
clrf dec1
clrf dec10
clrf dec100
clrf dec1000

adc_dec_start
movf adresl,w
movwf say
call dec1_convert

movlw d'0'
subwf adresh,w
btfsc status,2
return               ;ana programa dönüş noktan

decf adresh,f
movlw d'255'
movwf say

goto adc_dec_start

dec1_convert
movlw d'0'
subwf say,w
btfsc status,2
return
decf say,f
incf dec1,f

movlw d'246' ;birler basamağı içeriği 9 dan büyükmü?
addwf dec1,w
btfsc status,0
incf dec10,f
btfsc status,0
clrf dec1
bcf status,0

movlw d'246' ;onlar basamağı içeriği 9 dan büyükmü?
addwf dec10,w
btfsc status,0
incf dec100,f
btfsc status,0
clrf dec10
bcf status,0

movlw d'246' ;yuzler basamağı içeriği 9 dan büyükmü?
addwf dec100,w
btfsc status,0
incf dec1000,f
btfsc status,0
clrf dec100
bcf status,0

return

;
;sorun çıkarsa 0543 526 52 74 ten ulaşabilirsin
;başarılar dilerim
;asm micro işlemin temelidir hiçbir macro dil yerini tutamaz....

james

;***16Bitlik Bcd yi decimale Çeviren Alt Program**********
;H_byte da high kısım L_byte da low kısım var.
;Sonuçlar R0,R1,R2 içinde
;örnek:
;H_byte=0FFH
;L_byte=0FFH
;R0=06, R1=55, R2=35

	B2_BCD  	bcf    	STATUS,0                ; clear the carry bit
			movlw   	.16
			movwf   count
			clrf    	R0
			clrf   	R1
			clrf    	R2
	loop16  		rlf     	L_byte
			rlf    	H_byte
			rlf     	R2
			rlf     	R1
			rlf     	R0

			decfsz  	count
			goto    	adjDEC
			RETLW   0

	adjDEC  		movlw  	 R2
			movwf    FSR
			call    	adjBCD

			movlw    R1
			movwf    FSR
			call    	adjBCD

			movlw    R0
			movwf   FSR
			call        adjBCD

			goto    	loop16

	adjBCD  		movlw   3
			addwf   0,W
			movwf   temp1
			btfsc   	temp1,3          	; test if result > 7
			movwf   0
			movlw   30
			addwf   0,W
			movwf   temp1
			btfsc   	temp1,7         	; test if result > 7
			movwf   0               	; save as MSD
			RETLW   0
ARAMIYORUM , BULUYORUM

axanc

assemble'a laf atmıyorum, yanlış anlaşılmasın.. ben de bu işe assemble ile başladım, 28 sayfayı aşan programlar yazdım ancak bir süre sonra kısa sürede proje geliştirmek daha önemli oluyor... :)
Uzmanlık: Bilgisayar Müh. öğrenci Derleyici: PicBasic Pro Compiler Ver. 2.45 Program: Proteus 6.2.5 ve MCSP

SpeedyX

Alıntı yapılan: "axanc"arkadaşım assemble yerine PicBasic kullanırsan işin çok daha kolay olacaktır, şuan kimse assemble ile çok fazla uğraşmadığından senin yazmış olduğun prosedürü çevirmek bize biraz uzun iş gibi geliyor.. zira PicBasic ile LCD'e "word" tipinde yani 16 bitlik bilgiyi desimal olarak yazdırmak
LCDOUT   #degisken
işte bu kadar kolay.. :)

merhaba arkadaşım. öncelikle ilgilendiğin için teşeküür ederim sana.
ben aslında basic,vbasic,pascal,delphi,asp,php,cgi biliyorum fakat: ben pic programlarını yazarken en önem verdiğim kısım komut işleme zamanlarıdır... ben bu PBP veya C de komutların nekadar zaman aldığını bilmiyorum ki?

mesela hassas bir saat devresini rahatça yapabilirmisin.
eğer yapılır diyorsan tamam. ama ben bilmediğim için yapılamayacağını yada daha zor olacağını düşünüyorum...

saygılar.

axanc

sana şunu söylesem belki yeterli olur, amerika savaş uçaklarının bilgisayar yazılımları artık asm yerine "c" dili ile yapacağını açıklamıştı..
Uzmanlık: Bilgisayar Müh. öğrenci Derleyici: PicBasic Pro Compiler Ver. 2.45 Program: Proteus 6.2.5 ve MCSP

SpeedyX

Alıntı yapılan: "axanc"sana şunu söylesem belki yeterli olur, amerika savaş uçaklarının bilgisayar yazılımları artık asm yerine "c" dili ile yapacağını açıklamıştı..

tamam. çok güzel. ama c demiş basic dememiş...

ve bazı c derleyiciler komut uzunluklarını gösterme özelliğine sahip.
basic te ne var?
pbp de resmen dos ortanımda derleme yapıyorsun.

adamlar güzel bir arabirim bile yapmamışlar.
daha ne bekleyebilirim ki ben bunlardan.
aslında basic i çok severim (sebep:en kolayı) ama yetersiz olduğunu herkez kabullenmeli..
Saygılar. :roll:

elektromer

Alıntı yapılan: "SpeedyX"ben adc ile veri okuyorum (16f818) ve bunu adresl ve adresh adlı registerlara yazıyor.
normalde 8bitlik verilerle işlem yaparken kullandığım desimal bul ma prosedürüm vardı.. (display,lcd için.)
bunu 10 bitlik sistemde değiştirmeliyim...
ama nasıl yapacağımı düşünemedim. bir türlü...

.......

---------------------------------------------------
lütfen bana yardımcı olunuz... teşekkürler

Merhaba SpeedyX,

james'in mesajında verdiği Kodları bende bir siteden indirip kendi yazılımlarımda kullandım. Bu Kodları bağımsız çalışacak şekilde düzenledim.
MPLab'da simüle edebilirsin.  Bir problem olursa mesaj yaz. Yardımcı olmaya çalışalım.

;***********************************************************;
; PROGRAM ADI	   :	16 Bitlik Binary'i decimale Çevirme
; DOSYA ADI	   :	B2DEC16.ASM
; YAZAN		   :	
; TARİH		   : 	
; İŞLEMCİ	   :	PIC 16F84
; SAAT HIZI (XTAL) :	4.000 MHz
;***********************************************************;

	LIST	P=16F84,	R=HEX,	C=80
	ERRORLEVEL	-302
	#INCLUDE	"16f84.inc"
	LIST

	__CONFIG _CP_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC


;***********************************************************;
;	RAM tanımlamaları
;***********************************************************;
	CBLOCK	0x0C
	sayici
	gecici0
	gecici1
	gecici3
	gecici
	Alt_Byte
	Ust_Byte
	ENDC

;***********************************************************;
;	Ust_Byte'ı	; ADC'nin Ust byte olarak kabul et.
;	Alt_Byte'ı da	; ADC'nin Alt byte olarak kabul et.
;
;	Sonuçları gecici0, gecici1, gecici3 içinde oluşturacak
;
;	örnek1 : 
;	Ust_Byte = 0x03 
;	Alt_Byte = 0xFF	olarak kabul edersek, 
;	Sonuç ; gecici0=00, gecici1=10, gecici3=23   olur. 
;	Yani  ;	H'03FF'=D'1023' tür.
;
;
;	örnek2 : 
;	Ust_Byte = 0xFF 
;	Alt_Byte = 0xFF	olarak kabul edersek, 
;	Sonuç ; gecici0=06, gecici1=55, gecici3=35   olur. 
;	Yani  ;	H'FFFF'=D'65535' tür.
;***********************************************************;
	org	0x00
	movlw	0xFF
	movwf	Alt_Byte	
	movlw	0xFF
	movwf	Ust_Byte	

;***********************************************************;
B16_BCD	bcf	status,c
	movlw	0x10
	movwf	sayici 
	clrf	gecici0 
	clrf	gecici1 
	clrf	gecici3

B16_BC1	rlf	Alt_Byte,f
	rlf	Ust_Byte,f
	rlf	gecici0,f
	rlf	gecici1,f
	rlf	gecici3,f

	decfsz	sayici 
	goto	DEC_AYR 
	goto	$

;***********************************************************;
DEC_AYR	movlw	gecici3 
	movwf	FSR 
	call	BCD_AYR 

	movlw	gecici1 
	movwf	FSR 
	call	BCD_AYR 

	movlw	gecici0 
	movwf	FSR 
	call	BCD_AYR 

	goto	B16_BC1

;***********************************************************;
BCD_AYR	movlw	0x03 
	addwf	indf,W 
	movwf	gecici 
	btfsc	gecici,3
	movwf	0x00 
	movlw	0x30 
	addwf	indf,W 
	movwf	gecici 
	btfsc	gecici,7
	movwf	indf
	return

;***********************************************************;
	end


Saygılarımla...
Her şey gönlünüzce olsun..

mesmert

slm arkadaşlar yukarda verdiğiniz örneklerin tamamı adc için peki ben bunu nasıl sayı1, sayı2,sayı3,sayı4,sayı5, decimal değerini nasıl bulurum yani eepromdaki 5 değişkenin sayısının decimal karşılığını ben aşağıda yöntem ile yaptım devamlı sorun çıkıyor

BIN2BCD_PLATE
	NOP
	NOP
	MOVLW	0XFF
	SUBWF	PLATE_S,0
	BTFSS	STATUS,Z
	GOTO	B_5
	CLRF	PLATE_S

	NOP
	MOVLW	0XFF
	SUBWF	PLATE_S+1,0
	BTFSS	STATUS,Z
	GOTO	B_5
	CLRF	PLATE_S+1
	
	NOP
	MOVLW	0XFF
	SUBWF	PLATE_S+2,0
	BTFSS	STATUS,Z
	GOTO	B_5
	CLRF	PLATE_S+2

	NOP
	MOVLW	0XFF
	SUBWF	PLATE_S+3,0
	BTFSS	STATUS,Z
	GOTO	B_5
	CLRF	PLATE_S+3

	NOP
	MOVLW	0XFF
	SUBWF	PLATE_S+4,0
	BTFSS	STATUS,Z
	GOTO	B_5
	CLRF	PLATE_S+4
B_5
	NOP
	NOP
	RETURN




şimdiden teşekkürler

Klein

Alıntı yapılan: "SpeedyX"
mesela hassas bir saat devresini rahatça yapabilirmisin.
eğer yapılır diyorsan tamam. ama ben bilmediğim için yapılamayacağını yada daha zor olacağını düşünüyorum...

saygılar.


eğer hassas işleri için interrupt , timer vs.. gibi donanımları kullanmıyor da bu işleri loop'ta yapmak istiyorsanız zaten söyleyecek sözüm yok. Kafadan kaybettiniz demektir.

mesmert

Alıntı yapılan: "Klein"
Alıntı yapılan: "SpeedyX"
mesela hassas bir saat devresini rahatça yapabilirmisin.
eğer yapılır diyorsan tamam. ama ben bilmediğim için yapılamayacağını yada daha zor olacağını düşünüyorum...

saygılar.


eğer hassas işleri için interrupt , timer vs.. gibi donanımları kullanmıyor da bu işleri loop'ta yapmak istiyorsanız zaten söyleyecek sözüm yok. Kafadan kaybettiniz demektir.

hassas işlerde neler kullandığını çokk iii biliyorum o konuda şüpeniz olmasın

aYe

Selam,

@mesmert

Alıntı yapılan: "Klein"eğer hassas işleri için interrupt , timer vs.. gibi donanımları kullanmıyor da bu işleri loop'ta yapmak istiyorsaNIZ zaten söyleyecek sözüm yok. Kafadan kaybettiNİZ demektir.

Bilgi verme amaçlıdır, genele hitaben yazılmıştır.

Rahatsızlık duymanız sanırım yanlış anlamadan kaynaklanıyor.

Genel olarak söylüyorum;

Türkçe en zor diller arasında üst seviyelerdedir, sebebi yoruma dayalı bir dil olmasıdır.

Ör1: "akşam dönerim" bunu "akşam döner(yemek) olucam" diye algılarsanız türkçenin yoruma dayalı yönünü henüz öğrenememişsiniz demektir.

Ör2:
Alıntı yapılan: "mesmert"hassas işlerde neler kullandığını çokk iii biliyorum o konuda şüpeniz olmasın.
Bunu "kumpas'dan bahsediyor" diye de algılayabiliriz, ne kadar doğru olur buyrun siz düşünün.

Arkadaşlar forum genelinde biraz daha sakin olmakta fayda var, işgal altındaki topraklarda yaşayan patlamaya hazır insanlar değiliz, toplum içersinde parmakla gösterilecek kadar az olan nadir insanlarız.


İyi çalışmalar.
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

Ziya

Bir de iki yıl önceki mesajlara cevap verirken biraz daha dikkatli olalım.
Belki arkadaşlar sonradan yöntemlerini değiştirmiş olabilirler. Hatta kullandıkları işlemcileri bile.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

Klein

Alıntı yapılan: "Ziya"Bir de iki yıl önceki mesajlara cevap verirken biraz daha dikkatli olalım.
Belki arkadaşlar sonradan yöntemlerini değiştirmiş olabilirler. Hatta kullandıkları işlemcileri bile.

Kesinlikle haklısınız. Eminim SpeedyX yöntem değiştirmiştir. Ama değiştirmeyenler de kalmış olabilir. Kimse üzerine alınmasın lütfen. Ölen ölür kalan sağlar bizimdir.