小坂さんありがとうございました。
unsigned int timer は、C内で宣言されていますね.
ITUを使った方法でLEDを点滅させようとしたのですが、
割り込みからも参照する変数をCで宣言すると動作しません。
アセンブラ上でメモリ確保し、 exportしておくと動作するのですが、
WDTをインターバルタイマとして、使うときとさほど変わらないと思うのですが
グローバルなメモリ確保はC上からはできないのでようか?
resetv2.mar
;STARTUP ROUTINE H8/300H
;
.cpu 300ha:20 ;H8/300H advanced 1Mbyte MODE
.import _main ;外部関数mainを定義
.import _intimia1 ;外部関数intimia1を定義
; .export _cnt ;グローバル変数cntを定義
; .export _mode ;グローバル変数modeを定義
; .export _motor_time
.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 ;変数用アドレス
_cnt: .res.w 1 ;cnt変数のアドレスを確保
_mode: .res.w 1 ;mode変数のアドレスを確保
_motor_time: .res.w 1
.end
Cソース
include <3048f.h>
#pragma interrupt(intimia1)
/* exportだと動くが、C内でグローバル変数として宣言するとLEDは点滅しな
い。 */
unsigned int cnt; /*グローバル変数 startup.marでもexport宣言*/
unsigned int mode; /*グローバル変数 startup.marでもexport宣言*/
unsigned int motor_time;
/* メイン関数************************************************/
void main(void){
P1.DDR = 0xff; /* port1出力に設定 表示LED */
P2.DDR = 0x00; /* port2入力に設定 DIPSW */
P2.PCR.BYTE = 0xff; /* port2プルアップon */
P5.DDR = 0xff; /* port5出力に設定 表示LED */
P5.PCR.BYTE = 0x00; /* port5プルアップoff */
ITU1.TCR.BYTE = 0x23; /* GRAコンペアマッチ clock 1/8 */
ITU1.GRA = 0xffff; /* GRAを4e20に設定 約10ms*/
motor_time = 100;
ITU1.TIER.BYTE = 0xF9; /* ITU1のGRAによるコンペアマッチ割込みを許可*/
ITU.TSTR.BIT.STR1 = 0; /* カウント停止状態 */
ITU.TSTR.BIT.STR1 = 1; /* ITU1 TCNTカウント開始 */
cnt = 0; /* 割込み発生の回数を0にセット */
mode =1; /* 2bitLEDの表示のさせ方を1にセット */
while(1){
P1.DR.BYTE = P2.DR.BYTE; /* DIPSWを8bitLEDに表示 */
}
}
/*割り込み処理*********************************************/
void intimia1(void){
cnt++; /* cntの数を1つ増やす */
cnt = 0; /*カウンタを0に戻す*/
switch(mode){
case 1:mode = 0x02; /*表示が01なら10にする*/
break;
case 2:mode = 0x01; /*表示が10なら01にする*/
break;
default:mode = 0x01;/*それ以外なら01にする*/
}
P5.DR.BYTE = mode; /*2bitLEDを変化させる*/
ITU1.TSR.BIT.IMFA = 0; /* 割込み検知フラグを戻して再開 */
ITU1.GRA -= 0x500;
}