先ほどの質問について丁寧なご回答をありがとうございます。
少しではありますが、CCRについて理解できました。メイン関
数内では割り込み処理は出来ないというご指摘をいろいろな方
々から受け、改めてプログラムを作り直しました。
#include <3048f.h>
#pragma interrupt(intimia1)
extern unsigned int cnt0; /* 信号
のHighの時間を記憶 */
void main(void)
{
cnt0 = 0; /* cnt0
初期化 */
PA.DDR = 0x00; /* Port-A
は入力設定 */
PB.DDR = 0xff; /* Port-B
は出力設定 */
ITU.TSTR.BYTE = 0x00; /* ひとまず全タイマー停止
*/
ITU.TSNC.BYTE = 0x00; /* 全タイマーは独立動作 */
ITU.TMDR.BYTE = 0x00; /* ITUはすべて通常動作 */
ITU.TFCR.BYTE = 0x00; /*
ITU3,4およびGRA3,4,GRB3,4
は通常動作 */
ITU.TOER.BYTE = 0x00; /* ITU3,4による端子出力は
禁止 */
ITU.TOCR.BYTE = 0xff; /* 外部トリガ禁止 */
ITU1.TCR.BYTE = 0x83; /*
クロックの1/8で動作。TCNT
のクリア禁止 */
ITU1.TIOR.BYTE = 0xdf; /* 両エッジでGRAへインフ
゜ットキャプチャ */
ITU1.TIER.BYTE = 0x03; /* IMFA,IMFBによる割り込
み許可 OVIE禁止 */
ITU1.TSR.BYTE = 0x00; /* 全割り込みフラグクリア
*/
ITU1.TCNT = 0x00; /* カウントクリア */
ITU1.GRA = 0; /* GRA初期値設定 */
ITU.TSTR.BIT.STR1 = 1; /* ITU1スタート */
while(1){
PB.DR.BYTE =PA.DR.BYTE;
}
}
void intimia1(void){
if(PA.DR.BIT.B2){ /* 立ち上がりエッジの場合 */
ITU1.TCNT = 0x00;
} /* カウントをクリア */
else{ /* 立ち下がりエッジの場合 */
cnt0 = ITU1.GRA; /* 値をcnt0
に記憶 */
}
ITU1.TSR.BIT.IMFA = 0; /* 割り込みフラグ解除 */
}
ところでCCRの設定についてなのですが、次のスタートアップ
ルーチンの、init:の2行目のldc #0,ccr ;CLEAR INTERRUPT
MASK,NOT USE UI BIT
は、「CCRに割り込み許可を与えている」という意味でいい
のでしょうか?そう僕は解釈しているのですが...。そのた
め上のメインプログラムには記述しませんでしたが、やはり記
述すべきでしょうか?
;STARTUP ROUTINE H8/300H
;
.cpu 300ha:20 ;H8/300H advanced 1Mbyte MODE
.import _main ;外部関数mainを定義
.import _intimia1 ;外部関数intimia1を定義
.export _cnt0 ;グローバル変数cnt0を定義
;
.section vect,data,locate=h'00000 ;割込みベクトルの頭
;
;割り込みベクトルテーブル
.data.l init ;1 reset vectのジャンプ先
;
.org h'0070 ;ITU1 GRAによる割込みテーブル位置
.data.l _intimia1 ;ITU1 GRAによる割込み処理先
;
.org h'00100 ;主プログラムの開始
init: mov.l #h'fff10,er7 ;SPの設定
ldc #0,ccr ;CLEAR INTERRUPT MASK,NOT USE UI BIT
jmp @_main ;関数mainへのジャンプ
.section D,DATA,locate=h'ffd00 ;変数用アドレス
_cnt0: .res.w 1 ;cnt0変数のアドレスを確保
;
.end
またまた長い文になりましたが、どうぞご説明をお願いします
。
__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/