Timer0 ve PORTB external interrupt sorunu

Başlatan miyago, 07 Ağustos 2017, 11:09:12

miyago

Merhaba

PIC18 serisinde hiç yaşamadığım bir sorunla karşılaştım.

Timer0 yada Tİmer1 kesmesi devreye girdiğinde PORTB external kesmeleri devre dışı kalıyor.

Kesmeler birbirlerini tetiklemiyor  recursif bir durum yok

interrupt priority benim sorunum olabilir acaba?

Hiç bu sorun yaşayanlar oldu mu? Gözümden bir şeyler kaçıyor. Nelere dikkat etmeliyim?

Teşekkür


miyago

Yukarıdaki soruma bir şeye daha eklemek isterim.

Aynı anda PWM'de kullanıyorum.

PWM timer2'yi kullanırken kesme kullanıyor mu? Bu durum yukarıdaki soruna neden olmuş olabilir mi?

Teşekkürler

serdararikan

Pwm kullanmanız timer kesmesini engellemez.portb change kesmesi ile timer kesmeniz ayni kesme önceliğine sahipmi? eğer öyleyse aynı anda ayni seviyeden kesme oluşamaz

ferit06

Datasheets te PWM kullanımı sırasında TIMER2  Blok şemada yer alıyor. Buna göre TIMER2 yi sizin PWM Pasif olduğu durumlar dışında kullanmamanız gerekir.

miyago

Sayın ferit06

Teşekkür ederim. Evet Tİmer2'yi başka bir maksatla kullanmadım.

PWM timer2'yi kesme alt yapısı ile mi kullanıyor diye sormuştum. Yukarıda cevabını aldım. O şıkkı eledim

Teşekkür

arslan74

Timer kesmesi içinde PortB yi okuma veya başka bir şey yapıyor isen oluşan portb kesmesini sıfırlamış olabilirsin. Bu durumda kesme gelmez. tam olarak cevap verebilmek için kodlarını bakmak gerek.

XX_CİHAN_XX

Kodu görmek lazım. Kesme vektöründe GIE biti otomatik olarak kapanır. Kesmenin içinde kesme gelmemesi durumundan bahsediyor isen bu durum normal.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

ete

Kesme önceliği kime ait ise o kesme önce oluşur ama diğeri sırada bekler. Şayet birincil öncelikle kesme oluştuğunda kesme vektörüne gidip orada bütün bayrakları sıfırlarsanız ikinci kesme ortadan kalkar otomatikman. Bu nedenle yapılması gereken hangi kesmenin bayrak biti set edilmiş ise onun işlemini yapıp yalnızca ona ait bayrağı sıfırlamanız gerekir. Dolayısıyla program kesmeden çıkar çıkmaz yeniden kesmeye girer bu sefer sebep, ikincil kesme bayrağının set olmasıdır.
Her şeyden önce kullandığınız her bir kesme kendi başına kesme yaratabiliyormu bunu dğerlerini kapatarak test edin bence. Sorun buda olabilir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

miyago

Gelen cevaplar için çok teşekkür ederim.

diyelimki bir programda 3 farklı kesme olsun;

timer0 kesmesi,timer1 kesmesi ve PORTB harici kesmesi

her bir kesme girdiğinde ona ait flag'ı ve kesme enable'nı sıfırlıyorum  örneğin PORTB external kesmesi için

" INTCONbits.INT0IF=0; INTCONbits.INT0IE=0;"     yapıyorum ve işlem sonunda 1 yaparak açıyorum. Bu durum galiba diğer kesmeleri iptal etmeyecektir.

Fakat sizinde bahsettiğiniz gibi aynı anda birden fazla kesme oluşamayacaksa;

hangi kesme olursa olsun kesme geldiğinde aşağıdaki gibi komple kapatıp yeniden açmak mıdır doğrusu.

INTCONbits.PEIE = 0;  INTCONbits.GIE = 0; // Global Interruptlar Aktif

Bu sohbetten bir iki soru aklıma takıldı;

1-) Timer alt yapısı kesmesiz kullanılabilir mi?

