Interrupt önceliğini değiştirince oluşan hata

Başlatan z, 31 Mart 2013, 18:24:16

z

STM32F103C8 de

Timer 2 int ve event üretiyor. Bu event da ADC'yi tetikliyor. ADC dönüşümü bitirince de int üretiyor.

Bu durumda ilk üretilen Timer2 int, sonra da ADC int olacak demektir.

NVIC'da her iki interrupta da izin veriyorum. NVIC'da öncelikleri aynı yada timera öncelik tanıtırsam sorun yok. Her iki interrupt rutinide işliyor.

Fakat ADC ye öncelik tanırsam Timer interrupt rutinine hiç girilmiyor.

Çok saçma bir durum.

Kodlamada hata yaptım diyeceğim ama kod koşarken debug penceresinde NVIC den önceliği elimle düzeltirsem (Timera öncelik tanıtırsam) gene her iki interrupt rutini de koşmaya başlıyor.

Sorun ne olabilir?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

timer aslında girmek üzereyken, adc baskın geldiğinden adc nin rutinlerine atlıyor olabilir mi?
iki interrupt arası çok kısa bir süre olduğunu tahmin ediyorum

adc çıkışında timer a dönüyor/giriyor olabilir mi?
ve ya adc ye girdiğinizde timer interruptıyla ilgili ayar yapıyorsanız, o ayarları kapatıp dönüşte timer a girip girmediğini bir kontrol edin bence hocam

z

Timer int rutini ADC'ye, ADC int rutini de Timer'a mudahale etmiyor. Dolayısı ile bir int rutini diğerini yasakkamıyor.

İnt rutinlerine breakpoint koyduğum için bu rutinlerin işleyip işlemediğinden kesinikle haberdar oluyurum.

Ayrıca int rutinlerinden birisi GPIO da bir pini set ederken diğer rutin aynı pini resetliyor ve bu pini scopla gözlemliyorum.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Karşılaştığım sorun bence çok vahim.

NVIC registerlerinden Int pending registeri gözlediğimde Timer INT'ın kuzu kuzu beklediğini fakat ADC interruptın  cevaplandığına tanık oluyorum.

NVIC'ın int pending olarak yakaladığı interrupt nasıl olur da işleme alınmaz? (NVIC'da bu int enable durumda üstelik)

İp ucu olacaksa;

ADC önceliği Timer dan yüksek.

Kodları çalıştırınca ilk önce timer int oluşuyor ve int rutinine giriliyor.
İnt rutininden çıkınca bir daha timer int rutinine girilmiyor.

Bu şartlar altında debug menüden NVIC ADC int yasaklarsam artık Timer int rutinine girilmeye başlanıyor.

Yada kodda Timer önceliği ADC önceliğinden yüksek olacak şekilde değişiklik yaparsam ADC int rutini de Timer  int rutini de çalışıyor.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com


z

Hocam şimdi çözdüm sorunu.

Sorun tabiki ben. En baştaki soruma bakarsak timer ADC yi tetikliyor demiştim. Halbuki;

Timer,  ADC1 ve ADC2 yi tetikletiyor ve int rutininde ADC1 int flağını siliyorum. ADC2 nin de int ürettiği tamamen aklımdan çıkmış.

Böyle olunca Timer önceliğini düşürürsem, ADC1 ve ADC2 int üretiyor ADC int rutinine giriliyor, int rutininde ADC1 int flağı temizleniyor int rutininden çıkıldığında  ADC2 int flağı hala set olduğundan derhal gene ADC int rutinine giriliyor. Böylece ne timer ne de ana program kodları işletilmiyor.

Timer int önceliği artılınca ADC int rutini Timer int tarafından kesiliyor ve Timer int rutini de çalışmış oluyor.

Güzel bir deneyim oldu.

Aptallık paraylamı?

ADC2 nin de int flagları olduğu aklımdan çıkmış.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com