1

生のセンサー データの配列を含む UART メッセージを受信して​​います。プログラムのメインループ内でメッセージを読んでいます。PIC が異なる値を処理するために必要なことが 2 つあります。それを LCD に表示し (多少時間がかかります)、少なくとも値の 1 つについて、その値に応じて PORTD に接続された LED バーを変更します (かなり単純です)。

メインループでは、これが私の現在の作業方法です:

  • UART で外部デバイスからセンサー データを要求する
  • 外部デバイスからバイト配列を受信
  • 生のセンサーデータを実際の値/単位に変換する計算を行う
  • 次のコードを使用して、LCD バーに RPM 値を表示します。

     if (RPM < 99)
     {
       PORTD = 0;
     }
    
     if (RPM > 100)
     {
       PORTD = 0x01;
     }
    
     if (RPM > 2400)
     {
       PORTD = 0x03;
     }
    
     if (RPM > 3700)
     {
       PORTD = 0x07;
     }
    
     if (RPM > 4900)
     {
       PORTD = 0x0F;
     }
    
     if (RPM > 6200)
     {
       PORTD = 0x1F;
     }
    
     if (RPM > 7400)
     {
       PORTD = 0x3F;
     }
    
     if (RPM > 8700)
     {
       PORTD = 0x7F;
     }
    
     if (RPM > 10000)
     {
       PORTD = 0xFF;
     }
    
  • 最後に、LCD に複数の値を表示します。したがって、古い値を削除し、ラベルを描画し、新しい値を設定して、再度ラベルを描画します。

その最後のタスクはループ全体を遅くし、LED バーの機能を「遅延」させます。不必要な描画を避けるために、ラベルを再描画する前に値が変更されたかどうかを確認するよう提案されました。しかし、すべての値は、RPM などのようにかなり急速に変化する値です。

どんな提案でも大歓迎です!!

4

2 に答える 2

2

ディスプレイに送られるデータは、視聴者が感知できるよりも速く変化する必要はありません。変更がしきい値 (40 ~ 100 Hz) より大きい場合は、前の期間に発生した最後の変更のみを使用します。

int UpdateValue;
int UpdateNeeded = 0;

void TimerServiceRountine() { // called at N (60) Hz.
  if (UpdateNeeded) {
    UpdateNeeded = 0;
    UpdateLCD(UpdateValue);
  }
  // ...
}

// Call this with each RPM
void UpdateDisplay(int Value) {
  UpdateValue = Value;
  UpdateNeeded = 1;
}

さらなる改良: UpdateLCD(x)x が以前と異なる場合にのみ呼び出します。

于 2013-06-04T16:27:15.813 に答える