attachInterrupt()



Açıklama

Kesintili Dijital Pimler

attachInterrupt() parametresinin ilk parametresi bir kesme numarasıdır. Normalde, gerçek dijital pimi belirli kesme numarasına çevirmek için digitalPinToInterrupt(pin) kullanmalısınız. Eğer 3 bacağına bağlantı, örneğin, kullanımı digitalPinToInterrupt(3) ilk parametre olarak attachInterrupt() .

Yazı tahtası Kesmeler için Kullanılabilir Dijital Pimler

Uno, Nano, Mini, diğer 328 tabanlı

2, 3

Uno WiFi Rev.2, Nano Every

tüm dijital pimler

Mega, Mega2560, MegaADK

2, 3, 18, 19, 20, 21

Micro, Leonardo, diğer 32u4 tabanlı

0, 1, 2, 3, 7

Sıfır

4 hariç tüm dijital pimler

MKR Aile panoları

0, 1, 4, 5, 6, 7, 8, 9, A1, A2

Nano 33 IoT

2, 3, 9, 10, 11, 13, 15, A5, A7

Nano 33 BLE, Nano 33 BLE Anlam

tüm iğneler

nedeniyle

tüm dijital pimler

101

tüm dijital pinler (Sadece 2, 5, 7, 8, 10, 11, 12, 13 pinleri CHANGE ile çalışır)

Notlar ve Uyarılar

Not
Ekli işlevin içinde, delay() çalışmaz ve millis() tarafından döndürülen değer millis() . İşlevdeyken alınan seri veriler kaybolabilir. Ekli işlev içinde değiştirdiğiniz değişkenleri volatile olarak bildirmelisiniz. Daha fazla bilgi için aşağıdaki ISR'ler bölümüne bakın.

Kesmeleri Kullanma

Kesmeler mikrodenetleyici programlarında işlerin otomatik olarak gerçekleşmesi için faydalıdır ve zamanlama sorunlarının çözülmesine yardımcı olabilir. Bir kesinti kullanmak için iyi görevler bir döner kodlayıcıyı okumak veya kullanıcı girişini izlemek olabilir.

Bir programın darbeleri her zaman bir döner kodlayıcıdan yakaladığından emin olmak istiyorsanız, nabzı asla kaçırmaz, başka bir şey yapmak için bir program yazmayı zorlaştırır, çünkü programın sensörü sürekli olarak yok etmesi gerekir meydana geldiğinde darbeleri yakalamak için kodlayıcı hatları. Diğer sensörler de, bir tıklama yakalamaya çalışan bir ses sensörünü veya bozuk para yakalamaya çalışan bir kızılötesi yuva sensörünü (fotoğraf kesici) okumaya çalışmak gibi benzer bir arayüz dinamikine sahiptir. Tüm bu durumlarda, bir kesme kullanılması, mikro denetleyiciyi girişi kaçırmadan başka işler yapmak için serbest bırakabilir.

Kesme Servisi Rutinleri Hakkında

ISR'ler, diğer birçok işlevin sahip olmadığı benzersiz sınırlamalara sahip özel işlev türleridir. Bir ISR'nin hiçbir parametresi olamaz ve hiçbir şey döndürmemelidir.

Genel olarak, bir ISR mümkün olduğunca kısa ve hızlı olmalıdır. Çiziminiz birden fazla ISR kullanıyorsa, bir seferde yalnızca biri çalıştırılabilir, mevcut kesintiler sahip oldukları önceliğe bağlı bir sırayla tamamlandıktan sonra diğer kesintiler yürütülür. millis() kesintilere dayanır, bu yüzden asla bir ISR içinde millis() . delay() işlevinin çalışması için kesinti gerektirdiğinden, bir ISR içinde çağrılırsa çalışmaz. micros() başlangıçta çalışır ancak 1-2 ms sonra düzensiz davranmaya başlar. delayMicroseconds() herhangi bir sayaç kullanmaz, bu nedenle normal çalışır.

Genellikle global değişkenler bir ISR ile ana program arasında veri iletmek için kullanılır. Bir ISR ve ana program arasında paylaşılan değişkenlerin doğru şekilde güncellendiğinden emin olmak için volatile olarak volatile .

Kesmeler hakkında daha fazla bilgi için Nick Gammon'un notlarına bakın .

Sözdizimi

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) (önerilir)
attachInterrupt(interrupt, ISR, mode) (önerilmez)
attachInterrupt(pin, ISR, mode) (Önerilmez. Ayrıca, bu sözdizimi yalnızca Arduino SAMD Kartlarında, Uno WiFi Rev2, Due ve 101'de çalışır.)

Parametreler

interrupt : interrupt sayısı. İzin verilen veri türleri: int .
pin : Arduino pin numarası.
ISR : kesme oluştuğunda çağrılacak ISR; bu işlev parametre almamalı ve hiçbir şey döndürmemelidir. Bu işlev bazen bir kesme hizmeti rutini olarak adlandırılır.
mode : kesmenin ne zaman tetiklenmesi gerektiğini tanımlar. Dört sabit, geçerli değerler olarak önceden tanımlanmıştır:

  • Pim azaldığında kesmeyi tetiklemek için DÜŞÜK ,

  • Pim her değer değiştirdiğinde kesmeyi tetiklemek için DEĞİŞTİR

  • Pim alçaktan yükseğe çıktığında tetiklemek için yükseliyor ,

  • Pim yüksekten alçağa düştüğünde DÜŞEN .

Due, Zero ve MKR1000 kartları aşağıdakilere de izin verir:

  • Pim yüksek olduğunda kesmeyi tetiklemek için YÜKSEK .

İadeler

Hiçbir şey değil

Örnek Kod

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

Kesme Numaraları

Normalde bir kesme numarasını doğrudan çiziminize yerleştirmek yerine digitalPinToInterrupt(pin) kullanmalısınız. Kesintili özel pimler ve bunların kesilme sayısı ile eşlenmesi her bir kart türü için değişir. Kesme numaralarının doğrudan kullanımı basit görünebilir, ancak çiziminiz farklı bir tahtada çalıştığında uyumluluk sorununa neden olabilir.

Bununla birlikte, daha eski eskizlerde genellikle doğrudan kesme numaraları vardır. Genellikle 0 (dijital pim 2 için) veya 1 (dijital pim 3 için) kullanılır. Aşağıdaki tablo, çeşitli kartlardaki kullanılabilir kesme pimlerini gösterir.

Aşağıdaki tabloda, kesme numaralarının attachInterrupt() öğesine iletilecek numarayı gösterdiğini unutmayın. Tarihsel nedenlerden dolayı, bu numaralandırma her zaman doğrudan ATmega yongasındaki kesme numaralandırmasına karşılık gelmez (örneğin int.0, ATmega2560 yongasındaki INT4'e karşılık gelir).

Yazı tahtası int.0 int.1 int.2 Int.3 int.4 int.5

Uno, Ethernet

2

3

Mega2560

2

3

21

20

19

18

32u4 tabanlı (örn. Leonardo, Micro)

3

2

0

1

7

Uno WiFiRev.2, Due, Zero, MKR Family ve 101 panoları için kesme numarası = pin numarası .

Ayrıca Bakınız