/********************************************************** プッシュスイッチと時間割り込みによってLEDのPWM制御を行う ITU3を用いた例 **********************************************************/ #include <3048fone.h> #include "h8_3048fone.h" #define clearTimer3Flag() (ITU3.TSR.BIT.IMFA=0) /* ------------------------------------------------- */ /* TIMER INITIALIZATION */ /* ------------------------------------------------- */ void initTimer3Int(unsigned short int period) /*ITU3による割り込みタイマーの設定*/ /*割り込み間隔は引数peiodで単位はμsecである*/ /*値は20971以下でなければならない*/ /*20.971msecまで*/ { unsigned int period25=(unsigned int)((25*(long int)period+4)>>3); ITU3.TCR.BIT.CCLR=1; /*GRAのコンペアマッチでTCNTをクリア*/ ITU3.TCR.BIT.CKEG=0; /*立ち上がりエッジでカウント*/ ITU3.TCR.BIT.TPSC=3; /*内部クロックφ/8でカウント*/ ITU3.GRA=period25-1; /*割り込みの周期をperiod[μs]に指定*/ ITU3.TIER.BIT.IMIEA=1; /*TCNT=GRAとなったときの割り込み要求を許可*/ ITU3.TIER.BIT.OVIE=0; /*オーバー・アンダーフロー発生時の割り込みを禁止*/ ITU3.TIER.BIT.IMIEB=0; /*TCNT=GRBとなったときの割り込みを禁止*/ } #define startTimer3() (ITU.TSTR.BYTE |= 0x08) /* Timer CH3 スタート */ #define stopTimer3() (ITU.TSTR.BYTE &= ~0x08) /* Timer CH3 ストップ */ volatile int led0,led1; const int period=10; /*周期10msec*/ const int low=1; main() { led0=led1=0; initLed(); initPushSW(); initTimer3Int(1000); /*タイマ割り込み1msec */ /*単位はμsec ITUch3のみ使用*/ E_INT(); /*CPU割り込み許可*/ startTimer3(); /*時間割り込みタイマスタート*/ while(1){ if (checkPushSW(0)==1) { /*PushSWの1がONの時*/ led0=period; } else if (checkPushSW(1)==1) { /*PushSWの2がONの時*/ led0=low; } else { led0=0; } if (checkPushSW(2)==1) { /*PushSWの3がONの時*/ led1=period; } else if (checkPushSW(3)==1) { /*PushSWの4がONの時*/ led1=low; } else { led1=0; } } } #pragma asm .SECTION MYVEC, DATA, LOCATE=H'000090 .ORG H'000090 ;IMIA3 .DATA.L _TimerIntFuncwithITU3 .SECTION P,CODE,ALIGN=2 ;これを忘れてはいけない #pragma endasm #pragma interrupt (TimerIntFuncwithITU3) void TimerIntFuncwithITU3() /*タイマ割り込みルーチン*/ { static int tick=0; clearTimer3Flag(); /*タイマステータスフラグのクリア 忘れないこと*/ if (tick