2016-10-23 25 views
0

私は最近、非常に小さなパッケージでいくつかの簡単な電子機器のプロトタイピングの手段としてATtiny85を使用しています。私は、多くの関数に使用されている言語が標準的なArduinoのスケッチで見つかったものとは非常に異なっている(そして直感的ではありません)ので、これに問題があります。ハードウェア固有の機能についてもまともなリファレンスを見つけるのが難しいです。ATtiny85:ピンとタイマーの割り込みに同時に対応する方法

主なことは、ピンの切り替えとタイマーの両方を同時に聞くことです。ピンの状態の変化はタイマーをリセットしますが、ピンの状態が変化する前に終了すると、コードはタイマー自体に応答する必要があります。

チュートリアルから、私はピン変化とタイマー割り込みの両方が同じ機能 - ISR()を介して行われているようです。私が知りたいことは次のとおりです:

  1. ピンとタイマー割り込みの両方を同時に行うことは可能ですか?
  2. 両者が同じ関数を呼び出すと仮定して、どうやって区別していますか?

答えて

4

ISR()は機能ではありません。construct (macro) that is used to generate the stub for an ISRであり、ISRをベクトルテーブルに挿入します。マクロに渡されるベクタ名によって、どの割り込みが処理されるかが決まります。

ISR(INT0_vect) 
{ 
// Handle external interrupt 0 (PB2) 
    ... 
}; 

ISR(TIM0_OVF_vect) 
{ 
// Handle timer 0 overflow 
    ... 
}; 
+0

ああ!あなたは、適切な文書を見つけることができないということについて私が何を意味するのかを見ていますか?私が見つけたチュートリアルのどれもこの事実を言及しなかった。 – Ash

0

あなたがそれらのそれぞれに対して異なるISRハンドラを定義することができますので、データシートATtiny85によると、PCINT0TIMER1 COMPA/OVF/COMPBに同じ割り込みベクタを持っていません。

より多くの割り込みに同じハンドラを使用している場合、割り込みフラグは通常ISRベクタ実行時にハードウェアによってクリアされるため、それらを区別することはできません。受け入れ答えに加えとして

0

はピンと同時に起こってタイマ割り込みの両方を持っていることが可能ですか?

割り込みは、ハードウェアレベルで正確に同時に発生することができ、それに応じて対応する割り込みフラグが設定されます。フラグは、それぞれの割り込みのISRが実行されることを示します。しかし、実際のISRは、(多かれ少なかれ明らかに)同時に/並行して実行されません。どのISRが最初に実行されるか(複数の割り込みが保留中の場合)は、データシートの割り込みベクタテーブルで指定される割り込み優先順位に依存します。

関連する問題