attachInterrupt()

[Harici Kesintiler]

Açıklama

Kesintili Dijital Pinler

İki parametre arasında bir kesme numarasıdır.Normalde, gerçek dijital pini belirli kesme numarasına çevirmek için digitalPinToInterrupt(pin) kullanmalısınız.Örneğin, pin 3'e bağlanırsanız, attachInterrupt() için ilk parametre olarak digitalPinToInterrupt(3)'ü kullanın.

KART KESİNTİLER İÇİN KULLANILAN DİJİTAL PİNLER
Uno, Nano, Mini, other 328-based 2,3
Uno WiFi Rev.2, Nano Every Bütün dijital pinler
Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21 (20 ve 21 pinleri I2C iletişimi için kullanılırken kesmeler için kullanılamaz)
Micro, Leonardo, other 32u4-based 0, 1, 2, 3, 7
Zero 4 numaralı dijital pin hariç bütün dijital pinler
MKR Family boards 0, 1, 4, 5, 6, 7, 8, 9, A1, A2
Nano 33 IoT 2, 3, 9, 10, 11, 13, A1, A5, A7
Nano 33 BLE, Nano 33 BLE Sense bütün pinler
Due bütün dijital pinler
101 tüm dijital pinler (Yalnızca 2, 5, 7, 8, 10, 11, 12, 13 pinleri CHANGE ile çalışır)

Notlar ve Uyarılar

Not

delay() Ekli işlevin içinde çalışmaz ve millis() tarafından döndürülen değer artmaz.

İşlev sırasında alınan seri veriler kaybolabilir. volatile Ekli fonksiyon içinde değiştirdiğiniz herhangi bir değişken olarak bildirmelisiniz . Daha fazla bilgi için aşağıdaki ISR'lerle ilgili bölüme bakın.

Kesintileri Kullanma

Kesintiler, mikrodenetleyici programlarında işlerin otomatik olarak gerçekleşmesi için yararlıdır ve zamanlama sorunlarının çözülmesine yardımcı olabilir. Bir kesme kullanmak için iyi görevler, bir döner kodlayıcının okunmasını veya kullanıcı girdisinin izlenmesini içerebilir.

Bir programın her zaman döner kodlayıcıdan gelen darbeleri yakaladığından emin olmak istiyorsanız,darbeleri kaçırmasın diye,bir program yazmak işi çok zorlaştırırdı. Diğer sensörler de benzer bir dinamik arayüze sahiptir, örneğin bir tıklamayı yakalamaya çalışan bir ses sensörünü okumaya çalışmak veya bir madeni para damlasını yakalamaya çalışan bir kızılötesi yuva sensörü (fotoğraf kesici). Tüm bu durumlarda, bir kesme kullanmak, girişi kaçırmadan mikrodenetleyiciyi başka işler yapmak için serbest bırakabilir.

Kesinti Hizmeti Rutinleri Hakkında

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

Genel olarak, bir ISR mümkün olduğu kadar 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 kesmeler, sahip oldukları önceliğe bağlı olarak, geçerli olan bittikten sonra yürütülür. millis()saymak için kesintilere dayanır, bu nedenle bir ISR içinde asla artmaz. Yana delay()çalışmalarına kesmeleri gerektiren bir ISR içinde denir, eğer ç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 şekilde çalışacaktır.

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

Kesintiler 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 Boards, Uno WiFi Rev2, Due ve 101'de çalışır.)

Parametreler

interrupt: kesinti numarası. İzin verilen veri türleri: int.

pin: Arduino pin numarası

ISR: kesinti meydana geldiğinde aranacak ISR; bu işlev hiçbir parametre almamalı ve hiçbir şey döndürmemelidir. Bu işleve bazen bir kesme hizmeti rutini denir.

mode: kesmenin ne zaman tetiklenmesi gerektiğini tanımlar. Dört sabit, geçerli değerler olarak önceden tanımlanmıştır:

  • DÜŞÜK Pim düşük olduğunda kesmeyi tetiklemek için
  • DEĞİŞTİR PIN değeri değiştiğinde kesmeyi tetiklemek için
  • YÜKSELİYOR Pim düşükten yükseğe gittiğinde tetiklemek için
  • DÜŞÜYOR Pin yüksekten alçağa gittiğinde

Due, Zero ve MKR1000 kartları ayrıca şunları sağlar:

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

Geri Dönüş

Yok

Ö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;
}
                    

Kesinti Sayıları

Normalde digitalPinToInterrupt(pin), çiziminize doğrudan bir kesme numarası yerleştirmek için kullanmalısınız . Kesintilere sahip belirli pinler ve bunların kesinti sayısına eşlenmesi, her kart tipi için değişir. Kesinti sayılarının doğrudan kullanımı basit görünebilir, ancak çiziminiz farklı bir tahtada çalıştığında uyumluluk sorununa neden olabilir

Ancak, daha eski çizimler genellikle doğrudan kesme numaralarına sahiptir. Genellikle 0 (dijital pin 2 için) veya 1 (dijital pin 3 için) kullanıldı. Aşağıdaki tablo, çeşitli kartlardaki mevcut kesme pinlerini göstermektedir.

Aşağıdaki tabloda, kesme numaralarının iletilecek numarayı ifade ettiğini unutmayın attachInterrupt(). Tarihsel nedenlerden dolayı, bu numaralandırma her zaman ATmega yongasındaki kesinti numaralandırmasına doğrudan karşılık gelmez (örn.

KART INT.0 INT.1 INT.2 INT.3 INT.4 INT.5
Uno,Ethernet 2 3
Mega2560 2 3 21 20 19 18
32u4 based (e.g Leonardo, Micro) 3 2 0 1 7

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