dsPIC30F4012でQEI設定を行う(エラッタ対策)

dsPIC30F4012のQEI設定を行いました。

データシートは

dsPIC30F4012 In Production

www.microchip.com

より

dsPIC30F4011/4012 Data Sheet

ですが、簡素すぎるのでより詳しい情報は
dsPIC30F Family Reference Manual

を参照します。

日本語資料として、

日本語資料www.microchip.co.jp

より

dsPIC33F/PIC24H ファミリ リファレンス マニュアル、セクション 15. 直交エンコーダ インターフェイス(QEI)

も参考になります。

dsPIC30F ファミリ リファレンスマニュアル 高性能デジタルシグナルコントローラー

はDFLTCONレジスタにIMV<1:0>ビットの記述がありません。


資料を参考に
・x4直行モード
・デジタルフィルタなし
・MAXCNTによる位置カウンタのリセット
に設定しました。

テスト動作をしてみると、位置カウンタのロールオーバー/アンダーフロー時に割り込みが発生していません。
コードは単純なのに~と考える事小一時間…
ハードウェア絡みの問題を考えてエラッタを見てみると…

dsPIC30F4011/4012 Family Silicon Errata and Data Sheet Clarification

p11を見ると、

f:id:ma2-tech:20170412131234p:plain

どおりで割り込みが発生しないはずです

MAXCNTを0xFFFFから変更して無事動作しました。
テストコードは以下のとおり。

long poscnt_h = 0;

// --- QEIモジュールの初期化 ---
void InitalQEI(void)
{
    ADPCFGbits.PCFG4 = 1;       // QEAとQEBをデジタル入力ピンに設定
    ADPCFGbits.PCFG5 = 1;

    QEICON = 0;                 // QEICONレジスタクリア
    QEICONbits.QEIM = 7;        // 直行エンコーダインターフェースモード選択
                                //   7:x4モード,MAXCNTリセットモード

    DFLTCON = 0;                // DFLTCONレジスタクリア
                                //   デジタルフィルタ使用しないので設定なし

    POSCNT = 0;
    MAXCNT = 0x7FFF;            // 0xFFFFに設定すると割り込み発生しない(エラッタ)

    IFS2bits.QEIIF = 0;         // QEIIFイベント割り込みフラグステータスクリア
    IPC10bits.QEIIP = 4;        // QEIイベント割り込み優先度設定(7~0)
    IEC2bits.QEIIE = 1;         // QEIイベント割り込みイネーブル
}

// --- QEIイベント割り込み ---
void __attribute__((interrupt, shadow, auto_psv)) _QEIInterrupt(void)
{
    if ( QEICONbits.UPDN )  poscnt_h += 0x8000;
    else                    poscnt_h -= 0x8000;

    IFS2bits.QEIIF = 0;
}

// --- QEI位置カウンタ取得 ---
// マクロ実装の場合
// extern long poscnt_h;
// #define GetPosition()    (poscnt_h | POSCNT)
long GetPosition(void)
{
    return (poscnt_h | POSCNT);
}