dsPIC33AKシリーズ⑬I/Oインテグリティモニターモジュールの使い方

dsPIC33Aシリーズ

概要

今回は、dsPIC33AKシリーズに新搭載されたI/Oインテグリティモニタ(以下IOIM)モジュールの使い方をご紹介します。
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インテグリティモニタモジュールの使い方
(fig.1-1)各関連記事リンク

開発環境

開発環境を以下に示します。
今回はどちらのCPUボードでも動作いたします。

項目リンク
ベースボードdsPIC33A CURIOSITY PLATFORM
DEVELOPMENT BOARD
dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com)
CPUボード(EV68M17A)EV68M17A – dsPIC33AK128MC106 Motor Control DIMdsPIC33AK128MC106 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.20MPLAB® X IDE | Microchip Technology
コンパイラMPLAB XC DSC v3.10MPLAB® XC DSC Compiler | Microchip Technology
(fig.2-1)本記事の動作確認環境
(fig.2-2)動作環境

IOIMモジュールブロック図

以下にIOIMモジュールのブロック図を示します。

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

(fig.3-1)I/Oインテグリティモニタ内部ブロック図(70005539B – p.481より抜粋)

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

(fig.3-2)外部接続(70005539B – p.553より抜粋)

IOIMレジスタ

以下にIOIMレジスタとその説明を示します。

レジスタ名(xは1~4)ビット名説明
IOIMxCONFLTINJフォルト注入ビット
OKINJOK注入ビット
TESTENテストモード
EOVFVエラーカウンタオーバフロー
ONモジュール有効化
SLPENスリープモード動作
SIDLIDLEモード動作
EXTCLK外部クロック選択
FBKSELF/B入力選択
REFSELREF入力選択
IOIMxBCONBLANKブランキングタイマー
IOIMxSTATERRCNTエラーカウントビット
FFEDGEF/B下降エッジステータス
FREDGEF/B上昇エッジステータス
REFEDGEREF下降エッジステータス
RREDGE上昇エッジステータス
OVFカウンターオーバーフロー
ERRエラービット
OKOKビット
(fig.4-1)IOIMレジスタ

動作確認

(fig.5-1)に示すように、IOMD0ピンの出力(REF入力)とIOMF11ピン(F/B入力)をジャンパワイヤで接続します。通常であればIOMD0 = IOMF11 となりフォルトは発生しません。
この状態でジャンパワイヤを外すとエラーを検知するかを試してみます。

また割り込み開始前に正常に動作するか、もしくは異常を検知するかのセルフチェックも行います。

(fig.5-1)CPUボード結線図

ソースコード

インクルードファイル

コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。

■コンフィグレーションファイル (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();
	}
	
}

結果

ジャンパワイヤを断線させると割り込みが発生し、異常を正常に検知できることが確認できました。

記事についての注意点

本記事は慎重に内容を検討し正確さに努めておりますが、内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント

タイトルとURLをコピーしました