3 sayaçlı bekleme fonksiyonu hazırlanması.

Başlatan black, 29 Eylül 2014, 14:09:31

black

Merhaba forum üyeleri aşağıda bekle_100ms yazılmış fonksiyon var fakat burada 100ms bekleme yapılmamış. daha sonra düzeltilmiştir.
Programcının ne yaptığını anlamaya çalışıyorum.

bekle_100ms
MOVLW    D'4'                 
MOVWF    initsay0                 
bekle_100ms1
MOVLW    D'0'                 
MOVWF    initsay1 
bekle_100ms2
MOVLW    D'0'                 
MOVWF    initsay2
bekle_100ms3
    DECFSZ  initsay2,f
    GOTO    bekle_100ms3
    DECFSZ  initsay1,f
    GOTO    bekle_100ms2
    DECFSZ  initsay0,f               
    GOTO    bekle_100ms1
RETURN




10mhz kristal kullanılıyor

fclock=10mhz/4 = 2.5mhz

Buradaki gecikme formülü

((1.sayac+1)(2.sayac+1)(3.sayac+1))/fclock

5/2500000


sonuç=2us olur diyebilirmiyiz? formül doğru mudur?


ete

10 Mhz kristal frekansında bir komut çevrimi 0,4us dir.
Bu gecikme rutini (256+256*256)*4=263.168 çevrim
263.168 * 0,4=105.267us = 105,267 ms olarak hesaplanır.

Ete

black

Ete hocam yanıt verdiğiniz için teşekkür ederim.

Formülü net olarak anlayamadım.

Tkomut = 0.4us bunu anladım ve çevrim sayısıyla çarpılcağını biliyoruz.

(256+256*256)*4

burada gözünüzden kaçan bir şey olabilir mi

initsay0
initsay1
initsay2  değişkenlerini kullanarak formülü verebilirmisiniz?

((initsay0)(initsay1)(initsay2))*Tclock

bu şekilde formül doğrumudur ?

burada initsay1 ve initsay2 değerlerini 0 oldukları için 256 olarak alıcağımızı anlıyorum doğru mudur?

ete

Program başladığında değişkenlere ;
Initsay0=4
Initsay1=0
Initsay2=0
değerlerini verip en alttaki döngüye gelecektir. Burada sistem tam 256 komut çevrimi sayarak ;
DECFSZ     initsay1,f    komut satırına gelecek ve  initsay1 değerinden 1 çıkartarak sonucun sıfır olup olmadığına bakacak ve sıfır değilse yeniden Goto Bekle_100ms2 satırına atlayacaktır. Bu işlem initsay1 değerinin yeniden sıfır olmasına kadar devam edecek yani 256 x 256 kere bu işlem tekrarlanacaktır. Bundan sonra program;
DECFSZ     initsay0,f    satırına gelecek ve initsay0 değerinden 1 çıkartarak sıfır olmasına bakacak ve sıfır oluncaya kadar önceki döngüleri yeniden işletecektir. Buda o döngülerin 4 defa tekrarlanması anlamına gelir. Böylece
Bekle 100ms3 yalnızca 256 defa sayarak bir sonraki döngüye atlayacaktır.
Orada ki döngü ise 256 defa 256 saydıktan sonra bir sonraki döngüye geçilecektir.
Bir sonraki döngüde Intsayı0 değişkenine 4 değeri verilmektedir. Döngü bu sayacın sıfır olmasına kadar devam edecektir.
Bu ise bir önceki döngülerin 4 defa tekrarlanması anlamına gelir. Bu durumda 256+256*256*4 toplam komut çevrimini verir.
Bir komut çevrimi 0,4us olduğuna göre çarpılırsa söylediğim sonuç çıkar. Benim hesabım bu. Bunu formül'e çevirmeye ne gerek var anlamadım. Çok istiyorsan kendin çevir artık.

ete

black

Ete hocam, yanıtınız için teşekkür ederim. kafam daha net anlar diye formül dedim neden toplama yaptığımızı anlamamıştım şimdi fazlasıyla anladım.

Konu benim için ve başka araştırıcak arkadaşlar için yeterince anlaşıldı sanırım.

black

ete hocam ben ufak bir noktayı kaçırıyorum sanırım
decfsz sonucu 0 olunca 2 instruction cycle,
goto ve return 2 instruction cycle
diğerleri 1 instruction cycle

ÜÇ SAYACLİ DÖNGÜ
DELAY               
      MOVLW H'04'(M)            1
      MOVWF SAYAC1            1
DONGU1               
      MOVLW H'FF'(N)            1XM
      MOVWF SAYAC2            1XM
DONGU2               
      MOVLW H'FF'(D)            1xNXM
      MOVWF SAYAC3            1XNXM
DONGU3      
      DECFSZ SAYAC3,F            (D+1) .N.M
      GOTO   DONGU3            (2.D-2) .N .M
DECFSZ SAYAC2,F            (N+1) .M
      GOTO   DONGU2            (2.N-2) . M
DECFSZ SAYAC1,F            M+1
      GOTO   DONGU1            2M-2

YANİ

3  +  4M   +  4NM        +  3DNM

3  +  4*4  +  4*256*4 +  3*4*256*256

15             +4*(256*4+3*256*256)

15             +4*(7*256*256)

15             +28*(256*256)

15              +1835008

1.835.023    instruction cycle

buluyorum acaba hatayı nerede yapıyorum ?



ete

Aradan 30 gün geçmiş sen tekrar eski konuya geri dönüş yaptın anlaşılan.
Sen komut saykıllarını sayıyorsun ben komutun saydırdıklarını sayıyorum.
Genelde bu tür sistemlerde 5-7 komut saykılı daha eklenir buda komut gecikmelerine karşılık gelir.
Ama temel olarak o komut dizisi benim hesapladığım sayıları sayar. Bunda %100 iddialı değilim.
Çünki Assembly'yi çok iyi bilmiyorum. Komut takip edecek kadar biliyorum ama program yazacak kadar bildiğimi iddia edemem.
BU nedenle işin kesin cevabını bu konuda program yazanlar yada işin hesabını iyi yapabilenler versin diyorum.

Ete

black

ete hocam,

Kıymetli yorumlarınız çok teşekkür ederim.

İş yoğunluğundan ancak 30 gün sonra dönebildim. Net bilgiler bulduğumda forumunuzdada paylaşıcam


Powered by EzPortal