SH7144でAD変換をするプログラム。
わざわざBIT単位で指定しているので無駄に長くなっています。
AD_c.c
//==========
//#include "SH7144ENSHUU.c"
#include "iodefine.h"
#include "AD_convert.h"
void init_AD_c(void){
//A/D変換
MST.CR2.BIT._AD0=0; // A/D Conv 0ch スタンバイ解除
MST.CR2.BIT._AD1=0; // A/D Conv 1ch スタンバイ解除
//ADCR
AD0.ADCR.BIT.TRGE =0; //トリガによる開始は無効
AD0.ADCR.BIT.CKS =3; //クロック・セレクト
AD0.ADCR.BIT.ADST =0; //A/D停止
AD0.ADCR.BIT.ADCS =0; //0:1サイクルスキャン
//1:連続スキャン
//
AD1.ADCR.BIT.TRGE =0; //トリガによる開始は無効
AD1.ADCR.BIT.CKS =3; //クロック・セレクト
AD1.ADCR.BIT.ADST =0; //A/D停止
AD1.ADCR.BIT.ADCS =0; //0:1サイクルスキャン
//1:連続スキャン
//ADCSR
AD0.ADCSR.BIT.ADIE =1; //0:ADI割り込み禁止
//1:ADI割り込み許可
AD0.ADCSR.BIT.ADM = 1; //A/D動作モードセレクト //ADMとCHの組み合わせによってA/D変換する端子の組み合わせを決定します。
//0:シングルモード
//1:スキャンモード
AD0.ADCSR.BIT.CH = 3; //チャンネルセレクト1,0 //ADMとCHの組み合わせによってA/D変換する端子の組み合わせを決定します。
//
AD1.ADCSR.BIT.ADIE =1; //0:ADI割り込み禁止
//1:ADI割り込み許可
AD1.ADCSR.BIT.ADM = 1; //A/D動作モードセレクト //ADMとCHの組み合わせによってA/D変換する端子の組み合わせを決定します。
//0:シングルモード
//1:スキャンモード
AD1.ADCSR.BIT.CH = 3; //チャンネルセレクト1,0 //ADMとCHの組み合わせによってA/D変換する端子の組み合わせを決定します。
//割り込み優先レベル設定
INTC.IPRG.BIT._AD = 0x1;
}
get_AD_c(void){
int x;
AD0.ADCR.BIT.ADST=1; // A/D Start
while(AD0.ADCSR.BIT.ADF==0);//ADF(ADエンド・フラグ)が1になるのを待つ。
x=AD0.ADDR1.WORD >>6; //ADDR1を読み込み上位10ビットを切り出す。
AD0.ADCSR.BIT.ADF=0; //ADF(ADエンド・フラグ)をクリア
}
void start_AD0_c(void){AD0.ADCR.BIT.ADST=1;}
void start_AD1_c(void){AD1.ADCR.BIT.ADST=1;}
//A/D変換結果を格納する変数
unsigned short int AD_c_AN0;
unsigned short int AD_c_AN1;
unsigned short int AD_c_AN2;
unsigned short int AD_c_AN3;
unsigned short int AD_c_AN4;
unsigned short int AD_c_AN5;
unsigned short int AD_c_AN6;
unsigned short int AD_c_AN7;
//移動先を格納する変数
int goto_AD0;
int goto_AD1;
int goto_AD2;
int goto_AD3;
int goto_AD4;
int goto_AD5;
int goto_AD6;
int goto_AD7;
long y;
//割り込み処理
//intprg.cの136,137をコメントアウト
// 136 A/D ADI0
#pragma interrupt INT_ADI0
void INT_ADI0(void){
/*
AD_c_AN0 = AD0.ADDR0.WORD >>6;//ADDR0を読み込み上位10ビットを切り出す。
AD_c_AN1 = AD0.ADDR1.WORD >>6;//ADDR1を読み込み上位10ビットを切り出す。
AD_c_AN2 = AD0.ADDR2.WORD >>6;//ADDR2を読み込み上位10ビットを切り出す。
AD_c_AN3 = AD0.ADDR3.WORD >>6;//ADDR3を読み込み上位10ビットを切り出す。
*/
AD_c_AN0 = AD0.ADDR0.WORD >>8;//ADDR0を読み込み上位8ビットを切り出す。
AD_c_AN1 = AD0.ADDR1.WORD >>8;//ADDR1を読み込み上位8ビットを切り出す。
AD_c_AN2 = AD0.ADDR2.WORD >>8;//ADDR2を読み込み上位8ビットを切り出す。
AD_c_AN3 = AD0.ADDR3.WORD >>8;//ADDR3を読み込み上位8ビットを切り出す。
AD0.ADCSR.BIT.ADF=0;//ADF(ADエンド・フラグ)をクリア
}
//
AD0.ADCSR.BIT.ADF=0;//ADF(ADエンド・フラグ)をクリア
}
// 137 A/D ADI1
#pragma interrupt INT_ADI1
void INT_ADI1(void){
/*
AD_c_AN4 = AD1.ADDR4.WORD >>6;//ADDR4を読み込み上位10ビットを切り出す。
AD_c_AN5 = AD1.ADDR5.WORD >>6;//ADDR5を読み込み上位10ビットを切り出す。
AD_c_AN6 = AD1.ADDR6.WORD >>6;//ADDR6を読み込み上位10ビットを切り出す。
AD_c_AN7 = AD1.ADDR7.WORD >>6;//ADDR7を読み込み上位10ビットを切り出す。
*/
AD_c_AN4 = AD1.ADDR4.WORD >>8;//ADDR4を読み込み上位8ビットを切り出す。
AD_c_AN5 = AD1.ADDR5.WORD >>8;//ADDR5を読み込み上位8ビットを切り出す。
AD_c_AN6 = AD1.ADDR6.WORD >>8;//ADDR6を読み込み上位8ビットを切り出す。
AD_c_AN7 = AD1.ADDR7.WORD >>8;//ADDR7を読み込み上位8ビットを切り出す。
AD1.ADCSR.BIT.ADF=0;//ADF(ADエンド・フラグ)をクリア
}
//========================
AD_c.h
//=================
extern void init_AD_c(void);
extern void start_AD0_c(void);
extern void start_AD1_c(void);
extern unsigned short int AD_c_AN0;
extern unsigned short int AD_c_AN1;
extern unsigned short int AD_c_AN2;
extern unsigned short int AD_c_AN3;
extern unsigned short int AD_c_AN4;
extern unsigned short int AD_c_AN5;
extern unsigned short int AD_c_AN6;
extern unsigned short int AD_c_AN7;
このブログのSH7144F関連記事トップ
http://the-united-front.blogspot.jp/2013/09/interface-20066sh7144f-blog-1-2012810.html
2012年9月13日木曜日
sh7144で8本(8相)のPWMを出力するプログラム。(停止させる関数以外動作確認済み。)
interface誌の基盤だと、出力ピンをプルアップしているところをパターンカットして、DBGMD=HとなっているところをDBGMD=L(GNDに落とす)必要があります。
pwm.c
//===================
#include <machine.h>
#include "iodefine.h"
void init_pwm(void)//PWM初期化関数
{
//マルチファンクションタイマパルスユニット(MTU)を用いてpwmを出力する。
MST.CR2.BIT._MTU = 0;//スタンバイ解除
//ピンファンクションコントローラで端子を初期化する。========
//PWMモード1で出力端子に指定できる端子は最初から決められています。詳細はハードウェアマニュアルの
//「11.4.5 PWMモード」の「表11.31 格PWM出力のレジスタと出力端子」を参照して下さい。
//
//つまり、これに合わせてIOを端子を初期化します。
//ポートコントロールレジスタで機能選択。
//チャンネル4(PWM2本出力可能)
//PFC.PECRL1.BIT.PE15MD=1; //TIOC4D
PFC.PECRL1.BIT.PE14MD=1; //TIOC4C
//PFC.PECRL1.BIT.PE13MD=1; //TIOC4B
PFC.PECRL1.BIT.PE12MD=1; //TIOC4A(SCI_TXD3)
//チャンネル3(PWM2本出力可能)
//PFC.PECRL1.BIT.PE11MD=1; //TIOC3D(SCI_RXD3)3
PFC.PECRL1.BIT.PE10MD=1; //TIOC3C(SCI_TXD2)
//PFC.PECRL1.BIT.PE9MD=1; //TIOC3B(SCI_SCK3)3
PFC.PECRL1.BIT.PE8MD=1; //TIOC3A(SCI_SCK2)
//チャンネル2(PWM1本出力可能)
//PFC.PECRL2.BIT.PE7MD=1; //TIOC2B(SCI_RXD2)2
PFC.PECRL2.BIT.PE6MD=1; //TIOC2A(SCI_SCK3)
//チャンネル1(PWM1本出力可能)
//PFC.PECRL2.BIT.PE5MD=1; //TIOC1B(SCI_TXD3)3
PFC.PECRL2.BIT.PE4MD=1; //TIOC1A(SCI_RXD3) //E10A使用時(DBGMD=H 時)はTCK入力に固定されます。
//チャンネル0(PWM2本出力可能)
//PFC.PECRL2.BIT.PE3MD=1; //TIOC0D //E10A使用時(DBGMD=H 時)はTDO入力に固定されます。
PFC.PECRL2.BIT.PE2MD=1; //TIOC0C //E10A使用時(DBGMD=H 時)はTDI入力に固定されます。
//PFC.PECRL2.BIT.PE1MD=1; //TIOC0B //E10A使用時(DBGMD=H 時)はTRST入力に固定されます。
PFC.PECRL2.BIT.PE0MD=1; //TIOC0A //E10A使用時(DBGMD=H 時)はTMS入力に固定されます。
//----------------------------------------------------------
//ポートIOレジスタで端子の入出力方向を決める。
//出力に設定
//チャンネル4(PWM2本出力可能)
//PFC.PEIORL.BIT.B15=1; //TIOC4D//JP2-19
PFC.PEIORL.BIT.B14=1; //TIOC4C//JP2-18//OK
//PFC.PEIORL.BIT.B13=1; //TIOC4B//JP2-17
PFC.PEIORL.BIT.B12=1; //TIOC4A//JP2-16
//チャンネル3(PWM2本出力可能)
//PFC.PEIORL.BIT.B11=1; //TIOC3D//JP2-15
PFC.PEIORL.BIT.B10=1; //TIOC3C//JP2-14//OK
//PFC.PEIORL.BIT.B9=1; //TIOC3B//JP2-13
PFC.PEIORL.BIT.B8=1; //TIOC3A//JP2-12//OK
//チャンネル2(PWM1本出力可能)
//PFC.PEIORL.BIT.B7=1; //TIOC2B
PFC.PEIORL.BIT.B6=1; //TIOC2A//JP2-10//OK
//チャンネル1(PWM1本出力可能)
//PFC.PEIORL.BIT.B5=1; //TIOC1B
PFC.PEIORL.BIT.B4=1; //TIOC1A//JP3-1
//チャンネル0(PWM2本出力可能)
//PFC.PEIORL.BIT.B3=1; //TIOC0D
PFC.PEIORL.BIT.B2=1; //TIOC0C//JP3-6
//PFC.PEIORL.BIT.B1=1; //TIOC0B
PFC.PEIORL.BIT.B0=1; //TIOC0A//JP3-5
//==========================================================
//タイマコントロールレジスタ(TCR)の設定
//カウンタクリア(CCLR)の設定
//カウンタをクリアする条件を指定する。
//「TGRAのコンペアマッチインプットキャプチャでTCNTクリア」に指定。
MTU0.TCR.BIT.CCLR = 1;
MTU1.TCR.BIT.CCLR = 1;
MTU2.TCR.BIT.CCLR = 1;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
MTU3.TCR.BIT.CCLR = 1;
MTU4.TCR.BIT.CCLR = 1;
//カウンタクリア要因を選択
//クロックエッジ(CKEG)の選択
//00:立上がりエッジでカウント
//01:立下りエッジでカウント
//1X:両エッジでカウント
//【記号説明】X:Don't care
MTU0.TCR.BIT.CKEG = 1;
MTU1.TCR.BIT.CKEG = 1;
MTU2.TCR.BIT.CKEG = 1;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
MTU3.TCR.BIT.CKEG = 1;
MTU4.TCR.BIT.CKEG = 1;
//カウンタクロックを選択
//タイマプリスケーラ(TPSC)の設定
//0:内部クロック:Pφ/1でカウント
//1:内部クロック:Pφ/4でカウント
//2:内部クロック:Pφ/16でカウント
//3:内部クロック:Pφ/64でカウント
//4:
//5: チャンネルにより様々。
//6:
//7:
MTU0.TCR.BIT.TPSC = 0;
MTU1.TCR.BIT.TPSC = 0;
MTU2.TCR.BIT.TPSC = 0;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
MTU3.TCR.BIT.TPSC = 0;
MTU4.TCR.BIT.TPSC = 0;
//タイマーステータスレジスタ(TSR)の設定
//タイマジェネラルレジスタ(TGA)の設定
//TGRの8ビット単位でのアクセスは禁止です。常に16ビット単位でアクセスしてください。
//TGRは16ビットレジスタです。(つまり最大で0xFFFF)
//
// φ:システムクロック
//Pφ:周辺クロック
//
//MTUのクロックPφ[MHz](ex:24MHz)
//プリスケーラP(ex:P=16のときはPφ/16でカウントするという意味)
//のとき周期T[ms](ex:T=20ms)
//を作るのに必要なTGRAの値は
//TGRA=T*Pφ/P
// =20[ms]*24MHz/16
// =(20*10^(-3))*(24*10^6)/16
// =30000
//注意:[CCLR]で両エッジでカウントする様に指定した場合は2倍のカウントが必要です。
//TGRA=T*Pφ/P
// =(10^(-5))*(24*10^(6))/1
// =240
// =0xF0
//パルス周期を設定します。
MTU0.TGRA = 0x00F0;
MTU1.TGRA = 0x00F0;
MTU2.TGRA = 0x00F0;//はiodefine.hに定義されていない。MUTと同じ構造体だから一緒に書いてるっぽい?
MTU3.TGRA = 0x00F0;
MTU4.TGRA = 0x00F0;
MTU0.TGRC = 0x00F0;
MTU3.TGRC = 0x00F0;
MTU4.TGRC = 0x00F0;
//デューテー値を設定する。
//1:1 50% 0x0078
//2:1 66.66・・・% 0x00A0
//3:1 75% 0x0084
//4:1 80% 0x00C0
//5:1 83% 0x00C8
MTU0.TGRB = 0x0078;//
MTU1.TGRB = 0x00A0;//
MTU2.TGRB = 0x0084;
MTU3.TGRB = 0x00C0;
MTU4.TGRB = 0x00C8;
MTU0.TGRD = 0x8000;
MTU3.TGRD = 0x8000;
MTU4.TGRD = 0x8000;
//タイマアウトプットマスタイネーブルレジスタ(TOER)
//TOERは出力端子のTIOC4D、TIOC4C、TIOC3D、TIOC4B、TIOC4A、TIOC4Bの出力端子の許可/禁止を行います。
//0:MTU出力禁止
//1:MTU出力許可
MTU.TOER.BIT.OE4A=1;
//MTU.TOER.BIT.OE4B=1;
MTU.TOER.BIT.OE4C=1;
//MTU.TOER.BIT.OE4D=1;
//MTU.TOER.BIT.OE3B=1;
//MTU.TOER.BIT.OE3D=1;
//タイマI/Oコントロールレジスタ(TIOR)
//TIORのIOB3~IOB0はTGRBの機能を設定します。
// 周期:TGRA --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRB --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//
// 周期:TGRC --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRD --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//7~4ビット
//チャンネル0
MTU0.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC0B
MTU0.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC0D
//チャンネル1
MTU1.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC1B
//チャンネル2
MTU2.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC2B
//チャンネル3
MTU3.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC3B
MTU3.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC3D
//チャンネル4
MTU4.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC4B
MTU4.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC4D
//3~0ビット
//チャンネル0
MTU0.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC0A
MTU0.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC0C
//チャンネル1
MTU1.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC1A
//チャンネル2
MTU2.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC2A
//チャンネル3:
MTU3.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC3A
MTU3.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC3C
//チャンネル4
MTU4.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC4A
MTU4.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC4C
//タイマモードレジスタ(TMDR)
//[BFB]0:TGRBとTGRDは通常動作
// 1:TGRBとTGRDはバッファ動作
//[BFA]0:TGRAとTGRCは通常動作
// 1:TGRCとTGRCはバッファ動作
//バッファ動作とは二つのレジスタを組み合わせて32ビットのカウンタにする事だと思う。
//[MD]タイマの動作モードを指定します。
//
//今回は全てPWMモード1で設定します。
//
//PWMモード1で出力端子に指定できる端子は最初から決められています。詳細はハードウェアマニュアルの
//「11.4.5 PWMモード」の「表11.31 格PWM出力のレジスタと出力端子」を参照して下さい。
//
//PWMモード2は他のジェネラルレジスタと同期させることでPWMを最大12本出力することができます。
//チャンネル0
MTU0.TMDR.BIT.BFB = 0;
MTU0.TMDR.BIT.BFA = 0;
MTU0.TMDR.BIT.MD = 2;
//チャンネル1
//MTU1.TMDR.BIT.BFB//TGRDを持たないチャンネル1、2ではこのビットはリザーブビットになります。
//MTU1.TMDR.BIT.BFA//TGRCを持たないチャンネル1、2ではこのビットはリザーブビットになります。
MTU1.TMDR.BIT.MD = 2;
//チャンネル2
//MTU2.TMDR.BIT.BFB//TGRDを持たないチャンネル1、2ではこのビットはリザーブビットになります。
//MTU2.TMDR.BIT.BFA//TGRCを持たないチャンネル1、2ではこのビットはリザーブビットになります。
MTU2.TMDR.BIT.MD = 2;
//チャンネル3:
MTU3.TMDR.BIT.BFB = 0;
MTU3.TMDR.BIT.BFA = 0;
MTU3.TMDR.BIT.MD = 2;
//チャンネル4
MTU4.TMDR.BIT.BFB = 0;
MTU4.TMDR.BIT.BFA = 0;
MTU4.TMDR.BIT.MD = 2;
}
void pwm_start(void){//PWMを出力する
//タイマスタートレジスタ(TSTR)
//[CST]0:カウント動作は停止
// 1:カウント動作
MTU.TSTR.BIT.CST4 = 1;
MTU.TSTR.BIT.CST3 = 1;
MTU.TSTR.BIT.CST2 = 1;
MTU.TSTR.BIT.CST1 = 1;
MTU.TSTR.BIT.CST0 = 1;
}
void pwm_stop_1(void){
//発信を止めるには、「ハードウェアマニュアル 11.3.8 タイマスタートレジスタ(TSTR)」を参照すると、
//1:CSTに0をライトする。
//2:TIORに初期出力が0になるようにライトする。
//やってみてないから良く分からないが、1:だけだと多分TCNTのカウントを一時的に停止するだけなので
//出力レベルは保持されるのではないだろうか?
//タイマスタートレジスタ(TSTR)
//[CST]0:カウント動作は停止
// 1:カウント動作
MTU.TSTR.BIT.CST4 = 0;
MTU.TSTR.BIT.CST3 = 0;
MTU.TSTR.BIT.CST2 = 0;
MTU.TSTR.BIT.CST1 = 0;
MTU.TSTR.BIT.CST0 = 0;
}
void pwm_stop_2(void){
//タイマI/Oコントロールレジスタ(TIOR)
//TIORのIOB3~IOB0はTGRBの機能を設定します。
// 周期:TGRA --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRB --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//
// 周期:TGRC --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRD --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//7~4ビット
//チャンネル0
MTU0.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC0B
MTU0.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC0D
//チャンネル1
MTU1.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC1B
//チャンネル2
MTU2.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC2B
//チャンネル3
MTU3.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC3B
MTU3.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC3D
//チャンネル4
MTU4.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC4B
MTU4.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC4D
//3~0ビット
//チャンネル0
MTU0.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC0A
MTU0.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC0C
//チャンネル1
MTU1.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC1A
//チャンネル2
MTU2.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC2A
//チャンネル3:
MTU3.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC3A
MTU3.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC3C
//チャンネル4
MTU4.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC4A
MTU4.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC4C
}
//=============================
pwm.h
//========================
extern void init_pwm(void);
extern void pwm_start(void);
extern void pwm_stop_1(void);
extern void pwm_stop_2(void);
//=========================
このブログのSH7144F関連記事トップ
http://the-united-front.blogspot.jp/2013/09/interface-20066sh7144f-blog-1-2012810.html
interface誌の基盤だと、出力ピンをプルアップしているところをパターンカットして、DBGMD=HとなっているところをDBGMD=L(GNDに落とす)必要があります。
pwm.c
//===================
#include <machine.h>
#include "iodefine.h"
void init_pwm(void)//PWM初期化関数
{
//マルチファンクションタイマパルスユニット(MTU)を用いてpwmを出力する。
MST.CR2.BIT._MTU = 0;//スタンバイ解除
//ピンファンクションコントローラで端子を初期化する。========
//PWMモード1で出力端子に指定できる端子は最初から決められています。詳細はハードウェアマニュアルの
//「11.4.5 PWMモード」の「表11.31 格PWM出力のレジスタと出力端子」を参照して下さい。
//
//つまり、これに合わせてIOを端子を初期化します。
//ポートコントロールレジスタで機能選択。
//チャンネル4(PWM2本出力可能)
//PFC.PECRL1.BIT.PE15MD=1; //TIOC4D
PFC.PECRL1.BIT.PE14MD=1; //TIOC4C
//PFC.PECRL1.BIT.PE13MD=1; //TIOC4B
PFC.PECRL1.BIT.PE12MD=1; //TIOC4A(SCI_TXD3)
//チャンネル3(PWM2本出力可能)
//PFC.PECRL1.BIT.PE11MD=1; //TIOC3D(SCI_RXD3)3
PFC.PECRL1.BIT.PE10MD=1; //TIOC3C(SCI_TXD2)
//PFC.PECRL1.BIT.PE9MD=1; //TIOC3B(SCI_SCK3)3
PFC.PECRL1.BIT.PE8MD=1; //TIOC3A(SCI_SCK2)
//チャンネル2(PWM1本出力可能)
//PFC.PECRL2.BIT.PE7MD=1; //TIOC2B(SCI_RXD2)2
PFC.PECRL2.BIT.PE6MD=1; //TIOC2A(SCI_SCK3)
//チャンネル1(PWM1本出力可能)
//PFC.PECRL2.BIT.PE5MD=1; //TIOC1B(SCI_TXD3)3
PFC.PECRL2.BIT.PE4MD=1; //TIOC1A(SCI_RXD3) //E10A使用時(DBGMD=H 時)はTCK入力に固定されます。
//チャンネル0(PWM2本出力可能)
//PFC.PECRL2.BIT.PE3MD=1; //TIOC0D //E10A使用時(DBGMD=H 時)はTDO入力に固定されます。
PFC.PECRL2.BIT.PE2MD=1; //TIOC0C //E10A使用時(DBGMD=H 時)はTDI入力に固定されます。
//PFC.PECRL2.BIT.PE1MD=1; //TIOC0B //E10A使用時(DBGMD=H 時)はTRST入力に固定されます。
PFC.PECRL2.BIT.PE0MD=1; //TIOC0A //E10A使用時(DBGMD=H 時)はTMS入力に固定されます。
//----------------------------------------------------------
//ポートIOレジスタで端子の入出力方向を決める。
//出力に設定
//チャンネル4(PWM2本出力可能)
//PFC.PEIORL.BIT.B15=1; //TIOC4D//JP2-19
PFC.PEIORL.BIT.B14=1; //TIOC4C//JP2-18//OK
//PFC.PEIORL.BIT.B13=1; //TIOC4B//JP2-17
PFC.PEIORL.BIT.B12=1; //TIOC4A//JP2-16
//チャンネル3(PWM2本出力可能)
//PFC.PEIORL.BIT.B11=1; //TIOC3D//JP2-15
PFC.PEIORL.BIT.B10=1; //TIOC3C//JP2-14//OK
//PFC.PEIORL.BIT.B9=1; //TIOC3B//JP2-13
PFC.PEIORL.BIT.B8=1; //TIOC3A//JP2-12//OK
//チャンネル2(PWM1本出力可能)
//PFC.PEIORL.BIT.B7=1; //TIOC2B
PFC.PEIORL.BIT.B6=1; //TIOC2A//JP2-10//OK
//チャンネル1(PWM1本出力可能)
//PFC.PEIORL.BIT.B5=1; //TIOC1B
PFC.PEIORL.BIT.B4=1; //TIOC1A//JP3-1
//チャンネル0(PWM2本出力可能)
//PFC.PEIORL.BIT.B3=1; //TIOC0D
PFC.PEIORL.BIT.B2=1; //TIOC0C//JP3-6
//PFC.PEIORL.BIT.B1=1; //TIOC0B
PFC.PEIORL.BIT.B0=1; //TIOC0A//JP3-5
//==========================================================
//タイマコントロールレジスタ(TCR)の設定
//カウンタクリア(CCLR)の設定
//カウンタをクリアする条件を指定する。
//「TGRAのコンペアマッチインプットキャプチャでTCNTクリア」に指定。
MTU0.TCR.BIT.CCLR = 1;
MTU1.TCR.BIT.CCLR = 1;
MTU2.TCR.BIT.CCLR = 1;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
MTU3.TCR.BIT.CCLR = 1;
MTU4.TCR.BIT.CCLR = 1;
//カウンタクリア要因を選択
//クロックエッジ(CKEG)の選択
//00:立上がりエッジでカウント
//01:立下りエッジでカウント
//1X:両エッジでカウント
//【記号説明】X:Don't care
MTU0.TCR.BIT.CKEG = 1;
MTU1.TCR.BIT.CKEG = 1;
MTU2.TCR.BIT.CKEG = 1;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
MTU3.TCR.BIT.CKEG = 1;
MTU4.TCR.BIT.CKEG = 1;
//カウンタクロックを選択
//タイマプリスケーラ(TPSC)の設定
//0:内部クロック:Pφ/1でカウント
//1:内部クロック:Pφ/4でカウント
//2:内部クロック:Pφ/16でカウント
//3:内部クロック:Pφ/64でカウント
//4:
//5: チャンネルにより様々。
//6:
//7:
MTU0.TCR.BIT.TPSC = 0;
MTU1.TCR.BIT.TPSC = 0;
MTU2.TCR.BIT.TPSC = 0;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
MTU3.TCR.BIT.TPSC = 0;
MTU4.TCR.BIT.TPSC = 0;
//タイマーステータスレジスタ(TSR)の設定
//タイマジェネラルレジスタ(TGA)の設定
//TGRの8ビット単位でのアクセスは禁止です。常に16ビット単位でアクセスしてください。
//TGRは16ビットレジスタです。(つまり最大で0xFFFF)
//
// φ:システムクロック
//Pφ:周辺クロック
//
//MTUのクロックPφ[MHz](ex:24MHz)
//プリスケーラP(ex:P=16のときはPφ/16でカウントするという意味)
//のとき周期T[ms](ex:T=20ms)
//を作るのに必要なTGRAの値は
//TGRA=T*Pφ/P
// =20[ms]*24MHz/16
// =(20*10^(-3))*(24*10^6)/16
// =30000
//注意:[CCLR]で両エッジでカウントする様に指定した場合は2倍のカウントが必要です。
//TGRA=T*Pφ/P
// =(10^(-5))*(24*10^(6))/1
// =240
// =0xF0
//パルス周期を設定します。
MTU0.TGRA = 0x00F0;
MTU1.TGRA = 0x00F0;
MTU2.TGRA = 0x00F0;//はiodefine.hに定義されていない。MUTと同じ構造体だから一緒に書いてるっぽい?
MTU3.TGRA = 0x00F0;
MTU4.TGRA = 0x00F0;
MTU0.TGRC = 0x00F0;
MTU3.TGRC = 0x00F0;
MTU4.TGRC = 0x00F0;
//デューテー値を設定する。
//1:1 50% 0x0078
//2:1 66.66・・・% 0x00A0
//3:1 75% 0x0084
//4:1 80% 0x00C0
//5:1 83% 0x00C8
MTU0.TGRB = 0x0078;//
MTU1.TGRB = 0x00A0;//
MTU2.TGRB = 0x0084;
MTU3.TGRB = 0x00C0;
MTU4.TGRB = 0x00C8;
MTU0.TGRD = 0x8000;
MTU3.TGRD = 0x8000;
MTU4.TGRD = 0x8000;
//タイマアウトプットマスタイネーブルレジスタ(TOER)
//TOERは出力端子のTIOC4D、TIOC4C、TIOC3D、TIOC4B、TIOC4A、TIOC4Bの出力端子の許可/禁止を行います。
//0:MTU出力禁止
//1:MTU出力許可
MTU.TOER.BIT.OE4A=1;
//MTU.TOER.BIT.OE4B=1;
MTU.TOER.BIT.OE4C=1;
//MTU.TOER.BIT.OE4D=1;
//MTU.TOER.BIT.OE3B=1;
//MTU.TOER.BIT.OE3D=1;
//タイマI/Oコントロールレジスタ(TIOR)
//TIORのIOB3~IOB0はTGRBの機能を設定します。
// 周期:TGRA --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRB --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//
// 周期:TGRC --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRD --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//7~4ビット
//チャンネル0
MTU0.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC0B
MTU0.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC0D
//チャンネル1
MTU1.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC1B
//チャンネル2
MTU2.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC2B
//チャンネル3
MTU3.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC3B
MTU3.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC3D
//チャンネル4
MTU4.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC4B
MTU4.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC4D
//3~0ビット
//チャンネル0
MTU0.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC0A
MTU0.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC0C
//チャンネル1
MTU1.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC1A
//チャンネル2
MTU2.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC2A
//チャンネル3:
MTU3.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC3A
MTU3.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC3C
//チャンネル4
MTU4.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC4A
MTU4.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC4C
//タイマモードレジスタ(TMDR)
//[BFB]0:TGRBとTGRDは通常動作
// 1:TGRBとTGRDはバッファ動作
//[BFA]0:TGRAとTGRCは通常動作
// 1:TGRCとTGRCはバッファ動作
//バッファ動作とは二つのレジスタを組み合わせて32ビットのカウンタにする事だと思う。
//[MD]タイマの動作モードを指定します。
//
//今回は全てPWMモード1で設定します。
//
//PWMモード1で出力端子に指定できる端子は最初から決められています。詳細はハードウェアマニュアルの
//「11.4.5 PWMモード」の「表11.31 格PWM出力のレジスタと出力端子」を参照して下さい。
//
//PWMモード2は他のジェネラルレジスタと同期させることでPWMを最大12本出力することができます。
//チャンネル0
MTU0.TMDR.BIT.BFB = 0;
MTU0.TMDR.BIT.BFA = 0;
MTU0.TMDR.BIT.MD = 2;
//チャンネル1
//MTU1.TMDR.BIT.BFB//TGRDを持たないチャンネル1、2ではこのビットはリザーブビットになります。
//MTU1.TMDR.BIT.BFA//TGRCを持たないチャンネル1、2ではこのビットはリザーブビットになります。
MTU1.TMDR.BIT.MD = 2;
//チャンネル2
//MTU2.TMDR.BIT.BFB//TGRDを持たないチャンネル1、2ではこのビットはリザーブビットになります。
//MTU2.TMDR.BIT.BFA//TGRCを持たないチャンネル1、2ではこのビットはリザーブビットになります。
MTU2.TMDR.BIT.MD = 2;
//チャンネル3:
MTU3.TMDR.BIT.BFB = 0;
MTU3.TMDR.BIT.BFA = 0;
MTU3.TMDR.BIT.MD = 2;
//チャンネル4
MTU4.TMDR.BIT.BFB = 0;
MTU4.TMDR.BIT.BFA = 0;
MTU4.TMDR.BIT.MD = 2;
}
void pwm_start(void){//PWMを出力する
//タイマスタートレジスタ(TSTR)
//[CST]0:カウント動作は停止
// 1:カウント動作
MTU.TSTR.BIT.CST4 = 1;
MTU.TSTR.BIT.CST3 = 1;
MTU.TSTR.BIT.CST2 = 1;
MTU.TSTR.BIT.CST1 = 1;
MTU.TSTR.BIT.CST0 = 1;
}
void pwm_stop_1(void){
//発信を止めるには、「ハードウェアマニュアル 11.3.8 タイマスタートレジスタ(TSTR)」を参照すると、
//1:CSTに0をライトする。
//2:TIORに初期出力が0になるようにライトする。
//やってみてないから良く分からないが、1:だけだと多分TCNTのカウントを一時的に停止するだけなので
//出力レベルは保持されるのではないだろうか?
//タイマスタートレジスタ(TSTR)
//[CST]0:カウント動作は停止
// 1:カウント動作
MTU.TSTR.BIT.CST4 = 0;
MTU.TSTR.BIT.CST3 = 0;
MTU.TSTR.BIT.CST2 = 0;
MTU.TSTR.BIT.CST1 = 0;
MTU.TSTR.BIT.CST0 = 0;
}
void pwm_stop_2(void){
//タイマI/Oコントロールレジスタ(TIOR)
//TIORのIOB3~IOB0はTGRBの機能を設定します。
// 周期:TGRA --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRB --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//
// 周期:TGRC --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRD --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//7~4ビット
//チャンネル0
MTU0.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC0B
MTU0.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC0D
//チャンネル1
MTU1.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC1B
//チャンネル2
MTU2.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC2B
//チャンネル3
MTU3.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC3B
MTU3.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC3D
//チャンネル4
MTU4.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC4B
MTU4.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC4D
//3~0ビット
//チャンネル0
MTU0.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC0A
MTU0.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC0C
//チャンネル1
MTU1.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC1A
//チャンネル2
MTU2.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC2A
//チャンネル3:
MTU3.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC3A
MTU3.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC3C
//チャンネル4
MTU4.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC4A
MTU4.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC4C
}
//=============================
pwm.h
//========================
extern void init_pwm(void);
extern void pwm_start(void);
extern void pwm_stop_1(void);
extern void pwm_stop_2(void);
//=========================
このブログのSH7144F関連記事トップ
http://the-united-front.blogspot.jp/2013/09/interface-20066sh7144f-blog-1-2012810.html
登録:
投稿 (Atom)