avatar_Hattuşa

kesme ile ilgili bir sorun

Başlatan Hattuşa, 28 Mayıs 2012, 10:45:12

Hattuşa

s.a.
ete hocam bir konuda yardımınıza ihtiyacım vardı, bir devre üzerinde porb.0 kesmesi yapmak istedim. amacım şu kesme oluştuğunda ben bu kesmeyi algılamak istiyorum. yaptığım kesme donanımsal bir kesme ve ne ettimse bir türlü beceremedim.
if GIE =1 then 
led =1
else
led =0
endif

dedim ama çalışmadı,
ben bu kesmenin oluşup oluşmadığını nasıl anlarım?

Mucit23

Program zaten kesme oluşunca ON_Interrupt Goto kesme gibi bir komut yazdıysan eğer program kesme oluştuğunda kesme isimli etikete gidecektir.

Eğer Sadece bir adet kesme kaynağın var ise kesmenin nereden geldiğine bakmana gerek yoktur.

Örnek vereyim
Eğer Sadece RB0 Kesmesi kullanıyorsan

Kesme alt proramını aşağıdaki gibi yazabilirsin

DISABLE
Kesme:
Toggle Led
INTCON.1=0
RESUME
ENABLE

Bu şekilde Her kesme oluştuğunda ledin durumu değişecektir

Eğer birden fazla kesme kaynağun var ise kesmenin nereden geldiğine bakman gerekecek
Kesme  alt programında başlangıçta Kesme bayraklarına bakarak (INTCON.2, INTCON.1, INTCON.0) kesmenin nereden geldiğini bulursun.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Hattuşa

mucit hocam yapmak istediğim şu;

kesme program içerisinde her zaman oluşmayacak belli durumlarda oluşacak, kesme oluşmadığı sürece led=1 olmalı ama ne zaman ki kesme oluşmaya başladı o zaman led=0 olmalı,
dediğin gibi kesmenin içine led=0 diye komut eklediğim zaman ve ana döngümde led=1 dediğimde
eğer kesme oluşmuyorsa sıkıntı yok, ama ne zaman ki kesme oluşmaya başladı, ana döngüde led=1 , kesmede led=0 olduğundan dolayı led sürekli yanıp sönüyor, oysa ben ledin yanıp sönmesini istemiyorum. yani kısaca
kesme yoksa led=1
kesme oluşunca led=0
amacım kesmenin varlığının tespiti

ete

#3
Kesme alt programını aktif etmeden kesme. Oldugunu anlaman için tek bir ipucu var. Oda kesme bayrağı. Portb.0 kesmesi olusunca ona ait bayrak high olur sende surekli ona bakıp High oldumu diye kontrol etmen gerekiyor.
Ete

Hattuşa

ETE hocam şöyle bir çözüm buldum ne kadar sağlıklı olur bilinmez
ana döngüde bir sayac çalıştırdım, bu sayacı 30 da sayacı 1 yaptım. kesmeye girdiğinde de sayacı sıfırladım. kesme oluştuğu sürece sayac değerim sürekli 0 ile 1 arasında kaldı, ne zaman ki kesmeyi aktif etmedim o zaman sayac 1 ile 30 arasında saydı ve ledi yaktım, kesmeyi aktif ettiğimde de sayac 0 a zorladığı için led söndü, ne kadar sağlıklı çalışır bilinmez ama yapmak istediğim böyle bişey
konu ile ilgili şemayı ve yazılımı ekliyorum

ete

"kesme program içerisinde her zaman oluşmayacak belli durumlarda oluşacak, kesme oluşmadığı sürece led=1 olmalı ama ne zaman ki kesme oluşmaya başladı o zaman led=0 olmalı,"
Programda kesmeleri aktif etmediğini varsayalım. Aktif etmesende şayet portB.0 dan bir giriş olursa INTF=1 olacaktır. Ama program kesme etiketine gitmeyecektir. Çünki hem global kesmeleri aktif etmedik hemde PortB.0 kesmesini aktif etmedik. Buna rağmen INTF kesmeye sebep bir olay olduğunda HIGH olur. Şimdi yazıklarına bakarsak.
Programın başına
IF INTF=0 then
  LED=1
else
  led=0
  INTF=0
ENDIF
şeklinde bir komut yerleştirirsen bu iş otomatikman olur. KOmut satırların fazla değilse program bunu sıklıkla takip edebilir.
Hatta şöyle bile yapabilirsin.
LED=not INTF  bu bayrağı sıfırlama hariç istediklerini yapar.
IF INTF=1 then INTF=0 şeklinde bir ilave satırla onuda halletmiş olursun.

Ete



Powered by EzPortal