タグ付けされた質問 「isr」

3
入力が変更されたときに関数を自動的に呼び出すことはできますか?
現在、私のスケッチでは、メインループを回るたびに入力ピンをチェックしています。変更を検出すると、カスタム関数を呼び出してそれに応答します。コードは次のとおりです(要点に合わせてトリミングされています)。 int pinValue = LOW; void pinChanged() { //... } void setup() { pinMode(2, INPUT); } void loop() { // Read current input int newValue = digitalRead(2); // Has the input changed? if (newValue != pinValue) { pinValue = newValue; pinChanged(); } } 残念ながら、これは入力の非常に短い変更(短いパルスなど)、特にloop()少しゆっくり実行している場合は常に適切に機能するとは限りません。 Arduinoに入力の変更を検出させ、関数を自動的に呼び出す方法はありますか?
21 pins  interrupt  isr 

2
Arduinoの関数ポインター割り当てはアトミックですか?
次のスニペットは、TimerOneライブラリのソースコードからの抜粋です。 // TimerOne.h: void (*isrCallback)(); // TimerOne.cpp: ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt { Timer1.isrCallback(); } // TimerOne.cpp: void TimerOne::attachInterrupt(void (*isr)(), long microseconds) { if(microseconds > 0) setPeriod(microseconds); isrCallback = isr; // register the user's callback with the real ISR TIMSK1 = …

1
変数が1を超えるISRからアクセスされ、ISRの外部で共有されない場合、揮発性は必要ですか?
だ明確に文書化グローバルデータは、ISRとメインプログラムと共有されている場合、データのニーズが宣言されることをvolatile保証メモリの可視性にするために(それが唯一の1バイトのデータで十分、何も大きなニーズも保証アトミックに特別な手配を) 。ここに良いルールがあります: ISRの外部でのみ使用される変数は、揮発性であってはなりません。 ISR内でのみ使用される変数は、揮発性であってはなりません。 ISRの内部と外部の両方で使用される変数は、揮発性でなければなりません。 しかしvolatile、変数が1を超えるISRからアクセスされ、ISRの外部で共有されない場合に必要ですか?たとえば、static変数を使用して内部状態を維持する関数があります。 void func() { static volatile long counter; // volatile or not? // Do stuff with counter etc. } この関数は、ピン割り込みから、およびTimerOneライブラリからの2つの方法で呼び出されます。 attachInterrupt(0, func, CHANGE); Timer1.attachInterrupt(func); ISRに入ると、割り込みは自動的に無効になるため、アトミック性の問題はありませんが、これvolatileはコンパイラーの質問です。何がキャッシュされ、何がキャッシュされないかです。 もちろん、申し訳ありませんが安全です。
9 interrupt  timers  isr 

2
タイマーを使用してISRの変数を更新する方法
Timer3の周波数をカウンターで確認しようとしています。揮発性として宣言されたカウンターの値はISRでインクリメントされ、毎秒合計がメインループに表示され、値はゼロにリセットされます。 タイマーは正しく設定されています。(3Hzタイマーを選択すると、LEDが点滅します) 問題 カウンターはインクリメントされません。出力は次のとおりです。 Setup Completed tick: 1 tick: 0 tick: 0 tick: 0 コード volatile int cont = 0; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); // Initialize Timer cli(); // disable global interrupts TCCR3A = 0; // set entire TCCR3A register to 0 TCCR3B = 0; // same for …

2
Arduinoの中断(ピン変更時)
割り込み関数を使用して、から受け取った値を配列に書き込みますdigitalRead()。 void setup() { Serial.begin(115200); attachInterrupt(0, test_func, CHANGE); } void test_func(){ if(digitalRead(pin)==HIGH){ test_array[x]=1; } else if(digitalRead(pin)==LOW){ test_array[x]=0; } x=x+1; } その問題は、印刷するときに、またはのtest_arrayような値があることです。111000 私が理解しているようにCHANGE、attachInterrupt()関数でオプションを使用する場合、データシーケンスは常に0101010101繰り返さないでください。 無線モジュールからのデータであるため、データは非常に速く変化します。
8 arduino-uno  c  isr 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.