Kesme kodları neden kısa olmalı?

Endorfin35+

Kayıtsız Üye
Katılım
1 Mayıs 2020
Mesajlar
4,416
Aklımda ki soru başlıktaki gibi. Kesme fonksiyonları içerisine hızlı çalışacak kısa kodlar yazılır şeklinde bir bilgi edinmişim ama bu ne kadar doğru? Neye göre kısa? Buradaki kriter nedir.

Mesela bir pin kesmesi oluştu. Kesme oluştuğu anda 3-5 koşula bakıp bir değişken set ediyorum diyelim. Bu kod çalışırken bir timer kesmesi olsa. İşlem sırası nasıl oluyor? Pin kesmesi yarıda kalıp, timer kesmesi kodları çalışıyor sonra pin kesmesi kodları kaldığı yerden devam mı ediyor?
 
Ardisil olusan iki interruptin bekletilmeden cevaplanmasi hayati derecede onemli ise bu durumda iki interrupt rutini de kisa olmali.

Eger iki int arasindaki min sure T ise senin int cevaplama suren T den kucuk olmali.

Boyle bir durum yoksa int icinde istersen at kostur.

Int suresinin kisa olmasi yetmiyor bir de int rutini icinde kullanilan fonksiyonlarin int icinde kullanimina yasak olmamasi (global degiskenler uzerinde islem yapmamasi vs) gerekiyor.

ya da fonksiyonun isi bitene kadar intlari yasaklamamasi gerekiyor.

Simdilerde fonksiyonlar buna uygun yaziliyordur ama gene de dikkat etmek lazim.
 
Son düzenleme:
Bu kod çalışırken bir timer kesmesi olsa. İşlem sırası nasıl oluyor? Pin kesmesi yarıda kalıp, timer kesmesi kodları çalışıyor sonra pin kesmesi kodları kaldığı yerden devam mı ediyor?
Nested interrupt desteği varsa evet. Ayrıca priority değerlerine de bakılıyor, böylece önemsiz interruptlar önemlileri bölemiyor. ARM NVIC diye aratırsanız örnekleri çıkar.

PClerde de durum aynı. Driverlar iki parçaya bölünüyor. İlki hızlı çalışması gereken gerçek interrupt handler. Örneğin cihazdan veri geldi, hemen veriyi kopyalayıp çıkıyor. İkinci kısım ise asenkron olarak çalışıyor ve zaman kısıtı yok. Kopyalanan veriyi istediği gibi işliyor.
 
Mesela bir pin kesmesi oluştu. Kesme oluştuğu anda 3-5 koşula bakıp bir değişken set ediyorum diyelim. Bu kod çalışırken bir timer kesmesi olsa. İşlem sırası nasıl oluyor? Pin kesmesi yarıda kalıp, timer kesmesi kodları çalışıyor sonra pin kesmesi kodları kaldığı yerden devam mı ediyor?

Bu durum islemcinin int yoneticisine gore degisir.

Siradan islemcilerde int rutinine girildiginde olusacak diger interruptlar askiya alinir. (NMI/Reset istisna)

Int yonetimi yapabilen, oncelikleri duzenlenebilen, oncelige gore interrupti kesebilen donanima sahip islemcilerde diyelimki int rutininde iken Timer int geldi.
Eger Timer Int onceligi o an isletilen int'in onceliginden daha yuksek ise o an kosturulmakta olan int rutininden cikilir Timer Int rutini isletilir. Rutin bittiginde gerisin geri biraz evvel isletilen int rutini kaldigi yerden devam eder. Bu int rutin de isletilip bittiginde ana rutine geri donulur.

Bu ic ice interrupt kesme durumlari da islemcinin int yoneticisine bagli bir durum.
 
Son düzenleme:
Programın ana kodunun çok fazla değişken olmayan bir zamanlama ile çalışması önemli ise de kesmeleri kısa tutmak lazım. Yoksa ana programda diyelim 1 ms delay koydun, ama o arada kesme girdi ve kesmede 10 ms zaman geçirdin. Bu durumda ana programdaki delay oldu 11 ms.

Ama ana programda zamanlamanın yaratacağı bir fark yoksa, mesela bir algoritma çalıştırılıyor, sonuç çıkınca bir yere gönderiliyor, sonra tekrar başlıyor, o zaman kesme süresinin uzun olması, ana programı yavaşlatmak dışında bir olumsuzluğa sebep olmaz.
 
Kullandığım mcu atmega 328pb. İki tane timer ve 4-5 tane pin change interrupt kullanıyorum.

Ana program döngüsü olayları başlatıyor. Sonrasını kesmeler kontrol ediyor. Yani ana programın kesintiye uğraması sorun değil.

Mesela motor sürüyorum ve belirlir bir süre sonra timer ile durduruyorum. Motor çalışırken limit sinyali alırsam yine motoru durduran fonksiyonu çağırıyorum. Sonra motoru kesme ile durdurduğum için bir bayrak set ediyorum. Bu kodlar görece kısa ve hızlı çalışan kodlar.

