16f877 nin stack ını temizleme

Başlatan refik1, 14 Haziran 2006, 17:32:22

refik1

arkadaşlar yazılımsal olarak stack ları nasıl başa alırım
dışardan reset yapmadan

aykuto

Amacınız pic'e software reset attırmak ise sadece 0 (sıfır) nolu adrese gitmesini söylemeniz yeterli. 16 serisi piclerde stack pointer diye bir şey yok. Stack circular bir yapıda. Yani kapasite dolduğu zaman en eskisi siliniyor gibi düşünebilirsiniz. Dolayısıyla reset için stack pointer'ı başa alma ihtiyacınız da yok.
Umarım sorunuzun cevabı olmuştur.

refik1

yani 0. adrese yolladığımda stack da 4 adet adres olsada farketmez bundan sonra gelen 8 stack adreside olduğu gibi muafaza edilir diyorsunuz.

Klein

meraktan soruyorum... stack pointer neden başa alınmak istenir?

XX_CİHAN_XX

stack regısterıne yazılımsal olarak mudahale edmezsınız.Ancak resetleme işlemı yaparak mudahale edebılırsınız.Bu arada bende merak ettım dogrusu ne amacla boyle bırsey apmak ıstedıgınızı.
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.

yalnayak

program icinde bir cok yere dallanma icinde dallanmalar yapip 8 stack dolduruluyorsa program artik gittigi yerden gelemez ve sizin istemiz disinda calismaya baslar.ben bi aralar stack i resetlemek yada sifirlamak istedim.ama basaramayinca programa yuklendim.gereksiz call lari goto larla halledip 8 sinirini asmamaya basararak isi bitirdim
Kızımın iffeti batmakta rezîlin gözüne... Acırım tükürüğe billâhi, tükürsem yüzüne..! MEHMED AKİF ERSOY  Kardan Adaminla,GUNES'e calim mi satiyorsun?

Klein

Alıntı yapılan: "yalnayak"program icinde bir cok yere dallanma icinde dallanmalar yapip 8 stack dolduruluyorsa program artik gittigi yerden gelemez ve sizin istemiz disinda calismaya baslar.ben bi aralar stack i resetlemek yada sifirlamak istedim.ama basaramayinca programa yuklendim.gereksiz call lari goto larla halledip 8 sinirini asmamaya basararak isi bitirdim

Tamam stack şişince program geri dönemez ama resetleyince ne olacaktı onu halen anlamadım. Resetleyince program bütün çağrı noktalarına normal mi dönecekti. Bunun normal yolu bahsettiğiniz gibi stack'in şişmesine mani olmaktır. Ya da goto ile gidip bir registere dönüş adresini atayarak kendi stackinizi oluşturmaktır.

refik1

arkadaşlar şöyle düşünün
parogram 3 - 4 call dan sonra bir sebebten pik aldı yani program sayaçının içeriği değişti

sizde program içinde bu sıçarma işini bir şekilde anladınız
eger stacak yapısı bir pointer regıstırında tutuluyorsa başa atsanızda işler karışacakdır

aykuto arkadaşın dediğigibi bir pointer yoksa mesele yok '
yani ilk giren son çıkar enaltdaki 8 den sonrasıda kaybolur bir yapıdaysa

ama bir pointerde tutuluyorsa stack yeri işler berbat demekdir :)

yalnayak

arkadaslarinda dedigi gibi.stack a yazimsal olarak diger registirlar gibi mudahale edilemiyo.hangi pic i kullaniyosun bilmiyorum ama 16f serilerinde 8 stack yigini var.3,4 . stacklardan sonra programi baska yerde atsanda belli bi zaman sonra 8 yigini doldurursan programin kilitlenecek.aykutonun dedigi gibi ilk giren son cikar diye bişi yok.ilk stack in ustune stacklar gelir.ilk stack 8 olursa artik ustune yigamazsin.mutlaka o gittigin callardan geri donmen lazim.
Kızımın iffeti batmakta rezîlin gözüne... Acırım tükürüğe billâhi, tükürsem yüzüne..! MEHMED AKİF ERSOY  Kardan Adaminla,GUNES'e calim mi satiyorsun?

