PIC16F628A kesme sorunu

blackmore

Üye
Katılım
4 May 2009
Mesajlar
5
Puanları
1
Selam arkadaslar.PIC16F628A kullanarak yaptığım ödevde TMR0 kesmesi ve PB0 kesmesi kullanıyorum.Program TMR0 kesme programına düştüğünde kesme alt programının kodlarının başında BCF INTCON,7 komutunu kullanak kesmeleri kapatıyorum.Fakat kod TMR0 kesmesi alt programındayken eğer PB0'a bağlı butona basarsam program TMR0 kesmesinde uygulaması gerekenleri uyguladıktan sonra PB0 kesmesinde uygulaması gerekenleri uyguluyor:confused:Bu sorunla karşılaşıp çözüm üretebilen var mı acaba?Şimdiden teşekkürler.
 
kesmeden sonra gıe yi kapatıyormusun acaba?
 
16 serisinde kesme vektoru tek ve kontrolsuz oldugu icin butun kesme rutinlerini bir blok icinde yazmaniz gerekir. 1 den fazla kesme kullanildiginda bu sorun teskil eder. Cozum donanimsal degil yazilimsal olarak mumkundur. Herhangi bir kaynaktan kesme olustugunda dogrudan vektore gidecegi icin, INTCON icinde ki ilgili kesme Flaglarini kontrol ederek sartli calistirma yapmaniz gerekli. Bunu yapmaz iseniz kodunuz yapisal olarak blok icinde ki butun islemleri yapar.
 
16 serisinde kesme vektoru tek ve kontrolsuz oldugu icin butun kesme rutinlerini bir blok icinde yazmaniz gerekir. 1 den fazla kesme kullanildiginda bu sorun teskil eder. Cozum donanimsal degil yazilimsal olarak mumkundur. Herhangi bir kaynaktan kesme olustugunda dogrudan vektore gidecegi icin, INTCON icinde ki ilgili kesme Flaglarini kontrol ederek sartli calistirma yapmaniz gerekli. Bunu yapmaz iseniz kodunuz yapisal olarak blok icinde ki butun islemleri yapar.

Şartlı çalıstırma yapmadan önce kesmeleri kapatıyorum ve daha sonrada INTCON'daki bayrakları kontrol ediyorum ve ona göre iki kesme alt programından birisi çalışıyor zaten.Fakat sorun ben kesme alt programlarından birisindeyken diğer kesme programının ilgili butonuna bastığında bunu algılamaması gerekirken algılaması ve ilk içine düştüğü kesme programını bitirdikten sonra algılamaması gereken kesmeyi algılaması ve onun işlemlerini de yapması.
 
Anlatımınızda hata var.

TMR0 kesmesi mi yoksa RB0 kesmesi mi geldiğine baktınız, ona göre başka bir satıra atladınız. o rada diğer kesme geldi diyelim (RB0 kesmesi olsun). siz ilk duruma ait (TMR0) kesmeden çıktığınız anda rb0 kesmesine ait flag aktif olduğu için kesmeden çıkar çıkmaz tekrar rb0 için kesme rutinine girersiniz.

TM0 kesmesini işlerken b0 a bağlı butona basıldığında bunu pas geçsin istiyorsanız diğer kesme rutininin sonunda rb0 kesme flagini sıfırladıktan sonra kesmeden ayrılın.
 
Anlatımınızda hata var.

TMR0 kesmesi mi yoksa RB0 kesmesi mi geldiğine baktınız, ona göre başka bir satıra atladınız. o rada diğer kesme geldi diyelim (RB0 kesmesi olsun). siz ilk duruma ait (TMR0) kesmeden çıktığınız anda rb0 kesmesine ait flag aktif olduğu için kesmeden çıkar çıkmaz tekrar rb0 için kesme rutinine girersiniz.

TM0 kesmesini işlerken b0 a bağlı butona basıldığında bunu pas geçsin istiyorsanız diğer kesme rutininin sonunda rb0 kesme flagini sıfırladıktan sonra kesmeden ayrılın.

Sorunu bahsettiğiniz şekilde çözmüştüm zaten.Benim anlayamadığım nokta şurası:
KESME
BCF INTCON,7
BTFSC INTCON,2
GOTO TMR0KESME
GOTO PORTB0KESME
Kesme programında yaptığım işlem bu.Kod TMR0 kesme alt programına düştü diyelim.BCF INTCON,7 komutuyla kesmeleri kapatmama rağmen kod TMR0 kesme alt programının içindeki işlemleri yaparken PB0'a bağlı butona bastığımda PB0 kesme flaginin 1 olmasına anlam veremiyoum.Kesmeleri kapattığım için o flagin 1 olmaması gerektiğini düşünüyorum.
 
Kesme işlemi flaglerin durumuna bakar ve ilgili flagin kesmesi aktif ise GIE a bakar. O da aktif ise 4 nolu adrese gider.

GIE veya ilgili kesme etkinleştirme bitinin aktif olup olmaması hiç önemli değildir. kesmelere ait flaglar her zaman durum değiştirir.

Örneğin hiç kesme tanımlamasanız bile seri porttan bilgi geldiğinde rbif aktiflenir, b0 a basıldığında rb0if aktiflenir. Yani GIE 0 iken flagler bloke edilmez. Böyle olması da aslında avantajdır. Kesme içerisinde diğer donanımların statüsünü öğrenebilirsiniz.
 
Sn. Blackmore

Öncelikle sorunuzu tam olarak anlamaya çalışalım. Acaba doğru anlamışmıyım lütfen bilgi verin? Programınız da TMR0 kesmesi gelince TMR0 ile ilgili kesme alt programına dallandığınıyor ve Interruptları kapatıyorsunuz. (Bu arada diger bir interrupt kaynagindan interrupt geliyor) TMR0 interrupt alt programından ciktiginizda ise TMR0 interrupt alt programındayken gelen interruptla ilgili alt programa dallaniyor. Eğer sorunuz buysa bu gayet normal. Çünkü siz TMR0 dan çıktığınızda yine global interruptlari aktif ediyorsunuz ve PB0 ile ilgili interrupt flag çoktan set olmuş. Siz TMR0 interrupt alt programından çıkmadan once tum interrupt flaglari clear edin. Dolayısıyla TMR0 interrupt alt programından donunce bir daha interrupt'a girmez. Sorunuz cozulmus olur. Ayrica TMR0 girince interruptlari kapanıza gerek yok Pic otomatik olarak BCF INTCON,7 komutunu yapiyor yani interruptayken baska bir interrupt gelirse icinden bulundugu interruptti bitirmeden digerine dallanmaz. İnterrupt alt programından RETFIE komutunu gorunce de otomatik olarak BSF INTCON,7 isletir. Siz RETFIE den once mutlaka tum flagleri sifirlamalisiniz. Dolayisiyla TMR0 da PB0 interruptti gelse bile bunu işleme almaz (ignore)
 

Forum istatistikleri

Konular
129,880
Mesajlar
931,002
Kullanıcılar
452,759
Son üye
imot

Yeni konular

Çevrimiçi üyeler

Şu anda çevrimiçi üye yok.
Geri
Üst