[H8-ML(5589)] H8Sで、16bitアクセス指定のレジスタに正しくアクセスできない件について
From: "PC-User" <ttn2ich24w@xxxxxxxxxxxxxx>
Date: 2005年06月14日(火)22時41分24秒
はじめまして。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経験者ゼロ)、とうとうこちらの皆様に
おすがりするしかなくなりました。不躾な質問で恐縮ですが、何とぞ知恵を
お貸し下けたら嬉しいです。よろしくお願い申し上げます。
スレッド概略
[表示中](起点)
 └[5590(1)]


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


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