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

3
割り込みルーチン内でmillis()およびmicros()を使用する
のドキュメントattachInterrupt(): ... millis()カウントは割り込みに依存しているため、ISR内でインクリメントすることはありません。機能するためdelay()に割り込みが必要なので、ISR内で呼び出された場合は機能しません。micros()最初は動作しますが、1〜2ミリ秒後に不規則に動作し始めます。... どのようにmicros()違いますかmillis()(その精度の点を除きます)?上記の警告はmicros()、割り込みルーチン内での使用は常に悪い考えであることを意味していますか? コンテキスト- 低パルス占有率を測定したいので、入力信号が変化したときにルーチンをトリガーし、現在の時刻を記録する必要があります。

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
CTCモードでのtimer3の設定-サーボライブラリとの競合
1秒あたり800回関数を呼び出すためにタイマーを設定したいと思います。私は1024のプリスケーラーでArduino MegaとTimer3を使用しています。プリスケーラーファクターを選択するには、次の手順を検討しました。 CPU周波数:16MHz タイマー分解能:65536(16ビット) ^ 6 / 16x10:選択されたプリスケーラによって分周CPUのFREQ 1024 = 15625 残りを必要な周波数62500/800 = 19で割ります。 結果+ 1をOCR3レジスタに格納します。 次の表を使用して、TCCR3Bのレジスタを設定しました。 エラー コードをコンパイルすることは不可能です。これは、コンパイラによって返されるエラーです。 Servo \ Servo.cpp.o:関数 '__vector_32'内:C:\ Program Files(x86)\ Arduino \ libraries \ Servo / Servo.cpp:110:multiple definition of '__vector_32' AccelPart1_35.cpp.o:C:\プログラムファイル(x86)\ Arduino / AccelPart1_35.ino:457:最初にここで定義c:/ program files(x86)/ arduino / hardware / tools / avr / bin …

3
誰かが、タイマーのセットアップに使用されるこの奇妙なコードを説明できますか?
他の人が書いたスケッチを見ていると、次のようなコードに出会うことがあります。 TCCR1A = 0; TCCR1B = 0; TCNT1 = 34286; TCCR1B |= (1 << CS12); TIMSK1 |= (1 << TOIE1); 私が知っているのは、それがタイミング/タイマーと関係があることです(私はそう思います)。このようにコードを解読(および作成)するにはどうすればよいですか?どのようなものがありTCCR1A、TCCR1B、TCNT1、CS12、TIMSK1、とTOIE1?

4
24時間ごとにタイマーでArduinoをオンにする
私は現在、1日1回、ESP8266を介して車のバッテリーの充電量を送信するArduinoプロジェクトに取り組んでいます。冬の間は車を運転せず、バッテリーが臨界値を下回ったときに通知を受けたいので、充電して損傷を防ぐことができます。 したがって、エネルギー効率はプロジェクトにとって重要であり、バッテリー自体を放電しません。スリープモード、効率的なドロップダウンレギュレーターなどについてよく読みます。これらすべてに共通して、電圧レギュレーターは常に実行されているので、これは私が望んでいることではありません。 なんらかの「スイッチオンタイマー回路」を探しています。24時間カウントダウンしてから、電圧レギュレータを電源に接続するリレーまたはMOSFETをオンにして、ArduinoとESP8266をオンにします。Arduinoが送信を完了すると、タイマーをリセットし、電圧レギュレータを電源から切断します。もちろん、タイマー回路はごくわずかな電力しか使わないはずです。 誰かがそのような回路を知っていますか?私は思いついた言葉のすべてのバリエーションを使ってAliExpressを検索しましたが、成功しませんでした。あるいは、そのような回路を作成するために(簡単に)使用できるICでしょうか?
9 power  timers  relay 

6
非常に長いdelay()が可能ですか?
12時間ごとに開閉する小さなドアを開閉しようとしています。12時間delay()、delay(43 200 000 000)で小さなループスクリプトを作成できるかどうか疑問に思いました。私は推測する?しかし、それが可能であるか、推奨できるか、あるいはその両方であるかどうかはわかりません。いくつかのフィードバック/代替案(必要な場合)がいいでしょう:)

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 


5
Arduinoはどのようにして特定の(つまり56 kHz)キャリア周波数を出力できますか?
私は、2点間でデータをワイヤレスで送信するための自由空間光学プロジェクトに取り組んでいます。これを達成するために、送信機には56 kHzの搬送周波数でパルスするArduino Unoに接続されたIR LEDを使用し、受信機には56 kHzのIR検出器モジュールを持つ2番目のArduinoを使用しています。 キャリア周波数を作成するために、pin highコマンドとpin lowコマンドの間にdelayMicroseconds()を使用してみました。この種の方法は機能しますが、周波数は常に同じであるとは限らず、信号をパルスするための追加の遅延(つまり、関数を呼び出してデクリメントするのに必要な時間)によって、信号が変化する可能性があります。 ATmega328のデータシートを読むと、チップのタイマーを使用してより正確なパルスを設定する方法があるようです。それは可能ですか?可能であれば、タイマーを使用して56 kHzパルスをどのように作成しますか?

5
delayMicrosecondsをより正確にできますか?
私はDMXデータをビットバンにしようとしています、そしてそれは4usパルスを必要とします。Arduinoの遅延がどれほど優れているかを確認するために確認している結果にはあまり運がありません...かなりひどいようです。 ここに私がした簡単な小さなテストがあります: unsigned long ptime; void setup() { Serial.begin(9600); } void loop() { ptime = micros(); delayMicroseconds(4); Serial.println(micros() - ptime); delay(1000); //just to keep the serial monitor from going nuts } そして結果: 8 4 8 4 4 4 4 4 8 8 8 8 4 8 8 4 4 8 …

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 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.