/**************************************************/ /* タイマー割込みPWMテスト1 RIKIYA 2001.05.04 */ /* pwmtest2.C */ /* H8-3048/F */ /* メイン関数でport5のLEDを01表示で更新し続ける一方で*/ /* ITU1によって約5msごとに割り込みを発生させ、 */ /* sw4からの入力によって割り込み処理でport1のLEDを*/ /* 変化させ,portAでモータ制御をする。 */ /* モーター制御は、割込みの5msを単位とするPWMを行う。 */ /* 変数cnt,modeをグローバル変数として、main,intimia1 */ /* の両方の関数で共用している */ /**************************************************/ #include <3048f.h> #pragma interrupt(intimia1) extern int cnt; /*グローバル変数 startup.marでもexport宣言*/ extern int mode; /*グローバル変数 startup.marでもexport宣言*/ /* メイン関数**********************************/ void main(void){ P4.DDR = 0x00; /*port4入力に設定 操作用sw1〜4*/ P4.PCR.BYTE = 0xff; /*port4プルアップon */ P5.DDR = 0xff; /*port5出力に設定 表示LED */ PA.DDR = 0xff; /*portA出力に設定 モータ制御 */ cnt = 0; /*割込み回数カウント用変数 */ mode = 0; /*デューティー比設定用変数 */ ITU1.TCR.BYTE = 0x23; /* GRAコンペアマッチ clock 1/8 */ ITU1.GRA = 0x2710; /* GRAを2710に設定 約5ms*/ ITU1.TIER.BYTE = 0xF9; /* ITU1のGRAによるコンペアマッチ割込みを許可*/ ITU.TSTR.BIT.STR1 = 0; /* カウント停止状態 */ ITU.TSTR.BIT.STR1 = 1; /* ITU1 TCNTカウント開始 */ /*押されたボタンによって変数 mode を設定する****************/ while(1){ P5.DR.BYTE = 0x01;/*LEDを○●表示*/ if(P4.DR.BIT.B4 == 0){ /* sw1 */ mode = 1; } else if(P4.DR.BIT.B5 == 0){ /* sw2 */ mode = 2; } else if(P4.DR.BIT.B6 == 0){ /* sw3 */ mode = 3; } else if(P4.DR.BIT.B7 == 0){ /* sw4 */ mode = 4; } else { /* 何も押されていない */ mode = 0; } } } /*割り込み処理*********************************/ void intimia1(void){ P5.DR.BYTE = 0x02; /*LEDを●○表示*/ cnt++; if(cnt == 10){cnt = 0;} if(mode == 0){ PA.DR.BIT.B0 = 0; PA.DR.BIT.B1 = 0; } switch(cnt){ case 0: if(mode == 0){break;} PA.DR.BIT.B0 = 1; PA.DR.BIT.B1 = 0; break; case 1: if(mode == 1){ /*デューティー比0.1*/ PA.DR.BIT.B0 = 0; PA.DR.BIT.B1 = 0; } break; case 2: break; case 3: break; case 4: break; case 5: if(mode == 2){ /*デューティー比0.5*/ PA.DR.BIT.B0 = 0; PA.DR.BIT.B1 = 0; } break; case 6: break; case 7: if(mode == 3){ /*デューティー比0.7*/ PA.DR.BIT.B0 = 0; PA.DR.BIT.B1 = 0; } break; case 8: break; case 9: if(mode == 4){ /*デューティー比0.9*/ PA.DR.BIT.B0 = 0; PA.DR.BIT.B1 = 0; } break; default:break; } ITU1.TSR.BIT.IMFA = 0; /* 検知フラグを戻して再開 */ }