stm8s iç içe kesme

Başlatan apsis, 16 Kasım 2018, 01:49:25

apsis

STM8S105 işlemci kullanarak program geliştiriyorum. Kodlar çok yoğun olduğu için buraya koyamıyorum. Programın neredeyse tümünü dış kesmelerle yönetiyorum. Programımda 9 EXTI, 1 tane delay maksatlı timer(1ms periyotlu,tim4), 1 tane de tim2 ile pwm çıkışı mevcut. Timer4 normal main içerisinde sağlıklı çalışıyor ancak EXTI rutinleri devreye girdiği an tim4 kesmeye girmiyor. Öncelik vermeye çalıştım ancak başarılı olamadım.
Kısaca hem exti hem de timer kesmesi iç içe kullanılamıyor mu?
"Makineye Beyin" MEKATRONİK

devrecii

#1
Flasha veri mi yazıyorsun exti sırasında eğer flasha ulaşıyorsan , benimde başıma geldi bir süre kesiliyor interruplar.

Bunun dışında çok daha yüksek hızlarda kullandım böyle sorunla hiç karşılaşmadım.

Acaba exti interruputu üst üste çağırıyor olabilirmisin çünkü  daha işlem bitmeden yeniden aynı interrupt çağrılırsa mcu yu çok meşgul edebilir.

RIm SIM komutu var. SIM interruptları kapatır  RIM interruptları açar , exti de çağrılan fonksiyonun ilk satırına rim ekleyip deneyebilirsin.

Bir tavsiye daha;

Bir integer  tanımlarsın exti interrupt çalıştığı an inte bir değer atasın mesela 3

main içinde tanımladığın integer değer , eğer 3 ise fonksiyonu çağırsın  iş bittiğinde değeri 0 yapsın.

MrDarK

Merhaba,

Belki basit bir yaklaşım olacak ama EXTI interrupt'ını çıkışta temizleyememe durumun olabilir mi ? Bu sebeple interrupt'dan çıkış yapamazsın.
Picproje Eğitim Gönüllüleri ~ MrDarK

apsis

@iboibo nested interruptları destekliyor. Verdiğim önceliğe göre kesme içerisinde kesme geldiğinde o kesme fonksiyonunu yarıda kesip öncelikli olan kesme işlemini yapması gerekiyor.
Flasha veri yazmıyorum. Tamamen I/O kontrolü yapmıyorum. TIM4 üzerinden kullandığım delay fonksiyonunu kesme içerisinde kullanınca böyle bir sorunla karşılaşıyorum.

@MrDarK exti için temizleme bayrağı yok. TIM için var onu temizliyorum
"Makineye Beyin" MEKATRONİK

apsis

Problemi çözdüm. Delay fonksiyonuna giderken tekrar enableInterrupts() yapıyorum tekrar ve çalışıyor.  enableInterrupts() = RIM demek.
Ya STL kütüphanesinden kaynaklanan bir problem ya da exti içerisinde kesmeden çıkana kadar otomatik kesmeyi kapatıyor.
"Makineye Beyin" MEKATRONİK