/********************************************************** 7144test2.c 2006.06.28 RIKIYA SH2_7144F CMT1を使った割り込みインターバルタイマー動作と MTU4を使ったサーボ用PWM波形出力 (PE14から出力) /*********************************************************/ #include "iodefine.h" void main(void); void setup(void); void wait(unsigned short); /* ハードウエアセットアップ******************************/ void setup(void){ // CMT設定 CMT0:wait() CMT1:割り込みインターバル MST.CR2.BIT._CMT = 0; // CMTスタンバイ解除 CMT0.CMCSR.BIT.CKS = 0; // CMT0 CLOCK 24MHz/8 CMT0.CMCOR = 300; // 0.1mS/0.3333uS = 300 CMT.CMSTR.BIT.STR0 = 0; // CMT0 COUNT STOP INTC.IPRG.WORD |= 0x000F; // CMT1 割込みLEVEL = 1 CMT1.CMCSR.BIT.CKS = 3; // CMT1 CLOCK 24MHz/512 CMT1.CMCSR.BIT.CMIE = 1; // CMT1 割り込み許可 CMT1.CMCOR = 23441; // 0.5S/21.33uS = 23441 CMT.CMSTR.BIT.STR1 = 1; // CMT1 START // MTU4 TIOC4C PWM MODE 1 設定 MST.CR2.BIT._MTU = 0; // MTUスタンバイ解除 PFC.PECRL1.BIT.PE14MD = 1; // PE14 TIOC4Cに設定 PFC.PEIORL.BIT.B14 = 1; // PE14 OUTPUT MODE PFC.PEIORL.BIT.B15 = 1; // PE15 OUTPUT MODE MTU4.TCR.BYTE = 0xA2; // TGR4C CLEAR,24MHz/16 MTU4.TGRC = 30000; // 周期20mS = 0.666uS x 30000 MTU4.TGRD = 2250; // パルス幅1.5mS = 0.666uS x 2250 MTU.TOER.BIT.OE4C = 1; // TIOC4C OUTPUT ENABLE MTU4.TIOR.BYTE.L = 0x56; // TCR4D → 0 , TGR4C → 1 MTU4.TMDR.BYTE = 0xC2; // PWM MODE1 MTU.TSTR.BIT.CST4 = 1; // TCNT4 START } /* メイン関数********************************************/ void main(void){ setup(); // ハードウエアセットアップ while(1){ wait(10000); // 1秒待機 MTU4.TGRD = 2700; // パルス幅1.8mS = 0.666uS x 2700 wait(10000); // 1秒待機 MTU4.TGRD = 1800; // パルス幅1.2mS = 0.666uS x 1800 } } /* CMT0時間稼ぎ******************************************** 引数のmsecには、1/10000(0.1mS)秒単位で待機時間を指定する。 unsigned short型、0xffff(65535)まで。 **********************************************************/ void wait(unsigned short msec){ unsigned short i; CMT.CMSTR.BIT.STR0 = 1; // CMT0 COUNT START for(i=0;i