目次
前
次
初期化
本ボードは、PICを利用しているため、次の
初期化が必要になります。
- ポート初期値
- ポート入出力方向
- タイマー0動作
- 変数初期値
- 割込み
初期化全体を取り仕切る関数を定義します。
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の各ポートは、次のように利用します。
- A5 -> servo motor signal #15
- A4 -> servo motor signal #14
- A3 -> DIP bit 3
- A2 -> DIP bit 2
- A1 -> DIP bit 1
- A0 -> DIP bit 0
- C7 -> RxD
- C6 -> TxD
- C5 -> servo motor signal #13
- C4 -> servo motor signal #12
- C3 -> servo motor signal #11
- C2 -> servo motor signal #10
- C1 -> servo motor signal #9
- C0 -> servo motor signal #8
- B7 -> servo motor signal #7
- B6 -> servo motor signal #6
- B5 -> servo motor signal #5
- B4 -> servo motor signal #4
- B3 -> servo motor signal #3
- B2 -> servo motor signal #2
- B1 -> servo motor signal #1
- B0 -> servo motor signal #0
上記の内容から、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 );
}
目次
前
次