HEWの組み込み関数set_imask_ccr()で割り込みのマスクと許可を使用としました。
しかし、set_imask_ccr(0)でも割り込みが継続しません。
include <_h_c_lib.h >を入れてもダメでした。
set_imask_ccr(0) マスク
set_imask_ccr(1) 許可としたときは
1回だけ割り込みが入ったような気がします。
どこかのF&AでCCRのIレジスタは割り込みのたびにクリアしなければならない。
ようなことが書いてありました。しかし、マニュアルでは一言も書いてありません。
またサンプルでも割り込みでクリアした例もありません。
H8/3694を使っており、HEWのバージョンは4.06.00.047です。
この環境では上記組み込み関数は使えないのでしょうか。
よろしくお願いいたします。
どのようなソースを書かれてどのようなコードが生成されてますか?
ソースは仕事で使っている実際のものなので、テスト用に簡単なものを作成してみます。
少し、お時間をください。
sakuraisanさま、こんにちはNAKAといいます。
H8はかなり前にしか使ってませんでしたので、記憶違いでしたらごめんなさい!set_imask_ccr()を使うなら、#include <machine.h>が必要だったような気がします。確認ください。
何の割り込みなのでしょうか?
割り込みによっては割り込み要求フラグをクリアしないと、次の割り込みがかからなかったり、割り込みルーチンをを抜けてもすぐに割り込みルーチンに戻ってくるはず。
set_imask_ccrは操作する必要はありません。
ソースを作ってテストしてみました。
問題なく動きました。
プログラムは一部を下記に入れました。
メインで_di(),wait,_ei(),waitを繰り返します。
10msのタイマー割り込みがメインの_di()のとき、
割り込みが入らないことを確認しました。
set_imask_ccr()はdi(),ei()の中で使用しています。
割り込み時のポート出力と、メインでのポート出力をオシロで確認しました。
あとは仕事で作成しているプログラムでなぜ、動かないのか
じっくり検討してみます。
ありがとうございました。
void main( void )
{
unsigned int i1,i2;
BYTE chg = 0;
for( i1=0; i1<16250; i1++ ){
for( i2=0; i2<20; i2++ );
}
_di( );
InitPort();
InitTimer();
InitIrqControl( );
WdOnReset( ); // ウォッチドック タイマー 初期化
chg = 0;
_ei( );
for( ;; ){ //------------- 永久ループ----------------
if( T50mS ){ // 50mSec. ごと
T50mS = 0; // フラグクリヤー
if( T10mS ){ // 10mSec.ごと
T10mS = 0; // フラグクリヤー
_di();
IO.PDR2.BIT.B1 = 1;
for( i1=0; i1<65000; i1++ ){
WdOnReset( ); // ウォッチドック リセット
IO.PDR2.BIT.B1 = 0;
_ei();
} //--------------------------------------
/************************************************
** << 割り込み禁止 >> **
** **
************************************************/
void _di( void )
set_imask_ccr(1);
** << 割り込み許可 >> **
void _ei( void )
set_imask_ccr(0);
//--------------------------------
// 10mSec. 割り込み ルーチン
void Timer_W( void ) // (V:21)
TW.TSRW.BYTE &= 0x70; // タイマ-・ステータス・レジスタ (STR0) 設定
T10mS = 1;
iwCnt++;
if( iwCnt >= 5 ){ // 5回なら
iwCnt = 0;
T50mS = 1; // 50mSec. フラグ ON
IO.PDR2.BIT.B2 ^= 1;