Arduino ATtiny85 割り込み RISINGとFALLINGを両方扱いたい
attachInterrupt(digitalPinToInterrupt(2), _interrupt1, RISING); attachInterrupt(digitalPinToInterrupt(2), _interrupt0, FALLING);
2つは登録できない。
attachInterrupt(digitalPinToInterrupt(2), _interrupt, CHANGE); で両方とれる。が今の状態が分からない。 void _interrupt(){ flag_interrupt_ = digitalRead(PIN_SWITCH); //or flag_interrupt_ = !flag_interrupt_; }
digitalReadを処理している間に次の割り込み等が入る。 フラグを裏返すのも、何かのタイミングでひっくり返りそう。
下記で安定した。
#define PIN_SWITCH 2 #define PIN_OUTPUT 0 volatile uint8_t flag_interrupt_ = 0; uint8_t flag_interrupt_tmp_ = 0; uint8_t pin_ = 0; uint8_t old_pin_ = 0; void setup() { pinMode(PIN_SWITCH, INPUT); pinMode(PIN_OUTPUT , OUTPUT); //PB2 INT0 attachInterrupt(digitalPinToInterrupt(2), _interrupt, RISING); } void loop() { pin_ = flag_interrupt_; flag_interrupt_tmp_ = digitalRead(PIN_SWITCH); flag_interrupt_ = flag_interrupt_tmp_;//assume atomic operation if(pin_ == 1 && old_pin_ == 0){ digitalWrite(PIN_OUTPUT , HIGH); }else if(pin_ == 0 && old_pin_ == 1){ digitalWrite(PIN_OUTPUT , LOW); } old_pin_ = pin_; } void _interrupt() { flag_interrupt_ = 1; }