[H8-ML(4256)] ITUタイマと、変数
From: "K.Mekata" <r9603536@xxxxxxxxxxxxxxx>
Date: 2003年12月23日(火)15時28分14秒
小坂さんありがとうございました。

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;
}


スレッド概略
[表示中](起点)


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]