pic basic diliyle dolaylı adresleme

Başlatan ulaser84, 05 Kasım 2006, 20:13:22

ulaser84

Arkadaşlar proton komutlarıyla ram yazmaçlarına dolaylı adresleme yöntemiyle,aldığım seri bilgiyi kaydetmek istiyorum.örneğin 36h adresinden 65h adresleri arasındaki ram sayısı kadar bilgi atıcam.assemblyde buna benzer bir uygulama yapmıştım.fsr ve indf kullanarak.protonda bu nasıl olur.birinci sorum bu.

ikinci soruya gelince seri iletişimde adlığım ascII karekterleri string tanımlamasına nasıl dahil edebilirim.örneğin 100 karakterlik bir string var.
karakterleri karakterlerin yerine içinde ascII kodlar barındıran değişkenler kullanabilirmiyiz?.

yaptığım kayan yazı programında 210 adet register kullandım.buda 35 karakter yapıyor(6*35).bu programa seri iletişim yardımıyla pc den belirlediğim karakter tablosunu tek tek gönderiyorum.210 reg dolunca program kayıttan çıkıp ekranda beliriyor.arka arkaya bilgi al yazmaca ata olayı pek göze hoş gelmemekle beraber program belleğini ciddi bir biçimde dolduruyor.dolaylı adreslemeyi bu yüzden sordum.877nin 3 bankında bulunan 70 er reg i bu yöntemle doldurmak gibi bir mantık.

amacım bu programı daha esnek bir biçime getirip karakter tablosu oluşturmak.dataları 6 lı paketler halinde değilde ascII koduna sadık kalacak bir biçimde 35 adet(veya daha fazla)belirlediğim yazmaçlara buradanda string içerisine yollamak.ancak lookup,string,case denklemini çözüp dataları sütünlara paylaştırmak gerekecek.lookup tablosu kullanarak yazı kaydırma olayını anlatabilecek arkadaşım varmı basit bir şekilde.bu mantığı kavramam gerekli.geliştirmek isteyen arkadaşlara programı gönderip mantığını anlatabilirim.herkese iyigünler iyi çalışmalar.

rree

DIM Name[ length ] AS BYTE
DIM Name[ length ] AS WORD

where Name is the variable's given name, and the new argument, [ length ], informs the compiler how many elements you want the array to contain. For example: -

DIM MYARRAY[10] AS BYTE  ' Create a 10 element byte array.
DIM MYARRAY[10] AS WORD  ' Create a 10 element word array.

Dolaylı adrese niye ihtiyaç olduğunu anlamadım. gerçi kayan yazı ile uğraşmadım. Dizi tanımlı değişken işini görmezmi!

ulaser84

asm de şöyle bir dolaylı adresleme mantığı var
örnek olarak:0x20 adresinden itibaren 30 adet bellek konumunu temizleyen program

    movlw   d'30'
    movwf   sayac
    movlw   0x20
    movwf   fsr
devam:
    clrf        indf
    incf       sayac
    incf       fsr,f
    decfsz   sayac,f
    goto      devam

çalışması:örneğin 0x20 ram adresinde d'135' bilgisi var.0x20 adresi fsr ye yüklenir.indf yazmacı içeriği d'135' olur.temizle komutuyla indf içi d'0' olur.aynı zamanda 0x20 ram register içeriği 0 olur.sayac 1 azaltılır.aynı döngüye devam edilir.sayac sıfırlandığı zaman 0x20 adresinden itibaren 30 adet bellek konumu temizlenmiş olur.

pratik bir yaklaşımla birkaç komut kullanarak program belleğini şişirmeden belleğe sıraya kaydetme veya silme olayını yapan bir program.düz programlama mantığıyla(direk adresleme metodu) düşünüldüğünde alt alta temizle komutlarını 30 bellek adresi içinde kullanmamız gerekecekti.

burada yapmak istediğim asm kullanmadan bu mantıkla çalışan basic komutunu programa ilave etmek.

seri alış komutu yanına değiştirmek istediğimiz bellek konumlarını yanyana ilave etmek suretiyle işimizi halledebiliriz.bunu deneyip asm koduna bakmadım.belki yukarıdaki işleri yapıyor olabilir.deneyip sonucuna bakmak gerekiyor.

rree

Dim  DDizi[20] As Byte
Dim VAr1 As Byte
VAr1 = 1
Repeat
 DDizi[VAr1]=0
 Until VAr1 > 20
Stop
----------------------------------------------------
Asmsi.....
F1_000012 equ $ ; in [DIZI.BAS] VAr1 = 1
   Movlw 1
   Bcf STATUS,5
ram_bank = 0
   Movwf VAR1
F1_000013 equ $ ; in [DIZI.BAS] Repeat
bc@LL1
F1_000015 equ $ ; in [DIZI.BAS] DDizi[VAr1]=0
   Movf VAR1,W
   Addlw DDIZI
   Movwf FSR
   Movlw 0
   Movwf INDF
F1_000017 equ $ ; in [DIZI.BAS] Until VAr1 > 20
   Movlw 21
   Subwf VAR1,W
   set@page bc@LL1
   Btfss STATUS,0
   Goto bc@LL1
bc@LL2
____--Oda dolaylı adrelemeyi kullanıyor.  Dolaylı adresleme için bir komut yapı görmedim.

ulaser84

eklediğiniz program 1. dizeden itibaren başlayan ve tanımlanan 20 değişkene  sırayla 0 uyguluyor.dolaylı adreslemenin ta kendisi

değişkenleri tek tek tanımlamak yerine DIM VERI[100] AS BYTE
şeklinde tanımlayıp,alt programda yazdığınız şekilde verinin içeriğini değiştirdiğimizde  benim istediğim kalıpta asm üretmesi muhtemel.

deneme amaçlı yazdığım değişken tanımlama komutunun asm karşılığıda şöyle oluyor.

veri#1 36 veri#2 37......

bunun gibi 100 adet ekleme yapıyor.program içinde de kullanmak istediğimiz veriyi veri=veri#1 gibi bir tanımlamayla aktarabiliyoruz.yazdığın komut toplu değişken tanımlamasıyla beraber kullanılıyor olmalı.yoksa tek tek değişken tanımlaması ile dolaylı adresleme yapmak zor gibi.

kendi programımda aldığım seri bilgi kayıtlarını şöyle kaydettim.

rsin d1,d2,d3.................d210

asm kod olarak oldukça büyük.veri alma alt programını çağırıyor.alınan veri d1 e daha sonra aynı rutin işlemler ile d210 a kadar kayıt yapılıyor.sonuçta işimi fazlasıyla gördü ancak tek bir kalıpta değişken tanımlamak daha iyi gibi gözüküyor.program için tşk ederim.