protonda context restore komutu

Başlatan cuneytsezmis1, 24 Ekim 2008, 20:52:04

cuneytsezmis1

protonda tmr0 kesme uygulaması yaptım ama düzgün çalıştıramadım.
Device = 16F84   ;KULLANILAN MİKRO İŞLEMCİ
XTAL=4
Config XT_OSC , PWRTE_ON , CP_ON , WDT_OFF
On_Interrupt GoTo kesme

INTCON.7=1
INTCON.5=1
INTCON.2=0

OPTION_REG.5=0
OPTION_REG.4=0
OPTION_REG.3=0
OPTION_REG.2=0
OPTION_REG.1=0
OPTION_REG.0=0
TMR0=0

PORTB_PULLUPS = On ;PORTB PULLUP DİRENÇLERİ ETKİN
TRISA=%00000000
TRISB=%11000000
PORTA=0
PORTB=0
GoTo basla


basla:

If PORTB.0=1 Then
Low PORTB.0
Else 
High PORTB.0
EndIf
DelayMS 50
GoTo basla

Disable
kesme:

INTCON.2=0
If PORTB.1=1 Then
Low PORTB.1
Else 
High PORTB.1
EndIf
Resume
Enable


yukarıdaki kodda resume yerine @retfie kullanınca olay düzeliyor.
yada resume yerine context restore kullanınca oluyor.

kodda yanlışlık mı var bulamadım.
bir de context restore ne işe yarıyor bilmiyorum.
bilen arkadaşlardan yardım bekliyorum.kolay gelsin.

mech

CONTEXT RESTORE                 ' Restore the registers and exit the interrupt

protonun helpinde arattırınca baya bi açıklama çıkıyo, incelemen gerek biraz karışık gibi.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

F.T

#2
bende 16f84a ile kesmeye giremiyorum.girsemde bi türlü çıkamıyorum.  ;D aşşağıdaki program gibi.temel bir program yazdım
  On_Interrupt GoTo kesme komutunu kullanınca kesmeye giriyor fakat çıkmıyor.ayrıca kesme sonunda end kullanmayınca stack taşması oluyor.On Interrupt GoTo kesme bu şekil kullanınca hiç girmiyor.fikri olan varmı acaba..
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

kesme alt programında context save veya context restore gibi komutları kullanıyorsanız kesmeye gitmek için on_hardware_interrupt goto kesme gibi bir yonlendirme komutu kullanılması gerekiyordu sanırım.

F.T

#4
port b.5 te 400 hz
port b.0 da 200 hz

program cuneytsezmis1 dan alıntı dır.değişiklik yapılmıştır.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 09.10.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Device = 16F84A   ;KULLANILAN MİKRO İŞLEMCİ
XTAL=4
Config XT_OSC , PWRTE_ON , CP_ON , WDT_OFF

On Interrupt GoTo kesme

INTCON.7=1
INTCON.5=1
INTCON.2=0

OPTION_REG.5=0
OPTION_REG.4=0
OPTION_REG.3=0
OPTION_REG.2=0
OPTION_REG.1=0
OPTION_REG.0=1
TMR0=0

'PORTB_PULLUPS = On ;PORTB PULLUP DİRENÇLERİ ETKİN
TRISA=%00000000
TRISB=%11000000
PORTA=0
PORTB=0


basla:

Toggle PORTB.0

GoTo basla  


Disable
kesme:

INTCON.2=0

DelayMS 1
DelayUS 200
nop
nop
nop
nop
nop
nop
Toggle PORTB.5 
Resume
Enable
End


bu şekilde kesmede bir sorun olmadı.çalışıyor.fakat en sondaki end olmadığı zaman programda stack sorunu oluşuyor.bunun sebebi ne acaba??
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Maxim

kesme içinde delay komutu kullanmamak lazım

F.T

evet hocam haklısınız ben denemek için yapmıştım.ama kesme olayı net değil. ıntcon.2=0 en başta kesme içinde .normalde kesme flagı çıkışta sıfırlanması lazım  sona yazınca kesme düzgün çalışmıyor.genel kesme kapama ve tmr0 kesmesi kapama sıda yok kafam karıştı??
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

pcb

#7
kesme:
Context Save
..............
..............
..............
Clear (bayrak)
Context Restore


kesme içinde her komutu yazıyorum , kesme içinde bir başka kesme gelirse , en son kesmeden çıkarken önceki kesmenin bayrağını sıfırlarım gie 1 yaparım , bu programın gerekliliğine göre değişiklik gösterir , ama bildiğim yukarıda ki komut bloklarının kullanılması gerektiği , işlemciye göre komutlar değişebiliyor tabi.

kesmeden çıkmadan önce ayrıca komutla bayrak temizleme alışkanlığım var , kesme içinde aynı kesmeden tekrar gelirse başta temizlediğiniz bayrak 1 olur kesmeden çıkınca interrupt oluşmaz , bekler dururuz int olacak mı diye.

muhittin_kaplan

protonda iki çeşit kesme vardırç

1. Yazılımsal Kesme
2.Donanımsal kesme

Yazılımsa kesmede
on interrupt goto kesme  bildirimi ile başlanır ve kesme disable ve enable edilir

donanımsa kesmede
on_interrupt goto kesme ile yada on_hardware_interrupt goto kesme ile gidilir. ve context save ve context restore ile kesme rutinine girilir ve çıkılır.

Yazılımsal kesme Her komutun önüne "Kesme Varmı" diye komut eklemeye benzer ve hafızayı daha fazla doldurur. disable kesme içerisinde tekrar kesme gelmesini engeller. ebanle ise kesmeleri tekrar açar.

Donanımsal kesme de kesmeye girildiği anda mevcut registerlerin bir sanal registerlere yüklenmesi gerekir. bunu context save ile yapar (örneğin program counter yada stack register gibi) Context restore ilede bu sanal registerleri gerekli yerlere yükleyerek program kaldığı yerden devam eder.
Donanımsal kesme az yer kaplar.

kesmelerde mümkün olduğunca uzun işler yapılmaz delay gibi gecikme komutları kullanılmaz.

F.T

pcb hocam ve muhittin hocam sorunu hardware kesme kullanarak çözdüm. teşekkür ediyorum.proteuse ta yazılımsal kesmeye simülasyonda bir türlü girdiğini göremedim. bu beni aldattı. ;D ama normalde kesme çalışıyormuş.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.