arduino
인터럽트
수색…
통사론
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가 토글됩니다.