Assembly Pic ile Dolaylı Adresleme FSR INDF + örnek kod gösterimi

camby

Üye
Katılım
12 Mar 2009
Mesajlar
426
Puanları
1
Dolaylı adresleme (yani indirek adresleme) pic'teki (MCU'lardaki) önemli özelliklerden biridir , INDF ve FSR registerları(yazmaçları) ile yapılır.

Özellikle Asssembly dilinde programlamada büyük kolaylık sağlar.

Bu konuda açılmış eski başlıklar : https://www.kontrolkalemi.com/forum/pic-programlama/31943-assembly-yardim.html

https://www.kontrolkalemi.com/forum...2ff-arasindaki-byte-larin-xor.html#post188139

İşlem yapılmak istenen register'ın adresi FSR registerına yüklenir , ardından INDF registerı ile işlem yapılır.

Sırayla 80 adet değişkenin değerlerinin incelenip işlem yapılması gerektiğini düşündüğümüzde bu işlemleri her seferinde değişkenin adresini değiştirerek alt alta 80 kez yapmamız gerektiği anlamına gelir. Bu da çok uzun program kodları anlamına gelir ki 80den fazla işlem yapılması gerektiği durumlarda çoğu zaman program kodu pice sığmayacağı gibi yazılması da çekilmezi bir hal alır.

Örnekler pic 16f84a için yazılmıştır , diğerlerinde de kolaylıkla yapılabilir .

1- Bu Örnekte Ramde tanımlı 68 adet değişken tek bir döngü içinde teker teker siliniyor , ilk elemanın adresi 0x20 , son elemanın adresi 0x4F. Bunun için FSR ye başlangıç adresi olan 0x20'yi yazıp clrf INDF ile de 0x20'deki register'a clrf işlemini yapmış oluruz. ardından FSR'yi bir arttırıp yani 0x21 yapıp bu işlemi tekrardan yaparız , ta ki 0x35 olana kadar.

Kod:
movlw		0x20		
		movwf		FSR
TEKRAR		clrf		INDF
		incf		FSR
		movlw		0x4F

		subwf		FSR,0
		btfss		STATUS,2  ; son elemana gelindi mi ?

		GOTO		TEKRAR
Görüldüğü gibi bu kod bizi alt alta 68 kere CLRF 0x20 , CLRF 0x21 ... , 0x4F yazmaktan kurtarımıştır.

2 .
Program : Programda 67 adet değerleri girilmiş olduğunu kabul ettiğimiz registerın küçükten büyüğe doğru sıralamamız isteniyor . ideal sınav son sorusu : ) Bu durumda sırayla 2 elemanı karşılaştırıp işlem yapıp 67 defa bunu alt alta yapmıyoruz , dolaylı adresleme kullanıyoruz...
Dolaylı adresleme ile ilk elemanın adresi FSR'ye yüklenmiş ve bir sonraki elemanla değeri karşılaştırılmıştır. Eğer ilk elemanın değeri 2. elemanın değerinden büyükse yerleri değiştirilmiş bu da başka bir belirlediğimiz değişken olan TEMP ile yapılmıştır . Ardından FSR 1 arttırılarak 2. ve 3. elemanın değerleri aynı şekilde karşılaştırılmıştır.

Kod:
;Pic16f84a kullanığımızı varsayaraktan diziyi 0x0C adresinden başlatıyorum
;Bu program ile 16f84a ile 67 adet değişen küçükten büyüğe sıralanabilir


;=======Kullanılan Yazmaçlar======
	
		CBLOCK		0x0C		;a dizisinin eleman sayısı 67	
		a1				;dizinin ilk elemanın ismi a1 adresi:0x0C
		a2				;0x0D
		a3				;0x0E
		a4				;0x0F
		a5				;0x10
;		....
;		...
		a67				;0x4E
		TEMP				;0x4F
		ENDC

;..................
;...............
;...................

BASLA		movlw		0x0B		;dizinin ilk elemanın bir önceki adresi FSR yazmacına yüklendi
		movwf		FSR

UP		movlw		0x17		
		subwf		FSR,w
		btfsc		STATUS,Z	;dizinin son elemanı kontrol edildi mi?
		GOTO		CIKIS		;dizilim tamamlandı , ÇIKIŞ

		incf		FSR		;dizinin 2 elemanını karşılaştıran bölüm
		movf		INDF,w
		incf		FSR
		subwf		INDF,w
		btfss		STATUS,C	;sıralama doğru mu?
		GOTO		UP		;evet doğru , sıradakine bak
						
		movf		INDF,w		;doğru değil yerlerini değiştir
		movwf		TEMP
		decf		FSR
		movf		INDF,w
		incf		FSR
		movwf		INDF
		decf		FSR
		movf		TEMP,w
		movwf		INDF
		GOTO		UP		;Başa dön

CIKIS 		nop				;işlem tamam , a dizisi küçükten büyüğe dizildi
;............
;..............
;...............
 
hacım sen bana ders versene :D , bu hafta şunu çalış de ben ona çalışayım ,falan filan devam edelim böyle :D sorularım olursa sorayım sana :D
 

Forum istatistikleri

Konular
128,198
Mesajlar
915,774
Kullanıcılar
449,980
Son üye
shield325

Yeni konular

Çevrimiçi üyeler

Geri
Üst