にほんブログ村 その他趣味ブログ 電子工作へ

2009年06月26日

非同期タイマーの実現


モッパーです。

Ticolla CDE でモータドライバを定義せずに(ロボデザイナのPWMモーター制御を使用せずに)、非同期タイマーを実現する手法が分かりました。これで CN7-CN10 がモーター制御から開放された状態(= モーター以外のセンサー等が接続出来る状態)で割り込みによる非同期タイマーを実現出来ます。
ただし、本当は Ticolla CDE の PWM 初期化を流用していて、ネイティブなタイマー定義をしているわけではないので、ちょっとズルです。私の知力の限界なのでこんなくらいで許して下さい。
モータの PWM 制御をしながら非同期タイマー実現するなら、こちらの記事に書かれている手法のほうが有効です。
また、TCH2 と TCH3 (JRT104 で追加されているタイマーチャネル 2 と 3 ) の活用についても調べましたが、TCH2 と TCH3 が I2C 通信を行っているポートと重複しますので、I2C 通信をしながら TCH2 と TCH3 を併用することは無理だというのが私の結論です。


main.c では以下のような感じ。このブログのエディタは TAB を無視するんでインデント無くなってますけど、我慢して修復して下さい(笑)。


/*--------------------------------------------------------------------------------*/
/* Variable declaration                                                           */       
/*--------------------------------------------------------------------------------*/

extern byte count0;
extern byte second0;

/*--------------------------------------------------------------------------------*/
/* Prototype declaration                                                          */       
/*--------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------*/
/*  main                                                                          */
/*--------------------------------------------------------------------------------*/

void main(void) {
 init();  //Initialization
 PWM2_INIT();

 INTERRUPT_INIT();
 
 CH0IE = 1;

 while(1){
  LED_OUT(second0);
  COPCTL = 0; 
 }
}

interrupt.c は以下のような感じ。

/*--------------------------------------------------------------------------------*/
/* Variable declaration                                                           */       
/*--------------------------------------------------------------------------------*/

byte count0 = 0;
byte second0 = 0;

/*--------------------------------------------------------------------------------*/
/* Prototype declaration                                                          */       
/*--------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------*/
/* ADC_Interrupt - ADC Conversion Complete Interrupt                              */       
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _ADC_Interrupt(void) {
 __DI();
 

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* KBD_Interrupt - Keyboard Wakeup                                                */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _KBD_Interrupt(void) {
 __DI();
 

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* timer_overflow_isr - The timer rolls over every 256T counts                    */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _TOF_Interrupt(void) {
 __DI();
 

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* Timer Channel 0 - Timer Channel 0 Interrupt                                    */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _TCH0_Interrupt(void) {
 __DI();
 
 CH0F = 0;
 count0++;
 if ( count0 >= 48 ) {
  second0++;
  count0 = 0;
 }

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* Timer Channel 1 - Timer Channel 1 Interrup                                    */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _TCH1_Interrupt(void) {
 __DI();
 

 __EI();
}


/*--------------------------------------------------------------------------------*/
/* IRQ interrupt                                                                  */
/*--------------------------------------------------------------------------------*/

//#pragma TRAP_PROC
void _IRQ_Interrupt(void) {
 __DI();
 

 __EI();
}

上記の処理で、約 1/48 秒単位で割り込みがかかりますので、count0 は 0〜47 までを 約 1/48 秒単位で周期的にカウントアップし、second0 は約一秒単位でカウントアップしていきます。
そろそろ私自身の趣味の範囲内での、ロボデザイナ+Ticolla CDE をしゃぶりつくす旅は終わりにしたいと思います。いやいやロボデザイナは本当に美味しかったです。私が小中学生だった頃の 8bit ワンボードマイコンの回路やBIOS解析そのまんまの世界に加えて C言語 + Java + I2C といった最近の技術を学べました。ごちそうさまでした。H/W としては、電源弱いようなのでそこだけはおしゃぶりポイントはまだ残るかも。
次は PSoC あたりで遊ぶかな ? それとも積年の夢だった FPGA に逝くか ? Arduino も良いですね。
posted by モッパー at 20:59| Comment(0) | TrackBack(0) | ロボデザイナー
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/30099254
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
にほんブログ村 その他趣味ブログ 電子工作へ