Mesela sonrasında bayrak değişkeninin durumuna göre main loop içinde lcd ekrana ıvır zıvır yazılar yazıyorum. Yani heralde prensip olarak yöntemim doğru. Ancak denemeler sırasında nadiren kesme içinden çağırdığım motoru durduran fonksiyon çalışmıyor. Lcd ekranda ilgili mesajı alıyorum. Demekki kesme çalışmış. Ama motor çalışmaya devam ediyor. Bu olay tesadüfen gözlemledim ve çok nadiren bu durum tekrarlanıyor.

Sorunu çözemedim ama bu kesmelerden kaynaklandığını düşünüyorum. Pin kesmesi olduğunda timer kesmesini durdurmuyordum. Kendisi duruyormu emin değilim bu konulara bakacağım. Yorumlar için teşekkürler.
 
Kullandığım mcu atmega 328pb. İki tane timer ve 4-5 tane pin change interrupt kullanıyorum.

Ana program döngüsü olayları başlatıyor. Sonrasını kesmeler kontrol ediyor. Yani ana programın kesintiye uğraması sorun değil.

Mesela motor sürüyorum ve belirlir bir süre sonra timer ile durduruyorum. Motor çalışırken limit sinyali alırsam yine motoru durduran fonksiyonu çağırıyorum. Sonra motoru kesme ile durdurduğum için bir bayrak set ediyorum. Bu kodlar görece kısa ve hızlı çalışan kodlar.

Mesela sonrasında bayrak değişkeninin durumuna göre main loop içinde lcd ekrana ıvır zıvır yazılar yazıyorum. Yani heralde prensip olarak yöntemim doğru. Ancak denemeler sırasında nadiren kesme içinden çağırdığım motoru durduran fonksiyon çalışmıyor. Lcd ekranda ilgili mesajı alıyorum. Demekki kesme çalışmış. Ama motor çalışmaya devam ediyor. Bu olay tesadüfen gözlemledim ve çok nadiren bu durum tekrarlanıyor.

Sorunu çözemedim ama bu kesmelerden kaynaklandığını düşünüyorum. Pin kesmesi olduğunda timer kesmesini durdurmuyordum. Kendisi duruyormu emin değilim bu konulara bakacağım. Yorumlar için teşekkürler.
Pin kesmesi üst üste iki kez çalışırsa bir sıkıntı olur mu?
Yada kesme içinde pin durumu okunuyor ve buna göre işlem yapılıyor mu?
Yani kesme içinde moturun durdurulması bir koşula bağlı mı, kesme çalıştığında motorun durmama ihtimali var mı?
Belki de motoru durduran kesme doğru çalışıp motoru durduruyordur ama başka bir kod motoru tekrar çalıştırıyordur, bunu sağlayan koşullar var mı?
Benim aklıma gelenler bunlar...
 
Pin kesmesi üst üste iki kez çalışırsa bir sıkıntı olur mu?
Yada kesme içinde pin durumu okunuyor ve buna göre işlem yapılıyor mu?
Change interrupt çalışıyor. Ancak sinyal geldiğinde yani sw bastığında sinyalin high olması lazım. Bu nedenle dediğin gibi pini okuyorum. Birde motorun çalışır durumda olduğunu gösterir bayrak var ona bakıyorum. İki koşul var ise motoru durduruyorum.

Motoru durduran fonksiyon gate bacağını low a çekiyor. Olmadı fonksiyonu çağırmadan doğrudan kodu kesmenin içine alacam. Deneme yapmam gerekecek biraz...
 
Bir tür bouncing problemi olabilir mi ?
Öyleymiş.

change ile tetik alıp sonrasında high olma koşulum var. Normalde de sinyal high oluyor zaten. Ama bir şekilde high olma koşulunu sorgularken bouncing yüzünden low okuyormuş. Sonrasında bir daha kesme oluşmadığından işlevi kaçırıyordum. Çözüm olarak sorgularımı timer kesmesini içine de aldım. Her 10ms de sorguluyorum. Durum böyle olunca pin kesmesi gereksiz gibi oldu ama yinede kullanmaya devam ediyorum. Bounce nedeni ile kaçırısam en kötü 10ms sonra timer ile yakalıyorum.
 
time sharing mod diye bir şey vardı böyle çalışırken kesmeye tekrar girmeden kesmeden çıkmak lazım.

ölçümleri mainde yapmak varken belli aralıklarda timer ile kesmelere girip yapıyorsun. Daha yönetilebilir oluyor. Main kodda döngü süresi farklı olabiliyor.
 
Öyleymiş.

