(toppers-users 1276) Re: H8/3048fでタイマ割り込みの仕方についての質問

taga r00h0211 @ kyoto-kcg.ac.jp
2003年 11月 27日 (木) 13:47:21 JST


皆様ご返答ありがとうございます。

以下の手順で試してみました。
/config/h8/akih8_3048f/sys_support.Sを
/config/h8/cpu_support.Sを参考に書き換えました。
具体的には以下の部分を付け加えました。
/////////////////////////////////////////////////////////////////
/*
 *  ハードウェア割り込み許可
 */

/*
 * タイマ -- 何もしない。
 */

 .globl _imia2_handler_enable_int
_imia2_handler_enable_int:
 rts

 .globl _imia3_handler_enable_int
_imia3_handler_enable_int:
 rts

/*
 *  ハードウェア割り込み禁止
 */


#define ITU2_TIMER  H8ITU2

#define ITU2_TIMER_CNT (ITU2_TIMER + H8TCNT)
#define ITU2_TIMER_TCR (ITU2_TIMER + H8TCR)
#define ITU2_TIMER_TIOR (ITU2_TIMER + H8TIOR)
#define ITU2_TIMER_IER (ITU2_TIMER + H8TIER)
#define ITU2_TIMER_IFR (ITU2_TIMER + H8TSR)
#define ITU2_TIMER_TSTR H8ITU_TSTR
#define ITU2_TIMER_GR  (ITU2_TIMER + H8GRA)

#define ITU2_TIMER_STR H8TSTR_STR0
#define ITU2_TIMER_STR_BIT H8TSTR_STR0_BIT
#define ITU2_TIMER_IE  H8TIER_IMIEA  /* interrupt mask */
#define ITU2_TIMER_IE_BIT H8TIER_IMIEA_BIT
#define ITU2_TIMER_IF  H8TSR_IMIFA  /* match flag */
#define ITU2_TIMER_IF_BIT H8TSR_IMIFA_BIT

#define ITU2_TIMER_TCR_BIT (H8TCR_CCLR0 | H8TCR_TPSC1 | H8TCR_TPSC0)
#define ITU2_TIMER_TIOR_BIT (0)

#define ITU3_TIMER  H8ITU3

#define ITU3_TIMER_CNT (ITU3_TIMER + H8TCNT)
#define ITU3_TIMER_TCR (ITU3_TIMER + H8TCR)
#define ITU3_TIMER_TIOR (ITU3_TIMER + H8TIOR)
#define ITU3_TIMER_IER (ITU3_TIMER + H8TIER)
#define ITU3_TIMER_IFR (ITU3_TIMER + H8TSR)
#define ITU3_TIMER_TSTR H8ITU_TSTR
#define ITU3_TIMER_GR  (ITU3_TIMER + H8GRA)

#define ITU3_TIMER_STR H8TSTR_STR0
#define ITU3_TIMER_STR_BIT H8TSTR_STR0_BIT
#define ITU3_TIMER_IE  H8TIER_IMIEA  /* interrupt mask */
#define ITU3_TIMER_IE_BIT H8TIER_IMIEA_BIT
#define ITU3_TIMER_IF  H8TSR_IMIFA  /* match flag */
#define ITU3_TIMER_IF_BIT H8TSR_IMIFA_BIT

#define ITU3_TIMER_TCR_BIT (H8TCR_CCLR0 | H8TCR_TPSC1 | H8TCR_TPSC0)
#define ITU3_TIMER_TIOR_BIT (0)

/*
 *  タイマ -- Compare Match フラグをクリアーする。
 */

 .globl _imia2_handler_disable_int
_imia2_handler_disable_int:
 mov.l #ITU2_TIMER_IFR, er0
 bclr #ITU2_TIMER_IF_BIT, @er0
 rts

 .globl _imia3_handler_disable_int
_imia3_handler_disable_int:
 mov.l #ITU3_TIMER_IFR, er0
 bclr #ITU3_TIMER_IF_BIT, @er0
 rts
/////////////////////////////////////////////////////////////////ここまで


それからコンフィギュレーションファイルに以下のような部分を付け加えました。
/////////////////////////////////////////////////////////////////
DEF_INH(32,{TA_HLNG,imia2_handler});
DEF_INH(36,{TA_HLNG,imia3_handler});

/////////////////////////////////////////////////////////////////ここまで


ソースファイルの方には以下のようにかきました(ポート番号の定義などは別のもの
を参考にしています)。
スイッチを押すと2つのLEDが点滅した後、タイマ割り込みでPA.DR.BIT.B4と
PA.DR.BIT.B6が1と0を交互に
出力し、2つのステッピングモータが回転します。
/////////////////////////////////////////////////////////////////
/*
 *  メインタスク
 */
void main_task(VP_INT exinf)
{

 volatile unsigned int counter;
 volatile int i;
 Init();

 for(;!SW1;); //スイッチ1押したらスタート
 LED1 = 1; LED2 = 0; //LED赤のみ点灯
 for(i = 0;i < 10;i++){
  for(counter = 0;counter<30000;counter++);
  LED1 = ~LED1; LED2 = ~LED2;
 }
 LED1 = LED2 = 0;  //一旦両方消灯


 ITU2.TIOR.BYTE = 0x00;    //  端子出力禁止
 ITU2.TCR.BYTE = 0x21;     // コンペアマッチ&分周期Φ1/2
 ITU2.TIER.BYTE = 0x01;    // ITUから割り込みをかける
 ITU2.GRA = 30000; // 割り込み時間定数の設定

 ITU3.TIOR.BYTE = 0x00;    //  端子出力禁止
 ITU3.TCR.BYTE = 0x21;     // コンペアマッチ&分周期Φ1/2
 ITU3.TIER.BYTE = 0x01;    // ITUから割り込みをかける
 ITU3.GRA = 5000;   // 割り込み時間定数の設定

 ITU.TSTR.BYTE = 0x0c;     // カウント開始


 MOTOR_EN = 1;           //モーターOff
 MOTOR_R = 0;       //前向き
 MOTOR_L = 1;         //前向き モーターが逆についている為

 while(1){
  slp_tsk();
 }
 syslog(LOG_NOTICE, "Sample task ends.");
 kernel_exit();
}


void imia2_handler(void){
 LED1 = ~LED1;
  PA.DR.BIT.B4 = ~PA.DR.BIT.B4;
}
void imia3_handler(void){
  LED2 = ~LED2;
  PA.DR.BIT.B6 = ~PA.DR.BIT.B6;
}
/////////////////////////////////////////////////////////////////ここまで

ところが、LEDは二つとも点滅するし、モータもゆっくりとは回転するのですが、な
ぜかGRAの値を変えても
スピードが変わらないのです(GRAの値を小さくすれば本来スピードが上がるは
ず)。
LEDがつくしモータも回転するのでimia2_handler()とimia3_handler()が呼ばれてい
るのは確かだと思うのですが・・・。


京都コンピュータ学院洛北校
情報工学科 多賀 創