[H8-ML(5733)] Re:H8/3069 タイマーカウンターが作動しません
From: "masanobu_suzuki" <signas@xxxxxxxxxxxxxxx>
Date: 2005年11月06日(日)17時58分20秒
鈴木と申します。
私もイエローソフトのユーザー(IDEver6.38)ですが、
気になる点を順不同で少し。

1)割り込みで使う関数のプロトタイプ宣言は?
 void interrupt timer(void);
が全ての関数の前に必要では?
割込みのベクターNO.をtimer名で定義してあれば、コン
パイラでエラーしないのかもしれませんが、取説では宣
言する約束になっていたように思います。
コンパイルでエラーしなければOKですが、こうして宣言
しておいた方が自分でもわかり易いです。 

2)割込み関数timer()について
カウンタによる割込みはTSRレジスタのIMFは必ず"1"にセット
されてここへ飛んできますので、条件判断する必要はなく、
 ①TSRレジスタを1回読む
 ②TSRレジスタのIMFビットを"0"にして書き込む
を実行します。
但し、イエローでは(今はどうかわかりませんが)
 ITU.TISRA.BIT.IMFA1 = 0;
のような構造体を使ったビットアクセスは推奨していないようです。
特に日立などのヘッダファイル(構造体を定義しているファイル)
をそのまま使えるのかは不明です。(メーカに確認必要かと)
私は、使っていませんので単純にIMFAビットをゼロにする場合
TSRn&=~0x01; としています。(nはカウンタNo.)

3)カウンタのスタートは、どこでしていますか?

4)プログラムの考え方について
LCD_DisplayNumber(n)が、メインと割込みの2箇所にでて
きますが、割り込みの中にまとめた方が良いのでは?
メインルーチン(永久ループ)では、条件判断により常に
何かを表示する?LCDの表示ルーチン?が呼ばれていま
すが、逆に言うと割込みが入らない間はひっきりなしに呼ば
れ続けられています。
できれば、メインルーチンは何も書かず、割込みの中で何を
表示するかを決めてLCDのルーチンを呼んだ方がわかり易い
かと思います。
尚、割込みルーチンの中で使う変数はスタティック変数で宣言
しないと内容が保持されませんので注意して下さい。

5)デバッグ方法について
①割込みのデバッグを行う場合は、できるだけ不必要な部分
は削除し、シンプルな形にします。例えば、CPUリセット後、レジ
スタでデフォルトになっていて設定する必要がないものはコメン
トに。
②確実に動くものだけでチェックする
今回LCDの関数を使われていますが、これは確実に動いた
のでしょうか?動かないかもしれないものをベースにデバッグ
をしても意味がありません。
LCDを使わずとも、シンクロがあれば適当なI/Oに1,0を交互に
書き込むだけでもチェックができます。
③通信を使ったデバッグ方法
イエローではprintf文を挿入するだけで、何か文字をPCへ送って
くれますので最も簡便で強力な方法です。
まず、これができるような環境を構築してください。
(Hello world! が表示できていれば、もう構築できています)

鈴木

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


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


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