refik1

yalnayak kardeş
şimdi senin söylediğin aykuto kardeşin yazdıkları ile tes düşüyor
bu işin doğrusu nedir bilen yokmu

varsayalım seni söylediğingibi peki bu 3 - 4 stack dan nasıl kurtulacaksın
programı yeniden başlatmak istiyoruz diyelim

illaki dışardan resetmi atacağız ?

supermakarna

Refik1 kardeş senin gürültüden dolayı program sayacının değişme olası biraz düşük bu olaydan önce picin zaten reset alır. Mikro işlemcilerde bu mumkün çünkü data hattı ve adres hattı dışarıda zaten mcu'lar çıkma sebeplerinden biri budur.
Diyelimki gürültü aldı program sayacın yanlış değer aldı.
1.Stack okunamaz yazılamaz.
2.Zaten program sayacının istem dışı değiştiğini anlayamazsın.
3.Wdt zaten bunun için yapılmış.

refik1

kardeş konu çok dallanıyor
wdt ı zaten biliyor ve kullanıyorum ben onun dolma süresini beklemek istemiyorum bu sıçramayı ben wdt den çok önce algılıyorum diyelim

sadece programı başa atmakla iş halloluyormu onu soruyorum stack lar bakımından sorun yokmu yani.

yalnayak

ben asm kullaniyorum.ornekle aciklamaya calisayim.
diyelimki programda


bas
portb nin 1. biti 1 se
call sor
0 sa
call kor
goto bas

dedin...

program sor a dallandiginda stack 1 olur

sor
bsf lamba
return

dersen sordan geriye donup 0 sayi kontrol edecek.
ve stack tekrar 0 olacak

ama sen

sor
call zaman
return

dersen burda stack 1 di..tekrar zamana gidecek satack 2 olacak zamandan geriye donecek tekrar 1 olacak.sordan geriye geldiginde stack yine 0 olur..hersey normal..ama sen dersenki

call sor

sor
bsf lamba
goto basla

burada stack 1 olur ve 1 kalır.takii disardan reset verene kadar.programin uzun değilse hicbir sorun olmaz.ama programda devamli bi yerler call ile cagirip return yada retlw ile donmezsen stack yigini 8 e ulastiginda program kilitlenir.disardan reset versende program tekrar ayni seyleri yapar yine kilitlenir.yani sen her call la gittigin yerden mutlaka return yada retlw ile donmelisin.programin uzunsa stack yiginin 8 i asmamasi icin program icinde programlara goto ile ulas.soyle diyelim 8 adet mermin var.8 tanede hedefin varsa bunlari en iyi sekilde kullanmalisin.ama yok programda 4 hedefin varsa sorun değil.mermin yeter.ona gore duzenlemi yapki programi genisletmen gerekirse herseyi bastan baslama..

peki senin programinda kilitlenme yada herhangi bir hata mi var?
Kızımın iffeti batmakta rezîlin gözüne... Acırım tükürüğe billâhi, tükürsem yüzüne..! MEHMED AKİF ERSOY  Kardan Adaminla,GUNES'e calim mi satiyorsun?

aykuto

Alıntı Yap2.3.2 STACK
The PIC16F87X family has an 8-level deep x 13-bit wide
hardware stack. The stack space is not part of either program
or data space and the stack pointer is not readable
or writable. The PC is PUSHed onto the stack when a
CALL instruction is executed, or an interrupt causes a
branch. The stack is POPed in the event of a
RETURN,RETLW or a RETFIE instruction execution.
PCLATH is not affected by a PUSH or POP operation.
The stack operates as a circular buffer. This means that
after the stack has been PUSHed eight times, the ninth
push overwrites the value that was stored from the first
push. The tenth push overwrites the second push
(and
so on).

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.

Arkadaşlar, yukarıdaki yazı 16f877'nin datasheet'inden.

Klein

@refik1
evet abi programı reset vektörüne gönderdiğin zaman sorun hallolur.