interrupt mantığı

Başlatan l0rd, 11 Mayıs 2018, 11:25:11

l0rd

Bir buton ve led kullanarak , butondan gelen harici kesme ile tetiklenen ve 1sn aralıklar ile yanıp sönen led yapmak isteyelim.

Timeri başlattık , ve bize 1sn de bir kesme üretecek.Butona program basladıktan 3.5 sn sonra basarsam bir sonraki timer kesmesi 0.5 sn sonra gelecek. ben bir sonraki timer kesmesini kullanırsam ledin ilk yanma süresi 0.5 sn sönme süresi 1sn ??

Buton kesmesi geldikten sonra , timer dan 1sn bilgisini nasıl alabilirim

what you do that defines you

Zoroaster

Init asamasinda timera start verme. Timer butona basildiginda saymaya baslarsa sorunun cozulur.

Seytan deliginden kacti.

l0rd

Alıntı yapılan: Zoroaster - 11 Mayıs 2018, 12:22:57Init asamasinda timera start verme. Timer butona basildiginda saymaya baslarsa sorunun cozulur.



Yani buton kesmesi için yazdığımız fonksiyon içinde mi ,şu şekilde

void HariciKesmeFonksiyonu(void)
{  
if( KesmeBayrağı == 1)  
TIM_Cmd(TIM3, ENABLE);    //sanırım stm32f0 için timer3 aktif eden fonksiyon
KesmeBayrağı=0;  //clear

}

Şimdi biz buton kesmesi ile Timer i başlattık , sayıcı saymaya başladı. 1 sn sonra kesme üretecek (yani butona basıldıktan 1sn sonra) bu kesmeyi kullanarak led in 1 sn yanması 1 sn sönmesi sağlanmış oldu.Ama programın baska bir yerinde program başladıktan belli bir süre sonra bir şey yapmak istersek bu kesmeyi kullanamayız mı ( çünkü buton ile saymaya başlıyor) Yeni bir timer mı kullanmak gerek bu durum için
what you do that defines you

l0rd

#3
Alıntı yapılan: l0rd - 11 Mayıs 2018, 21:49:29Şimdi biz buton kesmesi ile Timer i başlattık , sayıcı saymaya başladı. 1 sn sonra kesme üretecek (yani butona basıldıktan 1sn sonra) bu kesmeyi kullanarak led in 1 sn yanması 1 sn sönmesi sağlanmış oldu.Ama programın baska bir yerinde program başladıktan belli bir süre sonra bir şey yapmak istersek bu kesmeyi kullanamayız mı ( çünkü buton ile saymaya başlıyor) Yeni bir timer mı kullanmak gerek bu durum için

Sanırım ben interrupt mantığını hala anlamamışım ,  kafamda çok soru var buradan sorayım bilenler yardımcı olabilirse sevinirim . ( kendi kartım transistor surmeye çalışırken bozulduğu için deneye deneye cevapları bulamıyorum , yeni kart için de biraz zamana ihtiyacım var sanırım )

1. Aşağıdaki gibi bir interrupt fonksiyonu yazdığımızda program sürekli bu fonksiyonu kontrol eder mi? Yoksa bu fonksiyon interrupt geldiğinde program girsin diye mi yazıldı ? Eğer interrup gelince girsin diye yazıldıysa interrupt gelince bu fonksiyona gireceğini nerden biliyor? ....... sebebiyle bilip bu fonksiyona giriyorsa neden kesme bayrağını kontrol etme ihtiyacı var(zaten interrupt geldiğini bilerek girmiş)?

void EXTI0_1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
      index++;
  }
  EXTI_ClearITPendingBit(EXTI_Line0);
}

2.İnterrupt gelince yapılacak bir iş var ise o an yaptığı görevi bırakıp , interrupt görevini yapar daha sonra ana görevine kaldığı yerden devam eder diye okumuştum.10 saniyelik bir delay fonksiyonunun 6. saniyesinde kesme geldiyse , kesme görevini yaptıktan sonra ana göreve dönünce 4 sn delay mı yapar demek oluyor bu


3. interrupt görevinin uzunluğu hakkında bir sınırlama(verim açısından) koymalımıyız ?
what you do that defines you

Kabil ATICI

İnterrupt programın akışı esnasında sürekli olarak kontrol edilmesi istenmeyen, ama sürekli kontrolu zorunlu işlevler için kullanılır.
Örneğin, bir butonun basıldığını sürekli kontrol etmek zorunda olabilirsin, bu noktada harici kesme kullanıldığında ana program akışın herhangi bir şekilde etkilenmeden kesme bekler. Harici kesmeyi tetikleyecek olan (bu inen kenar, yükselen kenar veya lojik seviye değişimi olabilir) olay meydana gelene kadar;
bu noktada senin daha önceden kesme için atamış olduğun işleme dallanır ve kesme işlemi gerçekleştirilir. Ve son olarak ana program akışından dallandığı noktaya geri döner.
Burada işlemler C kodunda olduğu için çoğu üstü kapalı geçer. Assemler koduda çalıştığın zaman bu olayların tamamını ilgilenmen gerekir.