change ile tetik alıp sonrasında high olma koşulum var. Normalde de sinyal high oluyor zaten. Ama bir şekilde high olma koşulunu sorgularken bouncing yüzünden low okuyormuş. Sonrasında bir daha kesme oluşmadığından işlevi kaçırıyordum. Çözüm olarak sorgularımı timer kesmesini içine de aldım. Her 10ms de sorguluyorum. Durum böyle olunca pin kesmesi gereksiz gibi oldu ama yinede kullanmaya devam ediyorum. Bounce nedeni ile kaçırısam en kötü 10ms sonra timer ile yakalıyorum.

Sinyalin high olduğunu sorgulamak yerine yükselen kenarda tetikleme yapsan olmuyor mu?
 
Peki bu konu hakkında bir soru daha sormak istiyorum.

Diyelimki 10ms bir timer kesmemiz var. Özel bir koşul oluştu ve kesme fonksiyonu 20ms çalışacak. Bu durumda 10. ms de kodların çalışması yarım kalıp fonksiyon baştan mı başlar yoksa tamamlanır mı?
 
Peki bu konu hakkında bir soru daha sormak istiyorum.

Diyelimki 10ms bir timer kesmemiz var. Özel bir koşul oluştu ve kesme fonksiyonu 20ms çalışacak. Bu durumda 10. ms de kodların çalışması yarım kalıp fonksiyon baştan mı başlar yoksa tamamlanır mı?
1713866059612.png

atmega328 Datasheetteki açıklamadan anladığım kadarıyla TCNT1, OCR1B ile eşleştiğinde kesme bayrak biti set oluyor. kesme kodu çalıştırılmıyor. Bu bayrak biti, kesme kodu çalıştırılınca silinir demiş. Bununla kodun tamamlanmasını değil çalışmaya başlamasını kastettiğini düşünüyorum. Yoksa kod tamamlanmadan oluşacak yeni kesme olayı kaçırılmış olurdu.

Kesme kodu çalışırken yeni kesme koşulu oluştuğunda, sadece kesme bayrak biti set olmalı. Hali hazırda çalışan kod tamamlandıktan sonra da set olmuş başka bayrak bitleri de varsa, öncelik durumuna göre ilgili kesme kodu çalıştırılmalı. Bu yorumla çalıştırdığım kodlar düzgün çalışıyordu.

Yalnız 10ms'lik timer kesme kodunun 20ms sürmesi demek her halükarda bir kesmenin kaçırılması demek. Çünkü 20inci ms'de oluşan kesme koşulu zaten 10uncu ms'de set olmuş bayrağı tekrar set edeceğinden bir kesme olayı kaçırılmış olur.

Kesme vektör öncelikleri de aşağıdaki gibiymiş.
1713866978774.png
 
1713867610425.png

Yine datasheet'ten, "reset and interrupt handling" başlığından. Buna göre de varsayılan yapılandırmada kesme oluştuğunda global kesmeler kapatılıyor ve kodun tamamlanmasından sonra tekrar açılıyorlar. Bu sırada oluşmuş olan kesme olayları da yine öncelik sırasına göre çalıştırılıyormuş. Bu arada atmega "nested interrupt" destekliyormuş buradan anlaşıldığı kadarıyla.

Yani bir kesme kodu çalışırken daha öncelikli bir kesme durumu oluşursa, bu öncelikli kesme kodunun , kesmeyi kesip çalışması sağlanabiliyormuş. Bunun için yapılması gereken "global interrupt enable I-bit"inin kesme kodunda set edilmesi imiş. Buna göre yukarıdaki öncelik sırası göz önüne alınarak timer kesme kodunun başında "global interrupt enable I-bit"i set edildiğinde, kesme kodu çalışırken oluşacak bir pin change kesmesi, timer kesme kodu tamamlanmadan çalıştırılacak demek... Yalnız interrupt öncelikleri değiştirilemiyor sanırım.
 
32915 eklentisine bak
Yine datasheet'ten, "reset and interrupt handling" başlığından. Buna göre de varsayılan yapılandırmada kesme oluştuğunda global kesmeler kapatılıyor ve kodun tamamlanmasından sonra tekrar açılıyorlar. Bu sırada oluşmuş olan kesme olayları da yine öncelik sırasına göre çalıştırılıyormuş. Bu arada atmega "nested interrupt" destekliyormuş buradan anlaşıldığı kadarıyla.

Yani bir kesme kodu çalışırken daha öncelikli bir kesme durumu oluşursa, bu öncelikli kesme kodunun , kesmeyi kesip çalışması sağlanabiliyormuş. Bunun için yapılması gereken "global interrupt enable I-bit"inin kesme kodunda set edilmesi imiş. Buna göre yukarıdaki öncelik sırası göz önüne alınarak timer kesme kodunun başında "global interrupt enable I-bit"i set edildiğinde, kesme kodu çalışırken oluşacak bir pin change kesmesi, timer kesme kodu tamamlanmadan çalıştırılacak demek... Yalnız interrupt öncelikleri değiştirilemiyor sanırım.
Bak sayemde neler öğrendin :D
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,985
Mesajlar
119,318
Üyeler
2,835
Son üye
alpermete

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top