#include "iodefine.h"
#include "intENC_rx220.h"

#define KEY_PRCR 0xA500	//プロテクト解除で使用するキー 0xA5 固定
#define PRCR_CLK 0x0001	//クロック関連
#define PRCR_MOD 0x0002	//動作モード、消費電力低減機能、ソフトウェアリセット関連
#define PRCR_LVD 0x0008	//LVD関連
#define PRCR_ALL (PRCR_CLK|PRCR_MOD|PRCR_LVD)	//全て

#define PROTECTOFF		(KEY_PRCR|PRCR_CLK|PRCR_MOD)
#define PROTECTON		(KEY_PRCR)
#define PFSPROTECTOFF	0x40u
#define PFSPROTECTON	0x80u

//エンコーダ入力初期化
void init_ENC()	//init_MTUの後で実行すると有効になる
{
	PORTA.PDR.BIT.B4 = 0x00;	//PA4 入力
	PORTA.PDR.BIT.B6 = 0x00;	//PA6 入力
	PORTC.PDR.BIT.B4 = 0x00;	//PC4 入力
	PORTC.PDR.BIT.B5 = 0x00;	//PC5 入力

	PORTA.PMR.BIT.B4 = 1;	//周辺機能として使用
	PORTA.PMR.BIT.B6 = 1;	//周辺機能として使用
	PORTC.PMR.BIT.B4 = 1;	//周辺機能として使用
	PORTC.PMR.BIT.B5 = 1;	//周辺機能として使用

	//プルアップ機能 2019/02/25追加
	//PORTA.PCR.BIT.B4=1;				//PA4をプルアップ
	//PORTA.PCR.BIT.B6=1;				//PA6をプルアップ
	//PORTC.PCR.BIT.B4=1;				//PC4をプルアップ
	//PORTC.PCR.BIT.B5=1;				//PC5をプルアップ
	
	//特殊機能設定
	MPC.PWPR.BIT.B0WI = 0;			//PFSレジスタの保護解除をするPFSWEレジスタの保護解除
	MPC.PWPR.BIT.PFSWE = 1;			//PFSレジスタの保護解除

	//Pxx 端子機能制御レジスタ（PxxPFS）
	MPC.PA4PFS.BIT.PSEL = 0x2u;		//MTCLKA
	MPC.PA6PFS.BIT.PSEL = 0x2u;		//MTCLKB
	MPC.PC4PFS.BIT.PSEL = 0x2u;		//MTCLKC
	MPC.PC5PFS.BIT.PSEL = 0x2u;		//MTCLKD

	MPC.PWPR.BIT.PFSWE = 0;			//PFSレジスタの保護;
	MPC.PWPR.BIT.B0WI = 1;			//PFSレジスタの保護をするPFSWEレジスタの保護

	SYSTEM.PRCR.WORD = PROTECTOFF;	//プロテクト解除
	MSTP(MTU) = 0x0;	// MTUモジュール停止解除
	SYSTEM.PRCR.WORD = PROTECTON;	//プロテクト

	//カウント停止
	MTU.TSTR.BIT.CST1 = 0x0u;
	MTU.TSTR.BIT.CST2 = 0x0u;

	//カウンタの同期解除
	MTU.TSYR.BIT.SYNC1=0;
	MTU.TSYR.BIT.SYNC2=0;

	//位相計数モード
	MTU1.TMDR.BYTE = 0x04u;	
	MTU2.TMDR.BYTE = 0x04u;	

	//同期クリア禁止
	MTU1.TCR.BIT.CCLR = 0;
	MTU2.TCR.BIT.CCLR = 0;

	//カウント値クリア
	MTU1.TCNT = 0;
	MTU2.TCNT = 0;

	//カウント開始
	MTU.TSTR.BIT.CST1 = 0x1u;
	MTU.TSTR.BIT.CST2 = 0x1u;

}

//エンコーダの値取得
unsigned short get_enc(short port)
{
	if(port==0)
		return MTU1.TCNT;
	else if(port==1)
		return MTU2.TCNT;
	else
		return -1;
}