PSoC でやってはいけないこと

MIDI/CV の回路の動作確認をしながら PSoC の使い方に少しずつ慣れてゆこうとしていますが、何回か誤動作にあいました。やってしまいがちでわかりにくく危なっかしい問題を一つ紹介します。

それは、「DAC に範囲外の値を入れてはいけない」ということです。一つ例を。

以下のブロックダイアグラムで、DVAC_Velocity_1 は 9bit DAC で、データの範囲は 0 – 1FE です。

モジュールの設定で範囲外の値を入れようとしてもエラーではじかれてしまいますが

ファームウェアから強引に DAC 値を入れると入ることは入ってしまいます。以下は実験用のプログラムです。ロータリーエンコーダの値を読み取っては 7 セグメントに表示してから DAC に設定しています。

    int16_t prev_counter_value = 0;
    uint32_t wrap_count = 0;

    for(;;)
    {
        int16_t counter_value = QuadDec_GetCounter();
        if (counter_value != prev_counter_value) {
            LED_Driver_1_Write7SegNumberHex(counter_value, 0, 3, LED_Driver_1_RIGHT_ALIGN);
            DVDAC_Velocity_1_SetValue(counter_value);
        }
        prev_counter_value = counter_value;
        if (++wrap_count == 100000) {
            Pin_LED_Write(Pin_LED_Read() ^ 1);
            wrap_count = 0;
        }
    }
C

以下の動画では、DAC 値が範囲を超えるとプロセッサの動作が停止して LED の点滅が止まってしまいます。こうなるとリセットをしない限り何をしても応答しません。何の防御もかからずいきなり止まってしまうのでファームウェアを組む際には範囲を超えた値を入れないよう細心の注意を払う必要があります。

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.