/*****************************************/ /* PWMテスト3 RIKIYA 2001/08/22 */ /* pwmtest3.c */ /* H8-3048F */ /* ITU0を使ったPWM基本動作テスト */ /* A/D入力によって、PWMの周期とデューティ*/ /* を連続的に可変させる */ /*****************************************/ #include <3048f.h> #include /* メイン関数 ********************************************/ void main(void){ int data_a,data_b,data_c; timer_init(); /* タイマーの初期化 */ lcd_init(); /* 液晶表示器の初期化 */ PA.DDR = 0xff; /* portA出力に設定 */ PA.DR.BIT.B3 = 1; /* portA bit3を0固定とする*/ P1.DDR = 0xff; /* port1出力に設定 */ P2.DDR = 0x00; /* port2入力に設定 */ P2.PCR.BYTE = 0xff; /* port2全てプルアップ */ P4.DDR = 0x00; /* port4入力に設定 */ P4.PCR.BYTE = 0xff; /* port4全てプルアップ */ AD.CSR.BYTE = 0x31; /* SCAN MODE / CH0〜1*/ while(AD.CSR.BIT.ADF == 0){} /* 2CH分の変換終了を待つ */ /**********************************************************/ /* H8のPWM機能によるPWM制御 周期125KHz〜30Hzに対応する /**********************************************************/ if((P2.DR.BIT.B3 == 0) && (P2.DR.BIT.B4 == 0)){ switch ((P2.DR.BYTE) & 0x07){ /*下位3BITの状態を判定*/ case 0: /* クロック両エッジでカウント*/ lcd_locate(0,0); lcd_print("clock = x2 "); ITU0.TCR.BYTE = 0x50; break; case 1: /* クロックφでカウント */ lcd_locate(0,0); lcd_print("clock = 1 "); ITU0.TCR.BYTE = 0x40; break; case 2: /* クロックφ/2でカウント */ lcd_locate(0,0); lcd_print("clock = 1/2 "); ITU0.TCR.BYTE = 0x41; break; case 3: /* クロックφ/4でカウント */ lcd_locate(0,0); lcd_print("clock = 1/4 "); ITU0.TCR.BYTE = 0x42; break; default: /* クロックφ/8でカウント */ lcd_locate(0,0); lcd_print("clock = 1/8 "); ITU0.TCR.BYTE = 0x43; break; } ITU0.GRA = 65534; /* GRAを65534に設定 */ ITU0.GRB = 65533; /* GRBを65533に設定 */ ITU.TMDR.BIT.PWM0 = 1; /* ITU0 PWMモード */ ITU.TSTR.BIT.STR0 = 1; /* カウント開始 */ while(1){ data_b = (AD.DRB>>8) & 0x00ff; /* A/D CH1 8BIT化 */ data_a = (AD.DRA>>8) & 0x00ff; /* A/D CH0 8BIT化 */ ITU0.GRB = (0x00ff*data_b)+0x0101; /* 周期を設定 */ ITU0.GRA = (ITU0.GRB/0x00ff)*data_a; /*デューティー比 */ switch (P2.DR.BIT.B7){ case 0: /* デューティー比パラメータ表示*/ P1.DR.BYTE = (ITU0.GRA>>8) & 0x00ff; break; case 1: /* 周期パラメータ表示 */ P1.DR.BYTE = (ITU0.GRB>>8) & 0x00ff; } } } /**********************************************************/ /* タイマ待機によるPWM制御 周期32Hz〜4Hzに対応する /**********************************************************/ else if((P2.DR.BIT.B3 == 1) && (P2.DR.BIT.B4 == 0)){ lcd_locate(0,0); lcd_print("clock = 1mS wait"); while(1){ data_b = (AD.DRB>>8) & 0x00ff; /* A/D CH1 8BIT化 */ data_a = (AD.DRA>>11) & 0x001f; /* A/D CH0 5BIT化 */ if (data_b < 0x001f) {data_b = 0x001f;} /*data_b制限*/ data_c = (data_b/0x001f)*data_a; /* 出力0の期間を計算 */ PA.DR.BIT.B2 = 0; /* portA bit2を0とする*/ wait(data_c); /* 出力0の期間 */ PA.DR.BIT.B2 = 1; /* portA bit2を1とする*/ wait(data_b-data_c); /* 出力1の期間 */ switch (P2.DR.BIT.B7){ case 0: /* デューティー比パラメータ表示*/ P1.DR.BYTE = data_c; break; case 1: /* 周期パラメータ表示 */ P1.DR.BYTE = data_b; } } } /**********************************************************/ /* タクトスイッチを押した時にONする。手動動作 /**********************************************************/ else if((P2.DR.BIT.B3 == 0) && (P2.DR.BIT.B4 == 1)){ lcd_locate(0,0); lcd_print("S1 PUSH MODE "); while(1){ switch (P4.DR.BIT.B4){ case 0: PA.DR.BIT.B2 = 0; /* portA bit2を0とする*/ P1.DR.BYTE = 0x55; break; case 1: PA.DR.BIT.B2 = 1; /* portA bit2を1とする*/ P1.DR.BYTE = 0xaa; } } } }