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
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
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.
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
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.
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.
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
movlw d´255´
movwf SAYAC1
DONGUBASI1
movlw d´255´
movwf SAYAC2
DONGUBASI2
decfsz SAYAC2,f
goto DONGUBASI2
decfsz SAYAC2,f
goto DONGUBASI2
decfsz SAYAC1,f
goto DONGUBASI1
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
MOVLW D´255´
MOVWF SAYAC1
DONGU1
MOVLW D´255´
MOVWF SAYAC2
MOVLW D´255´
MOVWF SAYAC2
DONGU2
MOVLW D´255´
MOVWF SAYAC3
MOVLW D´255´
MOVWF SAYAC3
DONGU3
DECFSZ SAYAC3,F
GOTO DONGU3
DECFSZ SAYAC2,F
DECFSZ SAYAC3,F
GOTO DONGU3
DECFSZ SAYAC2,F
GOTO DONGU2
DECFSZ SAYAC1,F
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.
Yorumlar
Yorum Gönder