Bu olay basitçe, siz bir müşteri ile ilgilenirken, bir başka çalışanın gelip bir saniye bakar mısın demesi gibidir. Arkadaşın ne diyeceğine bakar ve sonra müşteriye geri dönersin.

İşlemcinin kesme geldiği zaman nereye gideceği kesme vektor registerleri tarafından belirlenir. Çoğunlukla bu ilk rom adreslerinden oluşur. Örneğin reset  çoğunlukla 0x0000 adresine yönlenirken bazı işlemcilerde bu farklı bir adrestir. Kesme vektor adresleri de bu rom adresinin altında yer alır.

Burada bazı işlemcilerde her bir kesme ayrı ayrı vektör adres ataması yapılırken, bazılarında kesme adı altında bir veya 2 kesme vektör adresi vardır. Birleşik kesme vektör adresi olan işlemcilerde, hangi kesmenin geldiğini belirlemek için kesme bayrak kontrolu gerekir.

Çoğunlukla tüm kesmeler bir "veya" işlemi uygulanır bu şekilde genel bir kesme geldiği  görülür. İşlemcinin hangi kesme yöntemini uyguladığını görmek için veri kağıtlarından donanım genel yapısını veya blok şemasını inceleyebilirsin.

gecikme olayını eğer ana program için işlemciyi boş zaman geçirterek yapıyorsan  zamanlama sözünü ettiğin gibi olur, ama işlemcinin timer yapısını kullanarak yapıyorsan o zaman kesinti olmadan işlem devam eder. Zaman kritik uygulamalarda timer kullanımı bu iş için gereklidir.

Yoksa örneğin 1 wire bağlantısı içeren DS1820 gibi bir devrede kesmeler istenmeyen hatalara sebep olabilir.

Kesme işlemleri mümkün olduğu kadar kısa tutulmalıdır. Yoksa yapılan işlerde senkron kaçırma olabilir. Seri haberleşmede yeni gelen verinin bir öncekinin üstüne yazılması veya buton basıldığında işlem yapmaması gibi sorunlar ortaya çıkabilir.
ambar7

l0rd

Alıntı yapılan: Kabil ATICI - 13 Mayıs 2018, 14:11:15İnterrupt programın akışı esnasında sürekli olarak kontrol edilmesi istenmeyen, ama sürekli kontrolu zorunlu işlevler için kullanılır.
Örneğin, bir butonun basıldığını sürekli kontrol etmek zorunda olabilirsin, bu noktada harici kesme kullanıldığında ana program akışın herhangi bir şekilde etkilenmeden kesme bekler. Harici kesmeyi tetikleyecek olan (bu inen kenar, yükselen kenar veya lojik seviye değişimi olabilir) olay meydana gelene kadar;
bu noktada senin daha önceden kesme için atamış olduğun işleme dallanır ve kesme işlemi gerçekleştirilir. Ve son olarak ana program akışından dallandığı noktaya geri döner.
Burada işlemler C kodunda olduğu için çoğu üstü kapalı geçer. Assemler koduda çalıştığın zaman bu olayların tamamını ilgilenmen gerekir.

Bu olay basitçe, siz bir müşteri ile ilgilenirken, bir başka çalışanın gelip bir saniye bakar mısın demesi gibidir. Arkadaşın ne diyeceğine bakar ve sonra müşteriye geri dönersin.

İşlemcinin kesme geldiği zaman nereye gideceği kesme vektor registerleri tarafından belirlenir. Çoğunlukla bu ilk rom adreslerinden oluşur. Örneğin reset  çoğunlukla 0x0000 adresine yönlenirken bazı işlemcilerde bu farklı bir adrestir. Kesme vektor adresleri de bu rom adresinin altında yer alır.

Burada bazı işlemcilerde her bir kesme ayrı ayrı vektör adres ataması yapılırken, bazılarında kesme adı altında bir veya 2 kesme vektör adresi vardır. Birleşik kesme vektör adresi olan işlemcilerde, hangi kesmenin geldiğini belirlemek için kesme bayrak kontrolu gerekir.

Çoğunlukla tüm kesmeler bir "veya" işlemi uygulanır bu şekilde genel bir kesme geldiği  görülür. İşlemcinin hangi kesme yöntemini uyguladığını görmek için veri kağıtlarından donanım genel yapısını veya blok şemasını inceleyebilirsin.

gecikme olayını eğer ana program için işlemciyi boş zaman geçirterek yapıyorsan  zamanlama sözünü ettiğin gibi olur, ama işlemcinin timer yapısını kullanarak yapıyorsan o zaman kesinti olmadan işlem devam eder. Zaman kritik uygulamalarda timer kullanımı bu iş için gereklidir.

Yoksa örneğin 1 wire bağlantısı içeren DS1820 gibi bir devrede kesmeler istenmeyen hatalara sebep olabilir.

Kesme işlemleri mümkün olduğu kadar kısa tutulmalıdır. Yoksa yapılan işlerde senkron kaçırma olabilir. Seri haberleşmede yeni gelen verinin bir öncekinin üstüne yazılması veya buton basıldığında işlem yapmaması gibi sorunlar ortaya çıkabilir.

Teşekkür ederim kafamda bir çok sey canlandı , Asm ile denemeler yapıp görmem gerek dediğiniz gibi
what you do that defines you