Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

CALL KOMUTU

Başlatan MICROCEBEL, 24 Nisan 2006, 00:53:10

MICROCEBEL

Selamün aleyküm;

Bir programda arka arkaya maximum kaç adet call komutu kullanabiliriz.Bunun stack lerle bir alakası varmıdır.Ben maximum 8 adet kullanabiliriz diye okudum bi kitaptan ve 8den sonraki return lerde farklı yerlere dallanabileceğini yazıyo.Fakat bir programımda ben 20 ye yakın arkası arkasıya call komutu kulladım ama sorun çıkmadı.Yani benim öğrenmek istediğim maximum nekadar kullanabiliriz.Çalışmalarınızda başarılar.......

HEXF2

Eğer PIC18F452 yada 18F ailesinden başka bir PIC kullanıyorsan 20 kere arka arkaya call  ile bir alt program çağırmanda bir problem olmaz.Çünkü 18'lerde stack seviyesi 32'dir.16f ailesinde ise bu seviye 8'dir.Eğer sen 16f ailesinden bir PIC ile call ile girdiğin progmadan RETURN ile hiç dönmeden üst üst'e 20 alt program çağırdıysan sen git bit yüzünü yıka dostum :)

Ben çok önceleri 8'lik yığını aştığımda ya programım kitleniyordu yada 8'den sonraki çağırmalarım stack'in ilk adresine yani üstüne yazmaya başlıyordu.Belki de sende de böyle birşey olmuştur.18f ailesinde stack taşma kontrol bayrağı olduğundan bu gibi bir durumu kendin kodlarla takip edebilirsin.Ama 16f'lerde böyle bir flag yok.

XX_CİHAN_XX

Alıntı yapılan: "MICROCEBEL"Selamün aleyküm;

Bir programda arka arkaya maximum kaç adet call komutu kullanabiliriz.Bunun stack lerle bir alakası varmıdır.Ben maximum 8 adet kullanabiliriz diye okudum bi kitaptan ve 8den sonraki return lerde farklı yerlere dallanabileceğini yazıyo.Fakat bir programımda ben 20 ye yakın arkası arkasıya call komutu kulladım ama sorun çıkmadı.Yani benim öğrenmek istediğim maximum nekadar kullanabiliriz.Çalışmalarınızda başarılar.......
Aleyküm Selam
Bu olay stack ler ıle dogrudan alakalıdır ve kıtapta okudugun gıbı 8 den fazla kullanamazsın. kullanırsın fakat 9. call stack tasması yapacagından dolayı program counter farklı yerlere dallanır ve program ya kıtlenır yada sapıtır.Bu arada 20 ye yakın arka arkaya call komutu kullandım bırsey olmadı demısın arka arkaya kullandıktan sonra 500 tanede kullanabılırsın, pıcın kapasıtesı yetene kadarda :D
Burda onemlı olan iç içe kullanmamak.iç içe kullanırsan ve 8 den fazla kullanırsan bu call komutunu o zaman stack taşar ve yukarda dedıgım olay olur.Arka arkaya istedıgın kadar kullanabılırsın.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

supermakarna

..............
bcf  porta,1
.............
call altrutin1
call altrutin2
call altrutin3
call altrutin4
call altrutin5
call altrutin6
call altrutin7
call altrutin8
call altrutin9
call altrutin10
.................
call altrutin1000
böyle yaparak 1000kerede alt rutin çağırabilirsin tabi program hazısası kadar.

ama iç içe çağırırsan kitlenir program

bigbey

Alıntı yapılan: "süpermakarna"..............
bcf  porta,1
.............
call altrutin1
call altrutin2
call altrutin3
call altrutin4
call altrutin5
call altrutin6
call altrutin7
call altrutin8
call altrutin9
call altrutin10
.................
call altrutin1000
böyle yaparak 1000kerede alt rutin çağırabilirsin tabi program hazısası kadar.

ama iç içe çağırırsan kitlenir program

olmaz arkadaş 8 call işleminden sonra 9 call komutunun program count bilgisi stack 'ta taşmaya neden olur ve 9. call komutunun bilgisi 1.call komutunun program adres bilgisinin üzerine geleceği için 1. call komutunun yerine artık dönemezsin . call komutu return verilmeden üst üste kesinlikle 16xxxx serisi PIC ler için 8 dir.
TA6R

CoşkuN

Şimdi kafam karıştı biraz.Yukarıda listelenmiş altprogramların herbirine gidilip geri dönüldükten sonra diğeri çağırılmıyor mu? Bu durumda neden stack'de taşma oluyor.
acall alt1
acall alt2
...
...
acall alt36



alt1:
...
....
ret

alt2:
...
....
ret

.
.
.
.
alt36:
..
.
.
ret



şeklindeki programda stack sorunu olur mu?

Veli B.

Alıntı yapılan: "microchip' teki amcalar"
Note 1: There are no status bits to indicate stack
overflow or stack underflow conditions.
2: There are no instructions/mnemonics
called PUSH or POP. These are actions
that occur from the execution of the
CALL, RETURN, RETLW and RETFIE
instructions, or the vectoring to an interrupt
address.

Sadece Call olarak düşünmemek lazım.

bigbey

Alıntı yapılan: "katana"
Sadece Call olarak düşünmemek lazım.

evet tabi interrupt da aynı koşula dahil burda her iki koşulda da geri dönmeden üst üste 9. stack bilgisi oluşursa, ilk birinci stack kaybolur.

Alıntı yapılan: "CoskuN"
Şimdi kafam karıştı biraz.Yukarıda listelenmiş altprogramların herbirine gidilip geri dönüldükten sonra diğeri çağırılmıyor mu? Bu durumda neden stack'de taşma oluyor.
acall alt1 
acall alt2 
... 
... 
acall alt36 



alt1: 
... 
.... 
ret 

alt2: 
... 
.... 
ret 

. 
. 
. 
. 
alt36: 
.. 
. 
. 
ret

Bizde zaten geri dönülmezse, yani 8. stack bilgisi oluştuğunda  eğer 9. stack bilgisi (CALL veya Interrupt) oluşursa 1. stack bilgisi (Program counter bilgisi) kaybolur diyorum. (diyoruz)
TA6R

supermakarna

Alıntı yapılan: "bigbey"
Alıntı yapılan: "süpermakarna"..............
bcf  porta,1
.............
call altrutin1
call altrutin2
call altrutin3
call altrutin4
call altrutin5
call altrutin6
call altrutin7
call altrutin8
call altrutin9
call altrutin10
.................
call altrutin1000
böyle yaparak 1000kerede alt rutin çağırabilirsin tabi program hazısası kadar.

ama iç içe çağırırsan kitlenir program

olmaz arkadaş 8 call işleminden sonra 9 call komutunun program count bilgisi stack 'ta taşmaya neden olur ve 9. call komutunun bilgisi 1.call komutunun program adres bilgisinin üzerine geleceği için 1. call komutunun yerine artık dönemezsin . call komutu return verilmeden üst üste kesinlikle 16xxxx serisi PIC ler için 8 dir.


dediğine kesinlikle katılmıyorum. iyide zaten 9.callı demem için diğer alt rutinden çıkmam gerekiyo.

supermakarna

yanlış alıntı yapmışım bidahada silemedim.

bigbey

Neyse Bana göre konu sanırım anlaşılmıştır. Bu konuda başka bir söz söylememe gerek yok diyorum. Herkese kolay gelsin
TA6R