(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()が呼ばれてい
るのは確かだと思うのですが・・・。
京都コンピュータ学院洛北校
情報工学科 多賀 創