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.
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.
Ö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
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
;............
;..............
;...............