stack overflow hatası

Başlatan POWER, 02 Ocak 2014, 00:48:06

POWER

iyi çalışmalar
uzunca bir proğram üzerinde çalışıyorum.İşlemcim 16f877. simülayon esnasında "stack overflow executing RETURN instruction" ve "stack overflow executing CALL instruction" hatası vermeye başladı ve bir yerden sonrada kilitleniyor ve hiç bir işlem yapmıyor.gerçek devresinde deneme imkanım olmadı ama ordada sorun olacaktır muhtemelen.bu sorunun gosub-return ile alakalı olduğunu biliyordum.uzun uzun inceledim proğramı hata bulamadım.gosub ile gittiğim yerden return ile dönmüşüm.baktım olmuyor proğramı kısalta kısalta deneme yaptım sorun devam ediyor.35-40 satıra kadar kısalttım ama hatayıda bulamadım.hata şu şekilde ortaya çıkıyor.menü tuşuna basılınca ufak bir işlem yapıyor işlemci,aynı işlemi tuşa ikinci basışda yapıyor.üçüncü basışda stack hatası başlıyor.kodlar
define OSC 4
Include "MODEDEFS.BAS"

'@ DEVICE pic16F877A
'@ DEVICE pic16F877A, WDT_ON
'@ DEVICE pic16F877A, PWRT_ON
'@ DEVICE pic16F877A, PROTECT_ON
'@ DEVICE pic16F877A, XT_OSC
@  __config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
TRISA=0
TRISB=0
TRISC=%00001000
TRISD=0
TRISE=0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
DEFINE LCD_DREG	    PORTC	
DEFINE LCD_DBIT	    4		
DEFINE LCD_RSREG	PORTB	
DEFINE LCD_RSBIT	3	
DEFINE LCD_EREG	    PORTB	
DEFINE LCD_EBIT	    2		
DEFINE LCD_BITS	    4	
DEFINE LCD_LINES	2
ADCON1=7         'a portu sayısal giriş/çıkış(adc pin'i olanlar için)
CMCON=7          'komparatörler iptal
  SAYAC   VAR     BYTE
  SET     VAR     PORTC.3  
  YUKARI  VAR     PORTD.1
  ASAGI   VAR     PORTD.3
  MENU    VAR     PORTD.2  
LCDOUT $FE,$58,$11,$00,$11,$11,$11,$11,$0E,$00 'Ü -3- dataları 
LCDOUT $FE,$68,$04,$00,$0E,$04,$04,$04,$0e,$00 'İ -5- dataları              
SAYAC=0
BASLA:   
                 gosub EKRAN
 IF SET=1 THEN   GOTO ANA_MENU                 
                 GOTO BASLA     
     
KAYDET:
      lcdout $FE,1,"AYARLAR"
      LCDOUT $FE,$C0,"KAYDED",5,"LD",5,"..."
      SAYAC=0
      PAUSE 800
      gosub TEMIZLE
GOTO BASLA

EKRAN:
     LCDOUT $FE,$C0,"-----ANA EKRAN------"
     LCDOUT $FE,$94,"-----ANA EKRAN------"
     RETURN     
TEMIZLE:
     LCDOUT $FE,1
     RETURN

MENUDEN_CIK:
    SAYAC=SAYAC+1
    PAUSE 250 
IF SAYAC>10 THEN goTO KAYDET
    RETURN


ANA_MENU:
    gosub MEN
    GOTO ANA_MENU

MEN:
    gosub TEMIZLE
    LCDOUT $FE,$80,"1.MEN",3 
    LCDOUT $FE,$94,"SAYAC:",DEC2 SAYAC
    gosub MENUDEN_CIK
RETURN
END

tüm dosyalarıda linkte veriyorum.



http://s3.dosya.tc/server15/NMRiRJ/deneme.rar.html
TB6BKG

z

#1
Ana menudesin.
MEN'i cagirdin
MENUDEN_CIK'i cagirdin
Sayac 10 dan buyukse GOTO ile KAYDET'e gittin.

KAYDET'de ise Goto BASLA dedin.

KAYDET'den Goto ile BASLA'ya gidemezsin. Stackda adres var.  Return ile geri donmen gerekirdi.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

POWER

evet hatamı anladım hocam.Hatayı ararken "Menuden_cık" etiketinin sonunda return görünce ok.demişim hatayı görememişim.
TB6BKG