はじめまして。H8初心者のマッチ箱と申します。
現在、開発環境にYellow-IDEを使い、H8S-2238のプログラムを作っている
ところなのですが、タイマパルスユニット0(TPU)のTGRAレジスタにアクセス
できなくて困っております。
H8-3048では、ITUのジェネラルレジスタはGRA_HとGRA_という1対の
8bitレジスタだったのですが、H8Sではこれが1つの16bitレジスタに統合
されてしまい、データシートにも「TGRAとTCNTは16bitアクセスのみ。
8bitアクセスは禁止。」と書かれています。
そこで、以下のようにプログラムを組んだのですが、どうしてもTGRA_0に
まともにアクセスできず、数値が設定できません。
タイマパルスユニット0関係のレジスタ定義部
#define TSTR (*(volatile unsigned char *)0xFFFEB0)
#define TCR_0 (*(volatile unsigned char *)0xFFFF10)
#define TIER_0 (*(volatile unsigned char *)0xFFFF14)
#define TSR_0 (*(volatile unsigned char *)0xFFFF15)
#define TCNT_0 (*(volatile unsigned int *)0xFFFF16)
#define TGRA_0 (*(volatile unsigned int *)0xFFFF18)
↑
TCNTとTGRAは16bitアクセスなのでポインタの型をintとした。
タイマパルスユニット0の設定部(抜粋)
TCR_0 = 0x21 ; /* カウントクリア条件:TGRAコンペアマッチ
クロックエッジ:L→H
プリスケーラ:4分周 */
TGRA_0 = 0xABCD; // GRAに43981(=0xABCD)をセット
TIER_0 = 0x01 ; // TGRAコンペアマッチ割り込みを有効とする。
TSTR = 0x01 ; // 全TPU共通レジスタ。TPU0をカウント開始とする。
リモートデバッガで、TGRA_0レジスタの値がセットされる瞬間を監視して
みましたが、セットしたい値である0xABCDのうち、下位のCDだけしか
セットされないような状況です。(結局、8bitアクセスしかできてない様子。)
なぜなのでしょう?
コンパイラが吐き出したアセンブラコードを調べてみましたところ、
TGRA_0 = 0xABCD; // GRAに43981(=0xABCD)をセット
の行に相当する部分は、
MOV.W #H'ABCD,R0
MOV.L #H'00FFFF18,ER1
MOV.W R0,@ER1
となっていました。これでなぜTGRA_0に0xABCDがセットできないのか
不思議でなりません。
周囲の誰にも聞けない状況で(H8経験者ゼロ)、とうとうこちらの皆様に
おすがりするしかなくなりました。不躾な質問で恐縮ですが、何とぞ知恵を
お貸し下けたら嬉しいです。よろしくお願い申し上げます。