Arduino - Kesmeler

Kesintiler, Arduino'nun mevcut çalışmasını durdurur, böylece başka işler yapılabilir.

Diyelim ki evde oturuyorsunuz, biriyle sohbet ediyorsunuz. Aniden telefon çalıyor. Sohbeti bırakırsınız ve arayanla konuşmak için telefonu kaldırırsınız. Telefon görüşmenizi bitirdiğinizde, telefon çalmadan önce kişiyle sohbet etmeye geri dönersiniz.

Benzer şekilde, ana rutini biriyle sohbet etmek olarak düşünebilirsiniz, telefonun çalması sohbeti durdurmanıza neden olur. Kesinti hizmeti rutini, telefonda konuşma sürecidir. Telefon görüşmesi bittiğinde, ana sohbet rutininize geri dönersiniz. Bu örnek, bir kesmenin bir işlemcinin nasıl davranmasına neden olduğunu tam olarak açıklamaktadır.

Ana program çalışıyor ve bir devrede bazı işlevler gerçekleştiriyor. Bununla birlikte, bir kesinti meydana geldiğinde, başka bir rutin gerçekleştirilirken ana program durur. Bu rutin bittiğinde, işlemci ana rutine geri döner.

Önemli özellikler

Kesmelerle ilgili bazı önemli özellikler şunlardır:

  • Kesintiler çeşitli kaynaklardan gelebilir. Bu durumda, dijital pinlerden birindeki bir durum değişikliğiyle tetiklenen bir donanım kesintisi kullanıyoruz.

  • Çoğu Arduino tasarımında, sırasıyla dijital I / O pinleri 2 ve 3'e bağlanan iki donanım kesintisi ("interrupt0" ve "interrupt1" olarak adlandırılır) bulunur.

  • Arduino Mega, 21, 20, 19 ve 18 pinlerinde ek kesintiler ("interrupt2" - "interrupt5") dahil olmak üzere altı donanım kesintisine sahiptir.

  • "Interrupt Service Routine" (genellikle ISR olarak bilinir) adı verilen özel bir işlevi kullanarak bir rutin tanımlayabilirsiniz.

  • Rutini tanımlayabilir ve yükselen kenardaki, düşen kenardaki veya her ikisindeki koşulları belirleyebilirsiniz. Bu özel koşullarda, kesintiye hizmet verilecektir.

  • Bir giriş pininde her olay meydana geldiğinde, bu fonksiyonun otomatik olarak yürütülmesi mümkündür.

Kesinti Türleri

İki tür kesinti vardır -

  • Hardware Interrupts - Yüksek veya alçak giden bir harici kesinti pimi gibi harici bir olaya yanıt olarak oluşurlar.

  • Software Interrupts- Yazılımla gönderilen bir talimata yanıt olarak oluşurlar. "Arduino dilinin" desteklediği tek kesme türü, attachInterrupt () işlevidir.

Arduino'da Kesintileri Kullanma

Kesmeler, zamanlama problemlerini çözmede yardımcı olduğu için Arduino programlarında çok kullanışlıdır. Kesmenin iyi bir uygulaması, bir döner kodlayıcıyı okumak veya bir kullanıcı girişini gözlemlemektir. Genel olarak, bir ISR olabildiğince kısa ve hızlı olmalıdır. Çiziminiz birden fazla ISR kullanıyorsa, aynı anda yalnızca biri çalıştırılabilir. Diğer kesintiler, sahip oldukları önceliğe bağlı olarak mevcut olanın bitmesinden sonra yürütülecektir.

Tipik olarak, genel değişkenler ISR ile ana program arasında veri iletmek için kullanılır. Bir ISR ile ana program arasında paylaşılan değişkenlerin doğru şekilde güncellendiğinden emin olmak için, bunları geçici olarak bildirin.

attachInterrupt İfadesi Sözdizimi

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs; 
   //this function must take no parameters and return nothing. 
   //This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.

Aşağıdaki üç sabit, geçerli değerler olarak önceden tanımlanmıştır -

  • LOW pim düşük olduğunda kesmeyi tetiklemek için.

  • CHANGE pinin değeri her değiştiğinde kesmeyi tetiklemek için.

  • FALLING pim yüksekten alta gittiğinde.

Example

int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT); //set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
   //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
   digitalWrite(13, state); //pin 13 equal the state value
} 

void blink() { 
   //ISR function
   state = !state; //toggle the state when the interrupt occurs
}