技術メモ

電子工作 Unityとか

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