avatar_mustafa

stack taşması sorununu çöezemedim

Başlatan mustafa, 18 Haziran 2012, 14:42:54

mustafa

Merhaba arkadaşlar . Ekte verdiğim programda stack overflow hatası veriyor. Programda 2 kesme var bunlardan biri RB0 diğeri ise usart Rb0 kesmesi olan bölümde problem yok ancak usarttan veri gelip program hesap bölümüne gelince birden çıldırıyor. Birçok yol denedim ama bir çözüm bulamadım.Bende sizin değerli fikirlerinizi almak istedim bu konuda. Teşekkür ederim şimdiden. İyi günler.

ete

Programda beğenmediğim yerler var.  Onlara geçmeden evvel aşağıdaki koda dikkatini çekmek isterim.

KONTROL:
IF YUKARI=0 THEN
WHILE YUKARI=0
WEND
BOLEN=BOLEN+3
GOSUB AYAR1
ENDIF

Gosub AYAR1 komutuna odaklan.
Program AYAR1 isimli etikete gidiyor dikkat et GOSUB ile gidiyor ve oradan kesinlikle RETURN ile dönmesi gerekir.
Bakalım AYAR1 de neler yazılı;
AYAR1:
LCDOUT $FE,$C0,"BOLUCUAYARI=",DEC BOLEN
altında Return olması gerekirken yok. Bu durumda program yeniden AYAR1 etiketine atlıyor ve orada stack taşması olması kaçınılmaz.

Gelelim beğenmediğim noktalara;
1. BASLA isimli satırdan hemen sonra ENABLE yazarak kesmeleri aktif etmeye çalışmışsın sanırım. Bu tür kullanım literatürde yer almıyor. Böyle yapacağına aşağıdaki şekilde yapmayı dene.
Şayet Kesmeyi kapatacak isen INTCON.7=0 vermen yeterli. Aktif etmek için INTCON.7=1 demen yine yeterli.
Bu şekilde global kesmeleri kapatır ve açarsın.  Böylece diğer kesme ayarlarına dokunmamış olursun.

2.Kesme etiketi içinde gelen kesme cinsine göre işlem yaptırmaya çalışmışsın. Ama orada yazdığın gibi iki tane resume enable yazman gerekmiyor. Bu global bir komuttur ve karışıklık doğurabilir onun yerine kesme etiketini aşağıdaki şekilde yazabilirsin.

DISABLE
KESME:
LOW LED

RB0TEST:
IF INTF=1 THEN
KESMEKONT=10
INTF=0
  Goto CIK
ENDIF


HSERIN [WAIT("A"), KIMLIK]

IF KIMLIK =MKIMLIK THEN
USARTKONT=10
ENDIF

TEMP=RCREG
CIK: 

    Resume 
    Enable


END


Ete

mustafa

Erol bey çok teşekkür ederim dediklerinizi uygulayınca sorun çözüldü. İyi günler dilerim.

Hattuşa

@ete hocam;
18F serisi bir işlemcide timer0 ile interrupt içinde bir zamanlayıcı yaptım. yaklaşık olarak 3mS de bir adc okuması yapıyorum. sorunum şu;
interrupt içinde okunan adc değeri sağlıklı değil ve işlemci bir süre sonra (yaklaşık 2 dk sonra )pic kapanıyor. bunu aşmanın bir yolu varmıdır? sanırım stack taşması meydana geliyor. bu stack taşmasının önüne geçmenin yolu yokmudur?

ete

Önceden başıma gelmiş bir olay değil. Bu şekilde adc hiç okumadım. Benim bildiğim adc için kendi kesmesi kullanılır. Bu kesme de çevrim tamamlandı bilgi hazır git oku anlamına kullanılır.
Kısaca gerekli şekilde adc kesmesi aktif edilirse, çevrim tamamlanınca otomatikman kesme oluşur ve sanada kesme içine o bilgiyi okumak kalır. Tabiiki bu iş basic komutları ile yapılmaz uygun düşmez.

Ete

Hattuşa

Alıntı yapılan: ete - 02 Aralık 2015, 18:10:23
Önceden başıma gelmiş bir olay değil. Bu şekilde adc hiç okumadım. Benim bildiğim adc için kendi kesmesi kullanılır. Bu kesme de çevrim tamamlandı bilgi hazır git oku anlamına kullanılır.
Kısaca gerekli şekilde adc kesmesi aktif edilirse, çevrim tamamlanınca otomatikman kesme oluşur ve sanada kesme içine o bilgiyi okumak kalır. Tabiiki bu iş basic komutları ile yapılmaz uygun düşmez.

Ete

hocam sorunu çözdüm ama 2 günümü aldı ya, bu mcu ları tanımak ve yazılım öğrenmenin bir sınırı varmı bilmiyorum. 10 seneye yakındır proton kullanıyorum hala eksiklerim var, üstüne birde dil özürü ve matematik özürü varsa tırmala dur. herneyse

bir kesme içerisinde adc okunacaksa;adcon0 registeri kapalı olacak (adc okuma işlemi kapalı olacak)
adc okuma işleminden önce kesme kapatılacak, adcon0 registerleri aktif edilecek okunacak pin vs belirlenecek, adc okunacak adcon0 registeri tekrar kapatılıp kesme aktif olacak yoksa okumuyor, ileride böyle birşey yapmak isteyen olursa bu yazıyı dikkate alsın, zaman kıymetli ben 2 günümü harcadım. yapacak arkadaşlar zaman kaybetmesinler

ete

Hiç duymadığım bir şeyi bulmuşsun. Peki kesme içinde ADC okuma işini yine ADCIN komutu ilemi yapıyorsun yoksa assembly de okunur gibi her şeyi registerleri kullanarakmı yapıyorsun.?

Ete

F®T

#7
Adin komutu ile okuyorum öyle bir durumum olmadı.

KESME:
Context Save

TOP1=0
For T1=0 To 4     
HADC1   =ADIn 0
TOP1=TOP1+(HADC1+1)
Next
HADC1 =TOP1/5


TMR0=0
T0IF=0
Context Restore   
End


NOT:Aklıma geldi  Declare All_Digital = true   komutunu kullanmayınca değerler saçmalayabiliyor.Başıma gelmişti.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Powered by EzPortal