ASSEMBY ile Döngü


Assembler’de döngü  yapmak için etiketlerden ve yönlendirme komutu olan GOTO komutundan yararlanırız.

örneğin:
dongubasi
   goto dongubasi

2 satırlık bu program, assembler ‘de yapabileceğiniz en küçük döngüdür ve sonsuz bir döngüdür. LED’le ile ilgili bir örnek verirsek;
aşağıdaki kodlar ile portB nin birinci pin´ine (0 biti) bağlı olan LED yakılıp söndürülür.

dongubasi
    bsf portb,0
    bcf portb,0
goto dongubasi

Eğer bu programı denerseniz, devreyi çalıştırdığınızda göreceksiniz ki programınız sizin dediğinizi yapmayacak, yani diyeceksiniz ki "…bu program çalışmıyor.

Halbuki bu kodlar doğru.
Burada ince bir nokta var.
Biraz elektrik-elektronik bilginiz varsa şu soruya cevap verirsiniz değil mi?

Soru: Evimizdeki ampuller devamlı yanıyor mudur, yani anahtarı açtığınızdan itibaren kapanıncaya kadar devamlı yanar mı?
Cevap: Evet yanar.
Ama bu cevap doğru değil. Bu lambalar, devamlı yanmaz, arasıra canı sönmek ister ve söner, normal şartlar altında bu sönme olayı 10 milisaniyede bir olur.

( Lambalarımız saniyede 100 defa iyice sönmesine rağmen biz bunu fark etmeyiz. Neden? Çünkü 10 milisaniye gibi bir zamanı gözlerimiz algılamaz ve devamlı yanıyor görürüz, çünkü lamba sönmesine rağmen yanık kalma süresi daha fazla olduğundan devamlı yanıyor görürüz.)

dongubasi
   bsf portb,0
   bcf portb,0
goto dongubasi

PIC’ de eğer osilatör olarak 4 MHZ osilatör kullanıyorsak yukardaki programda, led yanar 1 mikrosaniye yanık kalır sonra söner ve 3 mikrosaniye sönük kalır. Bu programda biz bir şey gözlemleyemeyiz. Sönük kalma süresi yanık kalma süresinden daha fazla olduğu için LED devamlı sönük görünecektir.

Yukardaki döngü özgür, bağımsız ve koşulsuz bir döngü ve belli bir sayısı yok. Yani bu program PIC resetleninceye kadar ya da gücü kesilinceye kadar ya da bozuluncaya kadar devam edecektir.

Şimdi 10 defa çalışacak bir alt bölüm yapalım.
Bunun için mantığı anlatalım. (Çünkü assembler’de döngü için bir komut yok.)

1) belli sayıda bir döngü yapılırken önce döngü sayısı bir değişkene aktarılır.
2) döngü başı için bir etiket tanımlanır.
3) ardından bu sayı bir komutla her defasında bir azaltılır.
DECFSZ komutu bu işi yapar. F register içindeki sayıyı bir azaltıp F registerin içine koyar, ve F içindeki sayı sıfıra indiğinde yönlendirme yaparak kendinden sonraki komutu işletmeden, PIC´i kendinden sonraki ikinci komuta gönderir.
4) Eğer sıfıra ulaşıldıysa zaten döngüden çıkar. Ama eğer sıfıra ulaşılmadıysa dongubasi etiketine yönlendirme yapılması gerekir ki döngü devam etsin.
Bunu da GOTO komutu yapar.
5) … döngü dışına çıkışta ne yapacaksa yada program devam edecekse bir sonraki satırda da o verilir.

Şimdi bunları toparlayalım.

movlw d´10´
movwf SAYAC

DONGUBASI
  decfsz SAYAC,f
   goto DONGUBASI
  goto BAS

SAYAC değişkenine 10 atanırsa döngü 10 defa işlenir 100 atanırsa 100 defa işlenir.
PIC  içinde döngülerin en çok kullanıldığı yerler gecikme sağlamak, buton kontrolü gibi işlemlerdir.  Gözle görülebilir bir gecikme sağlayacaksak bu durumda döngü için kullanılan sayı artırılmalıdır. Bu durumda bir adet döngü bizim ihtiyacımızı karşılamaz.

Ama program gereği bir miktar mesela 100 mikrosaniye gibi bir gecikme sağlamak istiyorsak bu durumda bir döngü işimizi görür.

Gözle görülür bir döngüden kasıt mesela LED’i flaşör gibi yakıp söndürme işlemi yapacaksak iç içe döngüler kurmalıyız. Ama göze göre ayar olduğu için de bunu kendimiz değişkenlere vereceğimiz sayılarla deneyerek yada hesaplayarak ayarlarız.

İç içe döngülerde de mantık aynı olacaktır.
Program birinci döngüden başlar ve hemen ikinci döngüye gider,
ikinci döngü bittiğinde birinci döngünün ilk dönüşü tamamlanmış olur.

İÇ İÇE 2 lİ DÖNGÜ:

TUMDONGU
movlw d´255´
movwf SAYAC1

DONGUBASI1
movlw d´255´
movwf SAYAC2
DONGUBASI2
  decfsz   SAYAC2,f
  goto   DONGUBASI2
  decfsz   SAYAC1,f
  goto   DONGUBASI1
RETURN

Burada return komutu; eğer bu döngü bir gecikme alt yordamı olarak çağrılacaksa PIC’i  çağrıldığı yere geri göndermek içindir. Eğer bir yerden çağrılma yapılmayacak ve program işlenip devam edecekse return komutuna gerek yoktur.

İÇ İÇE 3 lü DÖNGÜ:

GECIKME
MOVLW D´255´
MOVWF SAYAC1
DONGU1
MOVLW D´255´
MOVWF SAYAC2
DONGU2
MOVLW D´255´
MOVWF SAYAC3
DONGU3
DECFSZ SAYAC3,F
GOTO DONGU3
DECFSZ SAYAC2,F
GOTO DONGU2
DECFSZ SAYAC1,F
GOTO DONGU1
RETURN
END

Bu son alt program iç içe 3 lü döngüde elde edilebilecek en fazla zamanı elde eder.
Şüphesiz ki burada elde edilecek zaman gecikmesi 255X255X255 mikrosaniye  diye akla gelebilir ama değildir.

Sadece yukardan aşağıya komutların bir defa işlendiğini göz önüne alırsak 13 adet komut vardır ve bu aralık içi çe defalarca işlenmektedir.

Buradaki 3 lü döngüde sayac değişkenlerine 255 verip belli aralıklarla LED’lerin sönüp yanmasını beklemeyin. Çükü döngüden çıkmak için PIC in yaklaşık 50.000.000 küsur tane işleyecek komutu var.

Bu da yaklaşık 50 saniye gibi bir zamana denk düşer.

KAYNAK: elektromania.net  [12/03/2019]



Yorumlar