수색…


통사론

  • digitalPinToInterrupt (핀); // attachInterrupt()detachInterrupt() 와 함께 사용하기 위해 핀 ID를 인터럽트 ID로 변환합니다.

  • attachInterrupt (digitalPinToInterrupt (핀), ISR, 모드); // 권장

  • attachInterrupt (인터럽트, ISR, 모드); // 권장하지 않음

  • detachInterrupt (digitalPinToInterrupt (pin));

  • detachInterrupt (인터럽트);

  • noInterrupts (); // 인터럽트를 비활성화합니다.

  • interrupts (); // noInterrupts() 가 호출 된 후 인터럽트를 다시 활성화합니다.

매개 변수

매개 변수 노트
일시 정지 이드의 인터럽트. 핀 번호로 착각하지 마세요.
ISR 인터럽트 서비스 루틴. 이것은 인터럽트가 발생할 때 실행될 방법입니다.
방법 인터럽트가 발생하게하는 원인은 무엇입니까? 낮음, 변경, 상승 또는 낙하 중 하나입니다. Due board는 또한 HIGH를 허용합니다.

비고

인터럽트 서비스 루틴 (Interrupt Service Routines, ISR)은 주 프로그램 실행을 일시 중지하고 시간에 종속적 인 코드를 망칠 수 있기 때문에 가능한 한 짧아야합니다. 일반적으로 이것은 ISR에서 플래그를 설정하고 종료하고, 주 프로그램 루프에서 플래그를 확인하고 플래그가 수행해야하는 모든 작업을 수행한다는 것을 의미합니다.

이러한 메서드 자체는 인터럽트에 의존하기 때문에 ISR에서 delay() 또는 millis() 를 사용할 수 없습니다.

단추 누르기에 중단

이 예제에서는 내부 풀업 저항을 사용하여 디지털 핀 2와 GND에 연결된 누름 버튼 (택트 스위치)을 사용하므로 버튼을 누르지 않으면 핀 2가 HIGH입니다.

const int LED_PIN = 13;
const int INTERRUPT_PIN = 2;
volatile bool ledState = LOW;

void setup() {
    pinMode(LED_PIN, OUTPUT);
    pinMode(INTERRUPT_PIN, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), myISR, FALLING); // trigger when button pressed, but not when released.
}

void loop() {
    digitalWrite(LED_PIN, ledState);
}

void myISR() {
    ledState = !ledState;
    // note: LOW == false == 0, HIGH == true == 1, so inverting the boolean is the same as switching between LOW and HIGH.
}

이 간단한 예제의 한 가지 문제점은 푸시 버튼이 튀어 오르는 경향이 있다는 것입니다. 즉, 누르거나 놓을 때 회로가 마지막 닫힌 상태 또는 열린 상태로 안정되기 전에 회로가 ​​두 번 이상 열리고 닫힙니다. 이 예제는이를 고려하지 않습니다. 결과적으로, 때때로 버튼을 누르면 예상 한 번이 아닌 여러 번 LED가 토글됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow