0

私は最近、ATtiny85 を非常に小さなパッケージでいくつかの単純な電子機器のプロトタイプを作成する手段としていじっています。その関数の多くに使用される言語が、標準の Arduino スケッチに見られるものとは非常に異なる (そして直感的ではない!) ため、私はこれに問題を抱えています。ハードウェア固有の機能についても適切なリファレンスを見つけるのに苦労しています。

主にやりたいことは、ピンの変更とタイマーの両方を同時にリッスンすることです。ピンの状態が変化するとタイマーがリセットされますが、同時に、ピンの状態が変化する前にタイマーが終了した場合、コードはタイマー自体に応答する必要があります。

さて、私が見つけたチュートリアルから、ピン変更とタイマー割り込みの両方が同じ関数 - ISR() を介して漏斗されているようです。私が知りたいのは:

  1. ピンとタイマー割り込みの両方を同時に実行することは可能ですか?
  2. どちらも同じ関数を呼び出すと仮定すると、どのように区別しますか?
4

3 に答える 3

4

ISR() is not a function, it's a construct (macro) that is used to generate the stub for an ISR as well as inject the ISR into the vector table. The vector name passed to the macro determines which interrupt it services.

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

ISR(TIM0_OVF_vect)
{
// Handle timer 0 overflow
   ...
};
于 2016-10-23T05:50:11.813 に答える
0

受け入れられた回答への追加として:

ピンとタイマー割り込みの両方を同時に実行することは可能ですか?

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

于 2016-10-24T08:43:24.893 に答える
0

データシートによると、 と にATtiny85は同じ割り込みベクトルがないためPCINT0TIMER1 COMPA/OVF/COMPBそれぞれに異なる ISR ハンドラを定義できます。

より多くの割り込みに同じハンドラーを使用している場合、割り込みフラグは通常、ISR ベクターの実行時にハードウェアによってクリアされるため、それらを区別することは不可能な場合があります。

于 2016-10-23T06:09:13.673 に答える