/* Configure chregs according to cfg, where cfg->tube_dst is peripheral. */ static int config_to_per(dma_tube_reg_map *chregs, dma_tube_config *cfg) { /* Check that ->tube_src is memory (if it's anything else, we * shouldn't have been called). */ ASSERT(_dma_addr_type(cfg->tube_src) == DMA_ATYPE_MEM); set_ccr(chregs, cfg->tube_src_size, cfg->tube_flags & DMA_CFG_SRC_INC, cfg->tube_dst_size, cfg->tube_flags & DMA_CFG_DST_INC, (cfg_ccr_flags(cfg->tube_flags) | DMA_CCR_DIR_FROM_MEM)); chregs->CMAR = (uint32)cfg->tube_src; chregs->CPAR = (uint32)cfg->tube_dst; return DMA_TUBE_CFG_SUCCESS; }
int main( void ) { uint8_t buffer_index; packet_header_t* header; // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; header = (packet_header_t*)tx_buffer; // Initialize Tx Buffer header->length = sizeof(packet_header_t) - 1; header->source = DEVICE_ADDRESS; header->type = 0x66; // Sync message header->flags = 0xAA; // Make sure processor is running at 12MHz setup_oscillator(); // Initialize UART for communications at 115200baud setup_uart(); // Initialize LEDs setup_leds(); // Initialize timer set_ccr( 0, TIMER_LIMIT ); setup_timer_a(MODE_UP); // Send sync message register_timer_callback( send_sync_message, 0 ); // Initialize radio and enable receive callback function setup_radio( process_rx ); // Enable interrupts, otherwise nothing will work eint(); while (1) { // Enter sleep mode __bis_SR_register( LPM0_bits + GIE ); __no_operation(); } return 0; }
//************************************************************************* //* *************************系统初始化************************ * //************************************************************************* void vInitialize(void) { //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<IO口初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> vIOPortInit(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> vTimerInit(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<光电编码器初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> encoderInit(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<官方初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> init_sci1( 0x00, 79 ); /* Initialization of SCI1 */ set_ccr( 0x00 ); /* Entire interrupt permission */ //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<输出初始化信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>> printf("\nInitialize is successful!"); }
bool Motor::set_torque(float torque) { bool torque_set = true; if (torque < 0.0f) set_direction_negative(); else set_direction_positive(); if (std::abs(torque) > max_torque_) { if (torque > 0.0f) torque = max_torque_; else torque = -max_torque_; torque_set = false; } torque_ = torque; current_ = torque * inv_torque_constant_; set_ccr(current_to_ccr(std::abs(current_))); return torque_set; }
/* Configure chregs according to cfg, where cfg->tube_dst is memory. */ static int config_to_mem(dma_tube_reg_map *chregs, dma_tube_config *cfg) { uint32 mem2mem; if ((_dma_addr_type(cfg->tube_src) == DMA_ATYPE_MEM) && (cfg->tube_flags & DMA_CFG_CIRC)) { /* Can't do mem-to-mem and circular mode */ return -DMA_TUBE_CFG_ECFG; } mem2mem = (_dma_addr_type(cfg->tube_src) == DMA_ATYPE_MEM ? DMA_CCR_MEM2MEM : 0); set_ccr(chregs, cfg->tube_dst_size, cfg->tube_flags & DMA_CFG_DST_INC, cfg->tube_src_size, cfg->tube_flags & DMA_CFG_SRC_INC, (cfg_ccr_flags(cfg->tube_flags) | DMA_CCR_DIR_FROM_PER | mem2mem)); chregs->CNDTR = cfg->tube_nr_xfers; chregs->CMAR = (uint32)cfg->tube_dst; chregs->CPAR = (uint32)cfg->tube_src; return DMA_TUBE_CFG_SUCCESS; }
void main( void ) { int i, j; unsigned int u; char c; /* マイコン機能の初期化 */ init(); /* 初期化 */ initI2CEeprom( &P6DDR, &P6DR, 0x90, 6, 5); /* EEP-ROM初期設定 */ init_sci1( 0x00, 79 ); /* SCI1初期化 */ set_ccr( 0x00 ); /* 全体割り込み許可 */ /* マイコンカーの状態初期化 */ speed_r( 0, 0 ); speed_f( 0, 0 ); servoPwmOut( 0 ); while( 1 ) { switch( pattern ) { case 0: /* メニュー */ printf( "\n\n" ); printf( "Motor Drive PCB TypeS Test Program Ver1.00\n" ); printf( "\n" ); printf( "1 : LEDのテスト\n" ); printf( "2 : スイッチのテスト\n" ); printf( "3 : CN8の入力テスト\n" ); printf( "4 : ブザーのテスト\n" ); printf( "5 : エンコーダのテスト\n" ); printf( "6 : EEP-ROMのテスト\n" ); printf( "7 : ボリュームのテスト\n" ); printf( "8 : アナログセンサ基板のテスト\n" ); printf( "9 : モータのテスト\n" ); printf( "\n" ); printf( "1-9の数字を入力してください " ); pattern = 1; break; case 1: if( get_sci(&c) ) { if( c >= '1' && c <= '9' ) { printf( "%c\n\n" , c ); cnt1 = 0; pattern = (c - 0x30) * 10 + 1; } } break; case 11: /* LEDのテスト */ printf( "現在LED2〜5を順番に点灯中です。" ); printf( "終わったらどれかキーを押してください。\n" ); pattern = 12; break; case 12: led_out( 1 << (cnt1 / 500) ); if( cnt1 >= 2000 ) cnt1 = 0; if( get_sci(&c) == 1 ) { led_out( 0 ); pattern = 0; } break; case 21: /* スイッチのテスト */ printf( "現在スイッチの値を表示中です。" ); printf( "終わったらどれかキーを押してください。\n" ); pattern = 22; break; case 22: if( get_sci(&c) == 1 ) { pattern = 0; break; } if( cnt1 >= 200 ) { cnt1 = 0; printf( "ディップSW(SW3)の値 : %02x ", dipsw_get2() ); printf( "プッシュSW(SW2)の値 : %1x\r", pushsw_get() ); } break; case 31: /* CN8の入力テスト */ printf( "CN8に入力されている値を表示中です。" ); printf( "終わったらどれかキーを押してください。\n" ); pattern = 32; break; case 32: if( get_sci(&c) == 1 ) { pattern = 0; break; } if( cnt1 >= 200 ) { cnt1 = 0; printf( "CN8の入力値 : %1x\r", cn8_get() ); } break; case 41: /* ブザーのテスト */ printf( "ブザーをテストします。" ); printf( "終わったらどれかキーを押してください。\n" ); pattern = 42; break; case 42: if( get_sci(&c) == 1 ) { pattern = 0; beep_out( 0 ); break; } if( cnt1 <= 1000 ) { beep_out( 1 ); } else if( cnt1 <= 2000 ) { beep_out( 0 ); } else { cnt1 = 0; } break; case 51: /* エンコーダのテスト */ printf( "エンコーダの入力パルス数を表示します。" ); printf( "終わったらどれかキーを押してください。\n" ); lEncoderTotal = 0; pattern = 52; break; case 52: if( get_sci(&c) == 1 ) { pattern = 0; break; } if( cnt1 >= 200 ) { cnt1 = 0; printf( "エンコーダのパルス値 : %8ld\r", lEncoderTotal ); } break; case 61: /* EEP-ROMのテスト */ printf( "EEP-ROMが正常に書き込めるかチェックします。" ); printf( "チェック中はキー入力を受け付けません。" ); printf( "チェックしますか?(Y or N) " ); pattern = 62; break; case 62: if( get_sci(&c) == 1 ) { switch( c ) { case 'Y': case 'y': printf( "y\n" ); pattern = 63; break; case 'N': case 'n': printf( "n\n" ); pattern = 0; break; } } break; case 63: for( u=0; u<0x8000 ; u++ ) { if( u % 0x80 == 0 ) { printf( "%3ld%%チェック完了...\r", (long)u * 100 / 0x8000 ); } writeI2CEeprom( u, 0xaa ); while( !checkI2CEeprom() ); if( (unsigned char)readI2CEeprom( u ) != 0xaa ) { break; } writeI2CEeprom( u, 0x55 ); while( !checkI2CEeprom() ); if( (unsigned char)readI2CEeprom( u ) != 0x55 ) { break; } writeI2CEeprom( u, 0x00 ); while( !checkI2CEeprom() ); if( (unsigned char)readI2CEeprom( u ) != 0x00 ) { break; } } printf( "\n" ); if( u == 0x8000 ) { printf( "EEP-ROMは正常でした。\n" ); } else { printf( "EEP-ROMに異常がありました。" ); printf( "半田不良など確認してください。\n" ); } pattern = 64; break; case 64: printf( "どれかキーを押してください。" ); while( get_sci(&c) ); pattern = 65; break; case 65: if( get_sci(&c) == 1 ) { pattern = 0; break; } break; case 71: /* ボリュームのテスト */ printf( "ボリューム電圧を表示中です。" ); printf( "終わったらどれかキーを押してください。\n" ); pattern = 72; break; case 72: if( get_sci(&c) == 1 ) { pattern = 0; break; } if( cnt1 >= 200 ) { cnt1 = 0; i = AD_DRB >> 6; j = (long)500 * i / 1023; printf( "ボリュームの電圧 : %4d (%01d.%02dV)\r", i, j/100, j%100 ); } break; case 81: /* アナログセンサ基板のテスト */ printf( "アナログセンサ基板の値を表示中です。" ); printf( "終わったらどれかキーを押してください。\n" ); pattern = 82; break; case 82: if( get_sci(&c) == 1 ) { pattern = 0; break; } if( cnt1 >= 200 ) { cnt1 = 0; printf( "Left=%4d , Right=%4d , " "Digital=%1x , Center=%1d , Bar=%1d\r", AD_DRD>>6, AD_DRC>>6, sensor_inp(), center_inp(), startbar_get() ); } break; case 91: /* モータのテスト */ printf( "モータのテストをします。\n" ); printf( "1 : 左後ろモータ\n" ); printf( "2 : 右後ろモータ\n" ); printf( "3 : サーボモータ\n" ); printf( "4 : 左前モータ\n" ); printf( "5 : 右前モータ\n" ); printf( "0 : 終了\n" ); printf( "\n" ); printf( "0-5の数字を入力してください " ); pattern = 92; break; case 92: if( get_sci(&c) ) { if( c == '0' ) { pattern = 0; break; } else if( c >= '1' && c <= '5' ) { printf( "%c\n\n" , c ); cnt1 = 0; pattern = (c - 0x31) * 10 + 101; } } break; case 101: printf( "左後ろモータをテストします。\n" ); printf( "スペースキーを押して動作を変えます。" ); printf( "0キーで終了です。\n" ); cnt1 = 0; i = 0; j = 1; pattern = 102; break; case 102: if( get_sci(&c) ) { if( c == '0' ) { speed2_r( 0, 0 ); motor_mode_r( BRAKE , BRAKE ); pattern = 91; break; } else if( c == ' ' ) { cnt1 = 0; i++; if( i >= 5 ) i = 0; } } switch( i ) { case 0: if( i != j ) { printf( "停止中 \r" ); j = i; } speed2_r( 0, 0 ); motor_mode_r( BRAKE , BRAKE ); break; case 1: if( i != j ) { printf( "正転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_r( 50, 0 ); motor_mode_r( BRAKE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_r( 0, 0 ); motor_mode_r( BRAKE , BRAKE ); } else { cnt1 = 0; } break; case 2: if( i != j ) { printf( "逆転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_r( -50, 0 ); motor_mode_r( BRAKE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_r( 0, 0 ); motor_mode_r( BRAKE , BRAKE ); } else { cnt1 = 0; } break; case 3: if( i != j ) { printf( "正転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_r( 50, 0 ); motor_mode_r( FREE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_r( 0, 0 ); motor_mode_r( FREE , BRAKE ); } else { cnt1 = 0; } break; case 4: if( i != j ) { printf( "逆転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_r( -50, 0 ); motor_mode_r( FREE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_r( 0, 0 ); motor_mode_r( FREE , BRAKE ); } else { cnt1 = 0; } break; } break; case 111: printf( "右後ろモータをテストします。\n" ); printf( "スペースキーを押して動作を変えます。" ); printf( "0キーで終了です。\n" ); cnt1 = 0; i = 0; j = 1; pattern = 112; break; case 112: if( get_sci(&c) ) { if( c == '0' ) { speed2_r( 0, 0 ); motor_mode_r( BRAKE , BRAKE ); pattern = 91; break; } else if( c == ' ' ) { cnt1 = 0; i++; if( i >= 5 ) i = 0; } } switch( i ) { case 0: if( i != j ) { printf( "停止中 \r" ); j = i; } speed2_r( 0, 0 ); motor_mode_r( BRAKE , BRAKE ); break; case 1: if( i != j ) { printf( "正転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_r( 0, 50 ); motor_mode_r( BRAKE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_r( 0, 0 ); motor_mode_r( BRAKE , BRAKE ); } else { cnt1 = 0; } break; case 2: if( i != j ) { printf( "逆転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_r( 0, -50 ); motor_mode_r( BRAKE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_r( 0, 0 ); motor_mode_r( BRAKE , BRAKE ); } else { cnt1 = 0; } break; case 3: if( i != j ) { printf( "正転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_r( 0, 50 ); motor_mode_r( BRAKE , FREE ); } else if( cnt1 <= 2000 ) { speed2_r( 0, 0 ); motor_mode_r( BRAKE , FREE ); } else { cnt1 = 0; } break; case 4: if( i != j ) { printf( "逆転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_r( 0, -50 ); motor_mode_r( BRAKE , FREE ); } else if( cnt1 <= 2000 ) { speed2_r( 0, 0 ); motor_mode_r( BRAKE , FREE ); } else { cnt1 = 0; } break; } break; case 121: printf( "サーボモータをテストします。\n" ); printf( "スペースキーを押して動作を変えます。" ); printf( "0キーで終了です。\n" ); cnt1 = 0; i = 0; j = 1; pattern = 122; break; case 122: if( get_sci(&c) ) { if( c == '0' ) { servoPwmOut( 0 ); motor_mode_s( BRAKE ); pattern = 91; break; } else if( c == ' ' ) { cnt1 = 0; i++; if( i >= 5 ) i = 0; } } switch( i ) { case 0: if( i != j ) { printf( "停止中 \r" ); j = i; } servoPwmOut( 0 ); motor_mode_s( BRAKE ); break; case 1: if( i != j ) { printf( "正転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { servoPwmOut( 50 ); motor_mode_s( BRAKE ); } else if( cnt1 <= 2000 ) { servoPwmOut( 0 ); motor_mode_s( BRAKE ); } else { cnt1 = 0; } break; case 2: if( i != j ) { printf( "逆転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { servoPwmOut( -50 ); motor_mode_s( BRAKE ); } else if( cnt1 <= 2000 ) { servoPwmOut( 0 ); motor_mode_s( BRAKE ); } else { cnt1 = 0; } break; case 3: if( i != j ) { printf( "正転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { servoPwmOut( 50 ); motor_mode_s( FREE ); } else if( cnt1 <= 2000 ) { servoPwmOut( 0 ); motor_mode_s( FREE ); } else { cnt1 = 0; } break; case 4: if( i != j ) { printf( "逆転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { servoPwmOut( -50 ); motor_mode_s( FREE ); } else if( cnt1 <= 2000 ) { servoPwmOut( 0 ); motor_mode_s( FREE ); } else { cnt1 = 0; } break; } break; case 131: printf( "左前モータをテストします。\n" ); printf( "スペースキーを押して動作を変えます。" ); printf( "0キーで終了です。\n" ); cnt1 = 0; i = 0; j = 1; pattern = 132; break; case 132: if( get_sci(&c) ) { if( c == '0' ) { speed2_f( 0, 0 ); motor_mode_f( BRAKE , BRAKE ); pattern = 91; break; } else if( c == ' ' ) { cnt1 = 0; i++; if( i >= 5 ) i = 0; } } switch( i ) { case 0: if( i != j ) { printf( "停止中 \r" ); j = i; } speed2_f( 0, 0 ); motor_mode_f( BRAKE , BRAKE ); break; case 1: if( i != j ) { printf( "正転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_f( 50, 0 ); motor_mode_f( BRAKE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_f( 0, 0 ); motor_mode_f( BRAKE , BRAKE ); } else { cnt1 = 0; } break; case 2: if( i != j ) { printf( "逆転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_f( -50, 0 ); motor_mode_f( BRAKE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_f( 0, 0 ); motor_mode_f( BRAKE , BRAKE ); } else { cnt1 = 0; } break; case 3: if( i != j ) { printf( "正転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_f( 50, 0 ); motor_mode_f( FREE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_f( 0, 0 ); motor_mode_f( FREE , BRAKE ); } else { cnt1 = 0; } break; case 4: if( i != j ) { printf( "逆転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_f( -50, 0 ); motor_mode_f( FREE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_f( 0, 0 ); motor_mode_f( FREE , BRAKE ); } else { cnt1 = 0; } break; } break; case 141: printf( "右後ろモータをテストします。\n" ); printf( "スペースキーを押して動作を変えます。" ); printf( "0キーで終了です。\n" ); cnt1 = 0; i = 0; j = 1; pattern = 142; break; case 142: if( get_sci(&c) ) { if( c == '0' ) { speed2_f( 0, 0 ); motor_mode_f( BRAKE , BRAKE ); pattern = 91; break; } else if( c == ' ' ) { cnt1 = 0; i++; if( i >= 5 ) i = 0; } } switch( i ) { case 0: if( i != j ) { printf( "停止中 \r" ); j = i; } speed2_f( 0, 0 ); motor_mode_f( BRAKE , BRAKE ); break; case 1: if( i != j ) { printf( "正転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_f( 0, 50 ); motor_mode_f( BRAKE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_f( 0, 0 ); motor_mode_f( BRAKE , BRAKE ); } else { cnt1 = 0; } break; case 2: if( i != j ) { printf( "逆転50%% <-> ブレーキ動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_f( 0, -50 ); motor_mode_f( BRAKE , BRAKE ); } else if( cnt1 <= 2000 ) { speed2_f( 0, 0 ); motor_mode_f( BRAKE , BRAKE ); } else { cnt1 = 0; } break; case 3: if( i != j ) { printf( "正転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_f( 0, 50 ); motor_mode_f( BRAKE , FREE ); } else if( cnt1 <= 2000 ) { speed2_f( 0, 0 ); motor_mode_f( BRAKE , FREE ); } else { cnt1 = 0; } break; case 4: if( i != j ) { printf( "逆転50%% <-> フリー 動作中\r" ); j = i; } if( cnt1 <= 1000 ) { speed2_f( 0, -50 ); motor_mode_f( BRAKE , FREE ); } else if( cnt1 <= 2000 ) { speed2_f( 0, 0 ); motor_mode_f( BRAKE , FREE ); } else { cnt1 = 0; } break; } break; default: break; }