2-) INTCONbits.INT0IE=1; ile kesmeyi devreye aldığınızda __delay_ms(1) komutu ile ne kadarlık gecikme vermek yeterli olur.

3-) INTCONbits.INT0IE=1; ile kesmeyi devreye aldığımızda derleyici bu satırı görür görmez mi kesmeyi devreye alıyor yoksa satırın dahil olduğu { } parantezle ayrı bölümün sonlanmasını mı bekliyor.

4-) Diyelim ki Timer0 kesmesi kurdum. 1 saniye aralıklarla. 0,5. saniyede PORTB harici kesmesi oluştu INTCONbits.PEIE = 0;  INTCONbits.GIE = 0; ile kesmeler iptal ettim. Tİmer0 çalışmaya devam ediyor mu. Ediyorsa kesmesi iptal olduğu için overflow hatasına geçer mi?

Soruların çoğu anlamsız gelebilir. Kafamdaki soruları buraya topladım.

Teşekkür ederim












ete

Bildiğim kadarı ile hengi derleyici olursa olsun programı kesme vektörüne yollayınca global kesmeler otomatik kapatılıyor zaten. Sizin herhangi bir kesmeyi yada global kesmeleri kapatmanız gerekmiyor. Sistemin yapısı gereği kesme içinde kesme oluşmaması için derleyici bu konuda gereken önlemi almış ve kesme rutinine girince global kesmeleri kapatmış oluyor zaten.
Global kesmeler iptal edilse bile kesme içinde başka bir kesme kaynağından dolayı kesme oluşacak ise ona ait bayrak otomatik set edilir zaten. Dolayısıyla kesme kaybınız olmaz. Unutmayın siz kesmeleri aktif etsenizde etmeseniz de kesme bayrakları oluşan kesme kaynağına bağlı olarak aktif edilir. O kesme genel anlamda aktif edilmiş ise (enable) sistem kesme vektörüne gider değilse gitmez ama bayrak set edilmiş kalır.
Bu açıklama ile Timer ların kesme olmaksızın kesme bazlı kullanımı mümkün diyebiliriz. Örnek vereyim. TMR1 sayacına ait kesme bayrağı PIR1.0 da kayıtlıdır.
Bu bayrağı sıfırlayıp TMR1 sayacını aktif edersem sayac saymaya başlar ve bir müddet sonra PIR1.0 bitini set eder (overflow durumu) TMR1 kesmesi açık ise program kesme vekörüne gider açık değil ise o bayrak set edilmiş kalır. Ama siz programda bu bayrağı kontrol ederek overflow durumunu kotrol edebilirsiniz.
Belirli zaman gecikmelerini bu yöntemle sağlıyorum sıklıkla. Bu bana sayac çalışırkan başka işleride yapma imkanı veriyor.

Kesme işinde esas olan o kesmeye ait bayrak kontrolüdür. Bu sürekli olarak sistem tarafından kontrol edilir. Siz o kesmeyi enable etmiş iseniz sistem sizi kesme vektörüne yollar. Bu olay kesme oluştuğu zaman karşılaştırılır. Belirli bir zaman gecikmesi koymanız işi garantiye alır ama asıl önemli olan kesmenin oluştuğu anda ilgili enable bitinin set edilip edilmediğidir. Bayrak zaten set ediliyor çünki.

Tmr0 kullanıcı tarafından durulup başlatılamadığına göre o saymasına sürekli devam eder. Sadece başlangıç değerini değiştirerek overflow olmasını engelleyebilirsiniz.
TMr0 çalışırken siz INT0 kesmesi için kesme vektörüne gitmiş iseniz TMR0 çalışmasını durdurmaz. Overflow olduğunda kesme bayrağını set eder ve programın kesme vektöründen çıkmasını bekler. Çıkar çıkmaz kesme bayrağından dolayı karşılaştırma yapılır ve TMR0 kesmesi açık ise (enable ise) program bu seferde TMR0 kesmesine gider. Değilse sadece kesma bayrağı set edilmiş kalır.
Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

miyago

Uzun yanıtınız için teşekkür ederim. Çok faydası oldu gerçekten.