0

私は arduino プロジェクトで作業しています。タイマー割り込みとシリアル通信を使用しています。しかし、タイマー割り込みが arduino シリアル ライブラリ関数を有効にするとすぐに、この問題に悩まされています。これを行う方法はありますか。シリアル通信とタイマー割り込みを併用したいのですが、以下の機能を使用するとシリアル通信が停止します。

    void initialize()
    {
    //timer0
     TIMSK0 = 2;                             
     OCR0A = 125;                             
    TCCR0A = 0b00000010;   //commenting TCCR0A = 0b00000010; and  TIMSK1 = 1 ; enable
    TCCR0B = 0b00000011;   // the serial communications

    //timer1
    TCCR1B = 1 ;                                
   TIMSK1 = 1 ;                                         


   //timer2
     TCCR2A = _BV(COM2A0) | _BV(WGM21) | _BV(WGM20);
     TCCR2B = _BV(WGM22) | _BV(CS20);
    OCR2A = B11000111; 


     EICRA = 63 ;                                        
      EIMSK = (1 << INT0) | (1 << INT1);  
      }
4

2 に答える 2

1

Timer0 を直接使用することは避けます。ご覧のとおり、Arduinoコアライブラリを台無しにします。

一見すると、 SimpleTimer()などの実績のあるライブラリを使用することをお勧めします。「実行」が基本的にタイマー 0 から millis() をプルする複数のイベントをセットアップおよび管理します。ただし、さらに下を読んでください。

Timer0 は、割り込みを作成する 1K でオーバーランするようにコア ライブラリによって設定されていることを思い出します。micros() 関数は、ミリ秒割り込みの間に timer0 内の値を読み取ります。

Timer1 を使用するには、TimerOne()ライブラリを試すことができます。TimerTwo、3 などもあります。

Ken Shirriff のArduino-IRremoteライブラリを読みたいと思うかもしれません。個別の方法で、必要なことの多くを実行します。40Khz PWMなど。他のライブラリに依存するのではなく。彼の元のライブラリが使用する場所

USECPERTICK 50  // microseconds per clock interrupt tick

フレームをデコードするために、IR 復調器からの受信入力を読み取ってサンプリングします。

また、ピン変更割り込みを使用してより正確なピン変更を取得するため、microtherion のライブラリのフォークについても指摘します。彼のライブラリは、これらの割り込みを個別に管理します。

PinChangeInt ライブラリを使用して実装をセットアップできます。個々のピンが変化する場合、ISR はタイムスタンプをほぼ即座に取得できます。この場合、必要な解像度である 50 ミリ秒よりはるかに少ないマイナスのレイテンシ。

さらに解像度が必要な場合は、入力キャプチャ機能を使用できます。InputCapture.inoで示されているように。これにより、遷移の時間がリアルタイムでキャプチャされ、潜在的な処理のための ISR が生成されます。

これらの例から、超音波センサーを実装できるはずです。

于 2013-12-21T19:39:42.863 に答える
0

私は同じ問題を抱えていたので、次のことをお勧めします。

  1. ライブラリを使用しTimerOne()ます。

  2. タイマーでフラグを使用すると、プログラムした時間がいつ過ぎたかを制御できます。

  3. ループ関数では、 のみを使用する必要があるSerial.available()ため、時間は必要なものにできるだけ近くなります。

  4. ループ関数にコードを書きすぎないようにし、センサーの読み取りをスイッチまたは if 関数で制御します。

これは最善の解決策ではありませんが、機能します。プログラムされた時間に注意する必要があります。データの読み取りに費やされた時間よりも長くする必要があります。

于 2016-04-06T15:37:21.227 に答える