概要
今回は、dsPIC33AKシリーズに新搭載されたI/Oインテグリティモニタ(以下IOIM)モジュールの使い方をご紹介します。
IOIMは基準信号とフィードバック信号を比較し、不一致が有った場合にエラーイベントを発生させます。これによりマイコンや周辺素子の故障による異常を検出します。
・安全性に敏感なアプリケーションを構築する顧客の保護を強化する
・安全アプリケーションの構造テストを簡素化する
・構造テストを使用して、最終環境でピンが正しく接続されていることを確認する
今回は基本的な使い方を紹介します。
関連記事
| 記事 | リンク | |
| 第1回 | dsPIC33AKシリーズについて | dsPIC33Aシリーズに関して – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第2回 | 開発ボード、コンフィグレーション設定、クロック設定について | dsPIC33AKシリーズ②開発ボード,コンフィグレーション設定,クロック設定について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第3回 | CPU性能について | dsPIC33AKシリーズ③CPU性能について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第4回 | FPU性能について | dsPIC33AKシリーズ④FPU性能について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第5回 | DSPについて | dsPIC33AKシリーズ⑤DSPについて – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第6回 | タイマー1割り込みの使い方 | dsPIC33AKシリーズ⑥Timer1割り込みの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第7回 | PMUの使い方 | dsPIC33AKシリーズ⑦PMUの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第8回 | 高速ADCの使い方 | dsPIC33AKシリーズ⑧高速ADCの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第9回 | 高速OPAMPの使い方 | dsPIC33AKシリーズ⑨高速OPAMPの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第10回 | DMAモジュールの使い方 | dsPIC33AKシリーズ⑩DMAモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第11回 | WDTモジュールの使い方 | dsPIC33AKシリーズ⑪WDTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第12回 | DMTモジュールの使い方 | dsPIC33AKシリーズ⑫DMTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第13回(本記事) | I/Oインテグリティモニタモジュールの使い方 |
開発環境
開発環境を以下に示します。
今回はどちらのCPUボードでも動作いたします。
| 項目 | 値 | リンク |
| ベースボード | dsPIC33A CURIOSITY PLATFORM DEVELOPMENT BOARD | dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com) |
| CPUボード(EV68M17A) | EV68M17A – dsPIC33AK128MC106 Motor Control DIM | dsPIC33AK128MC106 Motor Control Dual In-Line Module (DIM) Information Sheet (microchip.com) |
| CPUボード(EV02G02A) | dsPIC33AK128MC106 General Purpose Dual In-Line Module (DIM) | dsPIC33AK128MC106 General Purpose Dual In-Line Module (DIM) | Microchip Technology |
| 統合開発環境 | MPLAB X IDE v6.20 | MPLAB® X IDE | Microchip Technology |
| コンパイラ | MPLAB XC DSC v3.10 | MPLAB® XC DSC Compiler | Microchip Technology |

IOIMモジュールブロック図
以下にIOIMモジュールのブロック図を示します。
基準ピンとフィードバックを比較し不一致の場合、エラービットをセットします。またブランキング時間を設定することも可能で、外部素子の遅延を補償します。
またIOIMモジュール自体の動作をテストするために、フォルト注入や正常動作の注入も可能となっています。

下記に基本的なアプリケーションの接続方法を示します

IOIMレジスタ
以下にIOIMレジスタとその説明を示します。
| レジスタ名(xは1~4) | ビット名 | 説明 |
| IOIMxCON | FLTINJ | フォルト注入ビット |
| OKINJ | OK注入ビット | |
| TESTEN | テストモード | |
| EOVFV | エラーカウンタオーバフロー | |
| ON | モジュール有効化 | |
| SLPEN | スリープモード動作 | |
| SIDL | IDLEモード動作 | |
| EXTCLK | 外部クロック選択 | |
| FBKSEL | F/B入力選択 | |
| REFSEL | REF入力選択 | |
| IOIMxBCON | BLANK | ブランキングタイマー |
| IOIMxSTAT | ERRCNT | エラーカウントビット |
| FFEDGE | F/B下降エッジステータス | |
| FREDGE | F/B上昇エッジステータス | |
| REFEDGE | REF下降エッジステータス | |
| RREDGE | 上昇エッジステータス | |
| OVF | カウンターオーバーフロー | |
| ERR | エラービット | |
| OK | OKビット |
動作確認
(fig.5-1)に示すように、IOMD0ピンの出力(REF入力)とIOMF11ピン(F/B入力)をジャンパワイヤで接続します。通常であればIOMD0 = IOMF11 となりフォルトは発生しません。
この状態でジャンパワイヤを外すとエラーを検知するかを試してみます。
また割り込み開始前に正常に動作するか、もしくは異常を検知するかのセルフチェックも行います。

ソースコード
インクルードファイル
コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。
■コンフィグレーションファイル (config.h)
■クロック設定ソースファイル(Clock_Driver.c)
■クロックヘッダーファイル(clock_driver.h)
ソースコード全体
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "config.h"
#include "clock_driver.c"
int main()
{
/*-----------------------------------------------------------------------*/
/*初期化*/
/*-----------------------------------------------------------------------*/
vdg_Clock_Set_Register();
TRISCbits.TRISC3 = 0u;
LATCbits.LATC3 = 1u;
IOIM1CONbits.ON = 0u;
IOIM1CONbits.REFSEL = 0u; //IOMD0ピン
IOIM1CONbits.FBKSEL = 11u; //IOMF11ピン
IOIM1CONbits.EOVFVAL = 12u;
IOIM1BCON = 50;
IOIM1STAT = 0;
IOIM1CONbits.ON = 1u;
/*-----------------------------------------------------------------------*/
/* OK注入テスト */
/*-----------------------------------------------------------------------*/
IOIM1CONbits.TESTEN = 3u;
IOIM1CONbits.OKINJ = 1u;
while (IOIM1STATbits.OK == 0){;}
IOIM1CONbits.OKINJ = 0u;
IOIM1STAT = 0x000u;
/*-----------------------------------------------------------------------*/
/* フォルト注入テスト */
/*-----------------------------------------------------------------------*/
IOIM1CONbits.TESTEN = 2u;
IOIM1CONbits.FLTINJ = 1u;
while (IOIM1STATbits.ERR == 0){;}
IOIM1CONbits.FLTINJ = 0u;
IOIM1CONbits.TESTEN = 0u;
IOIM1STAT = 0x000u;
/*-----------------------------------------------------------------------*/
/* 割り込み有効化 */
/*-----------------------------------------------------------------------*/
IFS8bits.IOM1IF = 0u;
IEC8bits.IOM1IE = 1u;
IPC35bits.IOM1IP = 5u;
INTCON1bits.GIE = 1u;
/*----------------------------------------------------------------------------*/
/*メインルーチン*/
/*----------------------------------------------------------------------------*/
while(1)
{
;
}
}
void __attribute__((interrupt, no_auto_psv)) _IOIM1Interrupt(void)
{
while(1)
{
Nop();
}
}
結果
ジャンパワイヤを断線させると割り込みが発生し、異常を正常に検知できることが確認できました。
記事についての注意点
本記事は慎重に内容を検討し正確さに努めておりますが、内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント