目次

初期化

 本ボードは、PICを利用しているため、次の
  初期化が必要になります。
  1. ポート初期値
  2. ポート入出力方向
  3. タイマー0動作
  4. 変数初期値
  5. 割込み
初期化全体を取り仕切る関数を定義します。 void initialize(void) { initialize_port_values(); initialize_port_directions(); initialize_timer_0(); set_others(); enable_each_interrupts(); }

ポート初期値

サーボモータを動かす前に、すべての出力を1にします。 これで、サーボモータへの出力は、0となりモータは動き ません。 void initialize_port_values(void) { a_port = 0xff ; b_port = 0xff ; c_port = 0x3f ; }

ポート入出力方向

A、B、Cの各ポートは、次のように利用します。 上記の内容から、16進で各ポートの入出力方向を設定します。 void initialize_port_directions(void) { /* no A/D contervers */ setup_adc_ports( NO_ANALOGS ); /* PORT A out out in in in in */ set_tris_a( 0x0f ); /* PORT B out out out out out out out out */ set_tris_b( 0x00 ); /* PORT C in out out out out out out out */ set_tris_c( 0x80 ); }

タイマー0動作

タイマーは、0xffから0x00に変化するときに、割込みを 発生させます。ステートマシンを、100usごとに動かす ための検討をします。 20MHzをシステムクロックすると、タイマーに入力 されるクロック周波数は、5MHzが最高になります。 プリスケーラは、2、4、8、16、32、128、256 分周するため、2.5MHz(=2/5us)で内部カウンタを+1 します。 2/5us × ? = 100usから250と計算できます。 タイマー割込みが発生する度に、内部カウンタに256-250 =6を設定し直します。 void initialize_timer_0(void) { /* set TMR0 6 (256-250) */ set_timer0(6); /* set prescaler */ setup_counters( RTCC_INTERNAL , RTCC_DIV_2 ) ; /* 20MHz -> timer0 clock 5MHz -> 5MHz / 2 2/5 us * 250 = 100us */ }

変数初期値

初期化が必要な変数を列挙します。 それぞれを所定の値にします。 void set_others(void) { UBYTE loop ; /* state machine */ state = 0 ; /* buffer index */ s_idx = 0 ; /* set servo initial value */ for ( loop = 0 ; loop &t; CHA_MAX ; loop++ ) { ch[loop] = MID_VALUE ; } /* set serial buffer */ for ( loop = 0 ; loop &t; SMAX ; loop++ ) { sbuf[loop] = 0 ; } /* clear flags */ sflag = OFF ; tflag = OFF ; /* get block number */ offset = a_port & 0x0f ; }

割込み

受信、タイマーの割込みを許可した後に、全体の 割込みを許可します。 void enable_each_interrupts(void) { enable_interrupts( INT_RDA ); enable_interrupts( INT_RTCC ); enable_interrupts( GLOBAL ); }

目次

inserted by FC2 system