#include "3664.h" #include "SVDRV.h" int osc_port = 0; int __t; int __d; int __r; #define _MIN_DUTY (0) #define _MAX_DUTY (100) #define _MIN_TIME (100) #define _MAX_TIME (10000) #define _STEP_TIME (_MAX_TIME/100) static void init_3664( void ) { char xx; IO.PMR1.BIT.TXD = 1; SCI3.SCR3.BYTE = 0; /* clear all flags */ SCI3.SMR.BYTE = 0; /* Ascnc, 8bit, NoParity, (Even), stop1, 1/1 */ SCI3.BRR = 25; /* 19200baud (CPU=16MHz) */ WAIT( 280 ); SCI3.SCR3.BYTE = 0x30; /* scr=0011 0000 (TE=1,RE=1) */ xx = SCI3.SSR.BYTE; /* Dummy Read */ SCI3.SSR.BYTE = 0x80; /* Clear Error Flag (TDRE=1) */ IO.PDR8.BIT.B1 = 0; /* P81/FTIOA の出力値 = 0 */ IO.PDR8.BIT.B2 = 0; /* P82/FTIOB の出力値 = 0 */ IO.PDR8.BIT.B3 = 0; /* P83/FTIOC の出力値 = 0 */ IO.PDR8.BIT.B4 = 0; /* P84/FTIOD の出力値 = 0 */ IO.PDR8.BIT.B6 = 0; /* P86 の出力値 = 0 */ IO.PCR8 = 0x5E; /* P81-84,86 は出力ポートとする */ TW.TIERW.BIT.OVIE = 0; /* timer overflow interrupt disable */ TW.TIOR0.BIT.IOB = 1; /* P82/FTIOB の FTIOB 出力端子指定 */ TW.TIOR1.BIT.IOD = 1; /* P84/FTIOD の FTIOD 出力端子指定 */ TW.TMRW.BIT.PWMB = 1; /* P82/FTIOB は PWM出力モードとする */ TW.TMRW.BIT.PWMD = 1; /* P84/FTIOD は PWM出力モードとする */ TW.TCRW.BIT.CCLR = 1; /* GRA のコンペアマッチで TCNT をクリアする */ TW.TCRW.BIT.CKS = 1; /* クロックを2分周にセット */ AD.ADCSR.BIT.SCAN = 1; // スキャンモード AD.ADCSR.BIT.CH = 7; // AN4 - AN7 AD.ADCSR.BIT.ADST = 1; // ADCスタート } void set_pwm( int dir, // 回転方向指定 (右 or 左) int t, // PWM MAX 値 int duty // 0 - 100 ) { __t = t; __d = (long)((long)t * (long)duty) / 100; __r = dir; TW.TIERW.BIT.IMIEA = 1; // 割り込みフラグ } void init_pwm( int dir, // 回転方向指定 (右 or 左) int t, // PWM MAX 値 int duty // 0 - 100 ) { osc_port = 0; TW.TCNT = 0; TW.TIOR0.BIT.IOB = 2; // FTIOB 出力値は GRB のコンペアマッチで 1 TW.TIOR1.BIT.IOD = 2; // FTIOD 出力値は GRD のコンペアマッチで 1 IO.PDR8.BIT.B1 = 0; // P81/FTIOA の出力値 = 0 IO.PDR8.BIT.B3 = 0; // P83/FTIOC の出力値 = 0 TW.TCRW.BIT.TOB = 0; // FTIOB 出力値 = 0 TW.TCRW.BIT.TOD = 0; // FTIOD 出力値 = 0 TW.TIERW.BIT.IMIEA = 0; // 割り込みフラグ TW.TIERW.BIT.IMIEB = 0; // 割り込みフラグ TW.TIERW.BIT.IMIED = 0; // 割り込みフラグ set_pwm( dir, t, duty ); TW.GRA = __t; if( __r == 0 ) { IO.PDR8.BIT.B1 = 0; // P81/FTIOA の出力値 = 0 TW.GRB = __d; // P82/FTIOB 設定 (duty) IO.PDR8.BIT.B3 = 1; // P83/FTIOC の出力値 = 1 TW.GRD = __t + 1; // P84/FTIOD の出力値 = 0 (宮田さん助言部分) } else { IO.PDR8.BIT.B1 = 1; // P81/FTIOA の出力値 = 1 TW.GRB = __t + 1; // P82/FTIOB の出力値 = 0 (宮田さん助言部分) IO.PDR8.BIT.B3 = 0; // P83/FTIOC の出力値 = 0 TW.GRD = __d; // P84/FTIOD 設定 (duty) } TW.TMRW.BIT.CTS = 1; // TimerW カウンタスタート } #pragma interrupt int_timerw void int_timerw( void ) { if( TW.TSRW.BIT.IMFA == 1 ) { TW.TSRW.BIT.IMFA = 0; } TW.TIERW.BIT.IMIEA = 0; // 割り込みフラグ TW.TMRW.BIT.CTS = 0; // TimerW カウンタストップ TW.TCNT = 0; TW.TCRW.BIT.TOB = 0; // FTIOB 出力値 = 0 TW.TCRW.BIT.TOD = 0; // FTIOD 出力値 = 0 if( TW.GRA != __t ) { TW.GRA = __t; } if( __r == 0 ) { IO.PDR8.BIT.B1 = 0; // P81/FTIOA の出力値 = 0 TW.GRB = __d; // P82/FTIOB 設定 (duty) IO.PDR8.BIT.B3 = 1; // P83/FTIOC の出力値 = 1 TW.GRD = __t + 1; // P84/FTIOD の出力値 = 0 (宮田さん助言部分) } else { IO.PDR8.BIT.B1 = 1; // P81/FTIOA の出力値 = 1 TW.GRB = __t + 1; // P82/FTIOB の出力値 = 0 (宮田さん助言部分) IO.PDR8.BIT.B3 = 0; // P83/FTIOC の出力値 = 0 TW.GRD = __d; // P84/FTIOD 設定 (duty) } TW.TMRW.BIT.CTS = 1; // TimerW カウンタスタート // debug with OSC osc_port ^= 1; IO.PDR8.BIT.B6 = osc_port; } void main( void ) { int ch; int dir; int time; int duty; dir = 0; time = 200; // (_MAX_TIME + _MIN_TIME) / 2; duty = (_MAX_DUTY + _MIN_DUTY) / 2; init_3664(); EI; init_pwm( dir, time, duty ); crlf(); while( 1 ) { outch( '>' ); ch = inch(); switch( ch ) { case 'u': duty++; if( duty > _MAX_DUTY ) duty = _MAX_DUTY; set_pwm( dir, time, duty ); break; case 'U': time += _STEP_TIME; if( time > _MAX_TIME ) time = _MAX_TIME; set_pwm( dir, time, duty ); break; case 'd': duty--; if( duty < _MIN_DUTY ) duty = _MIN_DUTY; set_pwm( dir, time, duty ); break; case 'D': time -= _STEP_TIME; if( time < _MIN_TIME ) time = _MIN_TIME; set_pwm( dir, time, duty ); break; case 'c': case 'C': dir ^= 1; set_pwm( dir, time, duty ); break; case 'l': case 'L': dir = 1; set_pwm( dir, time, duty ); break; case 'r': case 'R': dir = 0; set_pwm( dir, time, duty ); break; } outch( ' ' ); outch( __r | '0' ); outch( ' ' ); out4h( __t ); outch( ' ' ); out4h( __d ); outch( ' ' ); out4h( get_ad(5) ); outch( ' ' ); out4h( get_ad(7) ); if( ch ) { crlf(); } else { outch( kCRcode ); } } }