KTÜ Mikroişlemciler Dersi Bütünleme Sınavı Çözümü
Diğer bütün setlemelerin yapıldığı söylendiği için direk olarak interrupt service rutinini yazmaya başlıyabiliriz. İşlemci 4MHz hızında çalıştığından her instruction cycle'nın süresi yani periyodu T=1/F formülünden hesaplandığında T=0,25x10^-6 olduğu bulunur. 3sn lik bir bir darbe içinse 3/0,25x10^-6=12x10^6 cycle gerekmektedir. Tam emin olmamakla beraber dec ve jnz komutlarının her birinin 2 şer cycle da tamamlandığını varsayarsak bize 3 milyon cycle lazımdır.
3.000.000=2DC6C0h ve 2DC6C0h/F000h=30 olduğuna göre 3sn uzunluğu iç içe iki döngü ile halledilebilir. Dıştaki döngü 30 kere F000 sayısını saydıran içteki döngüyü çevirecektir.
Soru 3
"altprog" ile R4,R5 ve R6 bellekleri temizlenir.
altprog clr R4
clr R5
clr R6
R4 belleğinin içeriği temizlendiği için 0 olduğundan
240h(R4)=240h olur. Bu işlem şu şekildedir
Eğer R4=01h olsaydı 240h(R4)=241h
Eğer R4=0Ah olsaydı 240h(R4)=24Ah
Eğer R4=01Fh olsaydı 240h(R4)=25Fh biçiminde devam eder.
mov.b 240h(R4),R5 komutu ile tablodaki 240h'ın belleğindeki değer R5 registerına yazılır
R5=1F
sxt komutu; 16 bitlik bir adresteki 8. biti 9 ile 16. bitler arasına yazar. Örneğin diyelim ki R8 belleğinde
R8=0000 0000 1000 0000b sayısı olsun
sxt R8 Dediğimizde R8 belleğindeki 8. bit 1 olduğu için
R8= 1111 1111 1000 0000 olur
R5=1F=0001 1111 ;7. bit 0 yani sxt komutu ile 8 ile 15. bitler arasına yalnızca 0 yazılacaktır
add R5,R6 komutu ile her yeni R5 değeri R6 belleğine toplanarak kaydedilir
inc R4 R4 ü bir arttırı
cmp #04h,R4 ise R4 ün 4 olup olmadığına bakar eğer 4 değilse jnz komutu ile tekrar etiketine geri atlayıp aradadaki işlemleri tekrarlar
Burada dikkat edilmesi gereken 240h(R4) hesaplanırken R4=4 sonucu hesaba girmez çünkü R4=4 olduğunda cmp #04h,R4 sonucu sıfır olacak ve jnz(jump not zero, sıfır değilse atla) koşulunu karşılamıyacağı için döngünden çıkacaktır. Bu durumda hesaba alınacak bellekler 240h(R4) için 240h,241h,242h ve 243h dür
240h=1Fh=0001 1111
241h=36h=0011 0110
242h=04h=0000 0100
243h=75h=0111 0101
bütün bu sayıların 7 biti sıfır olduğundan sayıların değerinde bir değişiklik olmayacktır. Bu durumda add R5,R6 komutu sırası ile 1Fh, 36h, 04h ve 75h'ı art arda R6 registerı içinde toplayacaktı.
R6=1Fh+36h+04h+75h=CE
ikinci aşamada R6 üç kere rra komutu ile sağa kaydırılmaktadır
CE=1100 1110b
rra R6 = 0110 0111b
rra R6 = 0011 0011b
rra R6 = 0001 0001b=11h
11h R6 registerındaki nihai değerdir. Alt programdan dönerken bellekteki sayı budur.
Beğendiyseniz lütfen soldaki butona tıklayarak +1 leyin
3.000.000=2DC6C0h ve 2DC6C0h/F000h=30 olduğuna göre 3sn uzunluğu iç içe iki döngü ile halledilebilir. Dıştaki döngü 30 kere F000 sayısını saydıran içteki döngüyü çevirecektir.
Soru 3
"altprog" ile R4,R5 ve R6 bellekleri temizlenir.
altprog clr R4
clr R5
clr R6
R4 belleğinin içeriği temizlendiği için 0 olduğundan
240h(R4)=240h olur. Bu işlem şu şekildedir
Eğer R4=01h olsaydı 240h(R4)=241h
Eğer R4=0Ah olsaydı 240h(R4)=24Ah
Eğer R4=01Fh olsaydı 240h(R4)=25Fh biçiminde devam eder.
mov.b 240h(R4),R5 komutu ile tablodaki 240h'ın belleğindeki değer R5 registerına yazılır
R5=1F
sxt komutu; 16 bitlik bir adresteki 8. biti 9 ile 16. bitler arasına yazar. Örneğin diyelim ki R8 belleğinde
R8=0000 0000 1000 0000b sayısı olsun
sxt R8 Dediğimizde R8 belleğindeki 8. bit 1 olduğu için
R8= 1111 1111 1000 0000 olur
R5=1F=0001 1111 ;7. bit 0 yani sxt komutu ile 8 ile 15. bitler arasına yalnızca 0 yazılacaktır
add R5,R6 komutu ile her yeni R5 değeri R6 belleğine toplanarak kaydedilir
inc R4 R4 ü bir arttırı
cmp #04h,R4 ise R4 ün 4 olup olmadığına bakar eğer 4 değilse jnz komutu ile tekrar etiketine geri atlayıp aradadaki işlemleri tekrarlar
Burada dikkat edilmesi gereken 240h(R4) hesaplanırken R4=4 sonucu hesaba girmez çünkü R4=4 olduğunda cmp #04h,R4 sonucu sıfır olacak ve jnz(jump not zero, sıfır değilse atla) koşulunu karşılamıyacağı için döngünden çıkacaktır. Bu durumda hesaba alınacak bellekler 240h(R4) için 240h,241h,242h ve 243h dür
240h=1Fh=0001 1111
241h=36h=0011 0110
242h=04h=0000 0100
243h=75h=0111 0101
bütün bu sayıların 7 biti sıfır olduğundan sayıların değerinde bir değişiklik olmayacktır. Bu durumda add R5,R6 komutu sırası ile 1Fh, 36h, 04h ve 75h'ı art arda R6 registerı içinde toplayacaktı.
R6=1Fh+36h+04h+75h=CE
ikinci aşamada R6 üç kere rra komutu ile sağa kaydırılmaktadır
CE=1100 1110b
rra R6 = 0110 0111b
rra R6 = 0011 0011b
rra R6 = 0001 0001b=11h
11h R6 registerındaki nihai değerdir. Alt programdan dönerken bellekteki sayı budur.
Yorumlar
Yorum Gönder