• ベストアンサー

SH7144のMTU割り込みについて

マイコン初心者です。 現在SH7144の勉強を行っているのですが、MTUによる割り込みが上手くできずに困っています。 開発環境はGCC Developer Liteになります。 下記にソースを示します。 #include<7144.h> void initIO(void) { PFC.PECRL2.WORD = 0x0000; //ポートEの7~0を入出力に設定 PFC.PEIORL.WORD = 0xffff; //ポートEの15~0を出力に設定 } void initMTU(void) { MST.CR2.BIT._MTU = 0; //MTUモジュールスタンバイの解除 MTU0.TSR.BIT.TGFA = 0; //TGFAフラグクリア MTU0.TCR.BYTE = 0x22; //TGRAのコンペアマッチでクリア //PΦ/16でカウント=1562.5kHz MTU0.TMDR.BYTE = 0xC0; //TGRA通常動作 MTU0.TIER.BYTE = 0x41; //MTU0のTGIEAコンペアマッチで割り込み MTU0.TGRA = 1562; //パルス周期設定(1562.5kHz/出力周波数1kHz=1562回) INTC.IPRD.BIT._MTU0G = 15; //割り込み要因MTU0のTGIプライオリティ15 MTU.TSTR.BIT.CST0 = 1; //MTUカウンタ動作開始 } void int_tgi0a(void) { static int d = 1; MTU0.TSR.BIT.TGFA = 0; //TGFAフラグクリア PE.DRL.BIT.B0 = d; //PE0に出力 d = ~d; //dの値を反転 } void main(void) { initIO(); initMTU(); while(1); } プログラムはMTU0のTGIEAコンペアマッチで割り込み、PE0の出力を反転する動作を考えて書きました。 ご教授の程をお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • anzu-k
  • ベストアンサー率66% (2/3)
回答No.2

あなたの記述したものが、上記ソースで全てであるならば、 1つ気付いたことがあります。 SH2にはSRレジスタと言うものがありますが、SR内のI0bitからI3bitの初期値(リセット直後)は"1111"となっています。 つまり、割込みマスクが最大の状態ではじまるので、割込みがすべて弾かれます。 通常マイコンは、リセット直後にて、一部(NMI等)を除き割込みが全て禁止状態になっている場合が多いです。 これは単に割込み許可やらレベルやらのレジスタだけではなく、 SH2ならば上記のように割込みマスクが最大レベルになっていたり、 マイコンによっては全割込みを制御できる1つのフラグにより、禁止されていたりします。 (また、1箇所で全割込みをコントロールできると何かと便利なのですよ。) あなたのやったように初期化コードで割り込みレベルや割り込み許可を設定した後に、全割り込みを許可してやります。 コントロールレジスタを書き換えるので、インラインアセンブラを使用しなければならないかもしれません。 ストア命令で(STC ?)I0bitからI3bitを0にしてやれば良いかと思います。 #define _EI() __asm("stc ほにゃらら")__ /*割り込み許可(EnableのEとInterruptのIです)*/ #define _DI() __asm("stc ほにゃらら")__ /*割り込み禁止(DisableのDです)*/ のようにマクロにしているのをよく見ますし、私もそうしたりします。 ただ、gccでインラインアセンブラを使ったことがないので、「ほにゃらら」部分は分かりません。 何かのサンプルプログラムやどこかのサイトにあるかも知れないので探してみて下さい。 (誰かズバリ回答してくれるのを願ってます。インクルードされている"7144.h"の中にあったらいいですね。) とかいている最中に、回答があったようですね。set_imask(0)がそうだと思います。 私はSH2も使用したことがなければ、GCCでの組み込みプログラミングもしたことがありません。 しかしながら、H8やM16C、M32C等のマイコンのプログラミング経験はあります。 また何故か7144のデータシートを持っていたり…。 勉強がてら、クイズだと思って答えてみました。参考になれば幸いです。

maa_teru
質問者

お礼

貴重なアドバイスありがとうございました。 貴重なアドバイスの3割位しか理解できなかった自分自身にちょっと脱力、anzu-kさんのご回答を読んだ後、ハードウェアマニュアルで再度勉強しました。 SH2の割込みを使う為には、下記三点の手順を踏む必要があるということと理解しました。 (1)SRレジスタのI0bit~I3bitマスクを解除 (2)INTCレジスタでプライオリティレベルを設定 (3)MTUなど各機能ごとに割り込み要因を設定 今回の問題では(1)が抜けていたということで、set_imask(0)を探したら見つからないよどうしよう・・・orz インラインアセンブラも分らないよ(泣)どうしよう・・・orz などとやっているうちに"7144.h"の中にSetSRReg()というものを発見! なんとか割込みできるようになりました。 ありがとうございました。

その他の回答 (3)

  • anzu-k
  • ベストアンサー率66% (2/3)
回答No.4

ANo.2の訂正です。本当に済みません。 STCではなくLDCでした。 割り込み許可するためには、例えば asm(" ldc $0x0,sr "); とすればいいのかも知れません。

  • anzu-k
  • ベストアンサー率66% (2/3)
回答No.3

度々申し訳ありません。 ANo.2の補足です。今後のための補足です。 今のところ必要ないかも知れませんが、色々な割り込みレベルを使用した多重割り込みを使用する場合、 EI()で、SRレジスタをスタックに積んでから、SRレジスタのI0からI3bitを"1111"にして、 DI()では、逆にスタックに積んだものをSRレジスタに戻すっていう方法なんかもありますよ。 (もちろんEIとDIの呼出は対になってないととんでもないことになりますが…) こうすると、割り込みハンドラ内など、割り込みレベルに関わらず使えます。 しかし、SH2ってPUSH命令とPOP命令がなさそう(そうだったのか!)だから、 通常のスタックポインタがどのレジスタなのかどうかで、インラインアセンブラのやり方がかわりそうですね。 つまり、コンパイラに依存しそうです。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.1

調べ方ですが、ルネサスの「アプリケーションノート」という分類で サンプルドキュメントが公開されています。 らしいものを探して、なにが 違うか比較するといいと思います。 ざっとみたところ、サンプルと違う部分として、 P_MTU0.TIORH_0.BYTE = 0x00; set_imask(0); // これはGDLだと EI; だったと思う。 がないみたいだと思いました。

maa_teru
質問者

お礼

貴重なアドバイスありがとうございます。 ルネサンスのHPでアプリケーションノート見つけました。 ヽ(´▽`)ノYYヽ(´▽`)ノ・・・ルネッサ~ンス set_imask(0);がうまく見つけられなかったのですがヘッダーファイル"7144.h"の中にset_imask(0)と近い記述のSetSRReg()を見つけ、なんとか割込みできるようになりました。 ありがとうございました。

関連するQ&A

  • タイマーが動作しません

    H8/3052を使っていろいろ動作させようと考えてます、 タイマー割り込みのところで詰まっていますが、タイマー割り込みを使ってLEDを反転するというプログラムです。 結果、LEDが反転しないつまり、タイマー割り込みが動作してないのではないかと考えています。 うちが使いたいタイマーはウオッチドッグタイマです。イエローで、C言語を使っています。 皆様の知識をお借りしたいです。 //20msごとに割り込み、50回の割り込みでLED点灯反転 #include <3048.h> //3048、3052の内部I/O定義 #include <sysio.h> int c; //割り込み回数、外部変数とする //ITUインターバルタイマ割り込み void int_imia0(void) { ITU0.TSR.BIT.IMFA = 0; //割り込みステータスフラグクリア c-=1; if(c==0){ P5.DR.BYTE = ~P5.DR.BYTE; //LED出力データを反転 c=50; } } int main(void) { P5.DDR = 0xff; ITU0.TCR.BIT.CCLR = 1; //カウンタクリア要因 ITU0.TCR.BIT.TPSC = 3; //タイマプリスケーラ25MHz/8=3.125MHz ITU0.GRA =62499; //3.125MHz/62,500=50Hz、周期20ms ITU0.TIER.BIT.IMIEA = 1; //IMFAフラグによる割り込み許可 ITU.TSTR.BIT.STR0 = 1; //タイマスタート P5.DR.BYTE = 0xff; //LED出力データ初期値 c=50; //割り込み回数 _ei(); //割り込み許可 while (1); //何もしない } 動作できない為、ご指摘よろしくお願いします。

  • モータの制御

    //ステッピングモータの回転 //右に2回転、停止、左に1回転、停止これを3回繰り返す //ITUO使用、フラグが立つのを待つ //10msごとにモータに出力 //str_4.c #include <3048f.h> void ioinit(void) { PB.DDR = 0xff; } void ituinit(void) { ITUO.TCR.BIT.CCLR = 1; //カウンタクリア要因 ITUO.TCR.BIT.TPSC = 3; //タイマプリスケーラ 25MHz/8=3.125MHz ITUO.GRA = 31249; //3.125MHz/31250=100Hz、10ms、100pps ITUO.TIER.BIT.IMIEA = 0; //IMFAフラグによる割り込み禁止 } void wait(void) //停止時間 { Long t=200000; while(t--); } int main(void) { int i = 3; //繰り返しカウンタ int p; //回転パルス数 int md = 0x11; //モータ出力データ ioinit(); ituinit(); PB.DR.BYTE = md; wait(); ITU.TSTR.BIT.STR0 = 1; //タイマスタート while(i--){ for(p=0;p<96;p++){ //2回転 PB.DR.BYTE = md; md <<= 1; //右回転 if(md == 0x110) //4回シフトしたかの判断 md = 0x11; //4回シフトで初期値に戻す while(!ITU0.TSR.BIT.IMFA); //フラグが立つのを待つ ITU0.TSR.BIT.IMFA = 0; //フラグクリア } wait(); //少し停止 for(p=50;p>0;p--){ //1回転、1パルス多くした PB.DR.BYTE = md; md >>= 1; //左回転 if(md == 0x08) //4回シフトしたかの判断 md = 0x88; //4回シフトで初期値に戻す while(!ITU0.TSR.BIT.IMFA); //フラグが立つのを待つ ITU0.TSR.BIT.IMFA = 0; //フラグクリア } wait(); } PB.DR.BYTE = 0x00; //モータ励磁OFF while(1); //ここでとまっている } このプログラムのフローチャートがわかりません。

  • H8SX/1655のタイマー割り込みについて教えてください。

    H8SX/1655のタイマー割り込みについて教えてください。 CQ出版の『今すぐ使える!H8マイコン基板』の基板の動作確認として、 基板上のLEDをタイマー割り込みで点滅させようとしたのですが動作しません。 HEWの設定上の問題と思いますが、思い当たるところがあれば教えてください。 HEW:Version 4.06.00.047 "iodefine.h"は自動生成されたものです。 ---HEWのコード #include <machine.h> #include "iodefine.h" unsigned long cnt0; // wait関数用 //割込み関数 #pragma interrupt( int_timer0 ) void int_timer0( void ) { TPU0.TSR.BIT.TGFA= 0; // フラグクリア cnt0++; } void wait( unsigned long wait_set ) { cnt0 = 0; while( cnt0 < wait_set ); } void main(void) { MSTP.CRA.BIT._TPUL =0; // 低消費電力モード解除 //タイマー設定 TPU0.TCR.BYTE = 0x23; //φ/64 TPU0.TIER.BIT.TGIEA = 1; TPU0.TGRA = 375; // 1/375 TPU.TSTR.BYTE = 0x01; // Timer Start //ポート設定 PM.DDR = 0x08; // LED Output port //割り込み許可 set_imask_ccr(0); while(1) { wait( 500 ); PM.DR.BIT.B3 = 1; wait( 500 ); PM.DR.BIT.B3 = 0; } } //intprg.c // vector 88 TGI0A TPU0 //__interrupt(vect=88) void INT_TGI0A_TPU0(void){/* sleep(); */} __interrupt(vect=88) void INT_TGI0A_TPU0(void){int_timer0(); }

  • SH7144でパルス幅を測定したい。

    マイコン初心者です。 SH7144でPIOに接続された信号のパルス幅を測定したいです。 ネットで検索をしてH8-3048のサンプルプログラムを見つけたのですが、 SH7144への変更のしかがたが分かりません。 どなたか分かる方がいましたらお教えください。 初心者ですので、具体的に教えていただけると助かります。 ちなみに、下記がネットで見つけたH8-3048でのプログラムです。 宜しくお願いいたします。 /* メイン関数************************************************/ int main(void){ long counter; P1.DDR = 0xff; // port1出力に設定 表示LED PA.DDR = 0x00; // portA入力に設定 パルス入力用 ITU1.TCR.BYTE = 0x23; // GRAインプットキャプチャ,カウンタクリアGRA clock 1/8 ITU1.TIOR.BYTE = 0xCD; // GRA立下り,GRB立ち上がりインプットキャプチャ ITU.TSTR.BIT.STR1 = 0; // カウント停止状態 while(1){ while(PA.DR.BIT.B4 == 0){} // 入力パルス立ち上がり検知 ITU.TSTR.BIT.STR1 = 1; // ITU1 TCNTカウント開始 while(ITU1.TSR.BIT.IMFA == 0){} // GRAキャプチャ,パルス立下り検知 ITU1.TSR.BIT.IMFA = 0; // フラグをクリア ITU.TSTR.BIT.STR1 = 0; // ITU1 TCNTカウント停止 counter = ITU1.GRA; // カウント値の取得 P1.DR.BYTE = counter >> 4; // 8bitシフトさせP1に表示 } }

  • Insightでデバックする際にSIGBUSでエラーになりデバックが進みません

    初めて質問します。 マイコン初心者です。 現在、GCC Developer Liteを使用してSH7144の勉強をしているのですが、付属のデバッカのInsight(GDB6.1)でデバックしようとすると、"Program received signal SIGBUS, Bus error"というエラーが出てデバックが進まなく困っています。コンパイルしたソースを実機で動かすと動いている為、コンパイルの方法が悪いのか、Insightが悪いのかわからない状態です。 下記にソースファイルを示します。 #include <7144.h> void initIO(void) { PFC.PEIORL.WORD = 0x0003; } void wait(void) { long int t=1000000; while(t--); } void main(void) { initIO(); while(1) {  PE.DRL.BIT.B0 = 1;  wait();  PE.DRL.BIT.B0 = 0;  wait();  PE.DRL.BIT.B1 = 1;  wait();  PE.DRL.BIT.B1 = 0;  wait(); } } プログラムはマイコンに接続したLEDを点滅させるプログラムです。 GCC Developer Liteでのコンパイルオプションはデフォルト、マイコンは"SH7144F 内蔵フラッシュROM"を選択しています。 御教授の程よろしくお願いいたします。

  • H8マイコンで割り込みが任意の周期で設定できない

    タイマーVで主にTV.TCRV0.BIT.CKS, TV.TCRV1.BIT.ICKS,TV.TCORAで設定すると思うのですが任意の周期になりません。 特に~~~に入る文がタイマーVによって設定した割り込み周期ごとに処理するように作成したのですが,うまくいきません。使用しているマイコンはH8の3694です。 作成したプログラムは以下の通りです。お気付きの点がございましたらご教授お願いいたします。 #include <3694.h> // H8 Tinyの内部I/O定義 #include <stdio.h> #define TCNT 400 // TCNT = 20MHz / (PWM周期=50kHz) #define Ref 240 #define pai 3.141519 unsigned int AdcResult1; // 出力電圧のAD変換出力の16bit変数 void InitH8(void) { //----------------------- // A/Dコンバータ設定 //----------------------- AD.ADCSR.BYTE = 0; // A/D変換停止 AD.ADCSR.BIT.ADIE = 1; // A/D変換割り込み許可 AD.ADCSR.BIT.SCAN =1; // スキャンモード AD.ADCSR.BIT.CKS = 1; // 高速変換 AD.ADCSR.BIT.CH = 001; // AN0-1 //タイマV設定 TV.TCRV0.BIT.CCLR = 1; // コンペアマッチAでTCNクリア TV.TCRV0.BIT.CKS = 3;   //20GHz/128=15.6KHz TV.TCRV1.BIT.ICKS =1; // TV.TCRV0.BIT.CMIEA = 1; // タイマVのコンペアAによる割り込み許可 TV.TCNTV = 0; // タイマカウンタクリア TV.TCORA =156 - 1; // タイムコンスタントレジスタA設定 15.6kHz / 156= 1kHz // タイマW 設定 TW.TMRW.BIT.CTS = 0; // TCNTカウント停止 TW.TCRW.BIT.CCLR = 1; // コンペアマッチAによりTCNTをクリア TW.TIOR0.BIT.IOB = 1; // コンペアマッチBによりFTIOB端子へ0出力 TW.TCRW.BIT.CKS = 0; // 内部クロックφ/1 = 20MHzでカウント } void int_ad (void) { ~~~ } void int_timerv(void) { TV.TCSRV.BIT.CMFA = 0; // タイマV割込みフラグクリア AD.ADCSR.BIT.ADST = 1; // AD変換開始 } void main(void) { DI; InitH8(); // H8_3694設定 EI; // 割込み許可 while(1); // 割込み待ち }

  • H8マイコンのDA変換機能について

    今、H8マイコンの3048Fをつかっています。マイコンを扱うのは全くの初心者で昔、電子工作でラジオを作ったりしたことがある程度です。 そこで、『C言語によるH8マイコンプログラミング入門』という本を参考に一つずつプログラムを打ち込みながら試しているところです。 そこにある、D/A変換を使ってサインカーブを出力する、プログラムを試そうとしてつまづいています。添付データの様な出力になり、期待に反しています。なぜ、こうなるか分からなくて何かアドバイス頂けないでしょうか? 以下、そのプログラムです。 //タイマ割り込みによるD/Aコンバータの出力 //ITU0使用  //200Hzのサインウェーブを出力する //da_3.c #include <3048.h> //3048、3052の内部I/O定義 int c; //1サイクルの出力回数、外部変数とする unsigned int sindata[128] = {127,133,139,146,152,158,164,170, //出力データ 176,181,187,192,198,203,208,212, 217,221,225,229,233,236,239,242, 244,247,249,250,252,253,253,254, 254,254,253,253,252,250,249,247, 244,242,239,236,233,229,225,221, 217,212,208,203,198,192,187,181, 176,170,164,158,152,146,139,133, 127,121,115,108,102,96,90,84, 78,73,67,62,56,51,46,42, 37,33,29,25,21,18,15,12, 10,7,5,4,2,1,1,0, 0,0,1,1,2,4,5,7, 10,12,15,18,21,25,29,33, 37,42,46,51,56,62,67,73, 78,84,90,96,102,108,115,121}; void ituinit(void) //ITUイニシャライズ { ITU0.TCR.BIT.CCLR = 1; //カウンタクリア要因 ITU0.TCR.BIT.TPSC = 0; //16MHz 周期 0.0625μs ITU0.GRA =900; //200Hz 周期 5ms、1サイクルの出力数 128、 周期 5/128=0.0390625ms //0.0390625ms=39.0625μs、39.0625/0.0625=625 ITU0.TIER.BIT.IMIEA = 1; //IMFAフラグによる割り込み許可 } void dainit(void) //D/Aコンバータイニシャライズ { DA.DACR.BIT.DAOE0 = 1; DA.DACR.BIT.DAE = 0; } //ITUインターバルタイマ割り込み void int_imia0 (void) { ITU0.TSR.BIT.IMFA = 0; //割り込みステータスフラグクリア DA.DADR0 = sindata[c]; //サイン波形データ出力 c+=1; if(c>128) c=0; } int main(void) { ituinit(); dainit(); ITU.TSTR.BIT.STR0 = 1; //タイマスタート c=0; //割り込み回数 EI; //割り込み許可 while (1); //何もしない }

  • AKI-H8/3048Fでのタイマ割り込み

    秋月電子で http://akizukidenshi.com/catalog/items2.php?p=1&q="K-00004" を買いマイコンの勉強をしています。 コンパイル等はGCC Developer Lite、モニタプログラムを使いRAM上で 動作確認をしています。 タイマによる割り込みをしたいと思い、参考書のプログラムを参考に マザーボード上の2つのLEDが交互に光るようにしたいのですが、 肝心のint_imaia0()が全く実行されていません。 #include <3048.h> int c; void int_imia0( void ) { ITU0.TSR.BIT.IMFA = 0; c -= 1; if( c == 0 ){ P5.DR.BYTE = ~ P5.DR.BYTE; c = 10; } } int main( void ) { c = 10; P5.DDR = 0x03; ITU0.TCR.BIT.CCLR = 1; ITU0.TCR.BIT.TPSC = 3; ITU0.GRA = 39999; ITU.TSTR.BIT.STR0 = 1; P5.DR.BYTE = 0x01; EI; while( 1 ){ } } また、割り込みを使わない方法ということで #include <3048.h> int main( void ) { int c = 10; P5.DDR = 0x03; ITU0.TCR.BIT.CCLR = 1; ITU0.TCR.BIT.TPSC = 3; ITU0.GRA = 39999; ITU.TSTR.BIT.STR0 = 1; P5.DR.BYTE = 0x01; while( 1 ){ while( !ITU0.TSR.BIT.IMFA ); c -= 1; if( c == 0 ){ P5.DR.BYTE = ~ P5.DR.BYTE; c = 10; } ITU0.TSR.BIT.IMFA = 0; } } を試したのですが、こちらはLEDが交互に点滅して成功しています。 なのでタイマ自体は動作していると思うのでですが、上のプログラムだと int_imaia0()動作しません。 何がいけないのでしょうか?よろしくお願いします。

  • LCDモニターの駆動

    SH7144Fマイコンを用いて秋月のLCDモニターSC1602BSの駆動を試みています。 以下のようなソースを用意したのですが、文字化けが発生し、20回くらいリセットをかけるとうまく表示されるようになります。 結線方法はBFチェックなしの4BITです。 #include "7144.h" #define E_SIG 0x20 #define RS_SIG 0x10 void wait(void) { int t = 20000; while(t--); } void waits(void) { int ts = 800; while(ts--); } void lcdo(unsigned char d) { d=d | E_SIG; PE.DRL.BYTE.L = d; d = d & 0xdf; PE.DRL.BYTE.L = d; waits(); } void lcdinit(void) { lcdo(3); lcdo(3); lcdo(3); lcdo(2); lcdo(2); lcdo(8); lcdo(0); lcdo(0x0c); lcdo0); lcdo(6); } void lcdclr(void) { PE.DRL.BYTE.L = 0; lcdo(0); lcdo(1); wait(); } void lcdxy(int y,int x) { PE.DRL.BYTE.L = 0; lcdo(y); lcdo(x); waits(); } void lcdo2(unsigned char d) { unsigned dd; dd = d; d = d >> 4; d = d & 0x0f; d = d | RS_SIG; lcdo(d); waits(); dd = dd & 0x0f; dd = dd | RS_SIG; lcdo(dd); waits(); } void dsp1g(int c,char *str) { int i; for(i = 1;i <= c;i++) { lcdo2(*str); str++; } } void initLCD(void) { wait(); lcdinit(); waits(); lcdclr(); } void main() { PFC.PEIORL.BYTE.L = 0xff; wait(); lcdinit(); waits(); lcdclr(); lcdxy(8,0); lcdxy(8,2); dsp1g(5,"HELLO"); waits(); lcdxy(0x0c,2); dsp1g(5,"WORLD"); while(1); } 上記ソースに含まれる間違いや改善点がありましたらどうかご教授ください。

  • (H8マイコン)タイマ割込で変更したグローバル変数がメインループ内で認識されない

    H8マイコンの学習をしています。 LEDを一定時間ごとに点滅させるためにタイマ割込を使用して時間稼ぎ処理を行おうとしました。 1ms毎の割込でグローバル変数をインクリメントし、メインループ内でグローバル変数が一定値以上になるまで無限ループする処理を作成しました。 しかし、メインループの数値チェックの無限ループが終了せずLEDが点滅しません。 原因についてお知恵を拝借できないでしょうか。 何卒よろしくお願いいたします。 以下は環境およびコードです。 マイコン:H8/36109(H8/H300 Tinyシリーズ) 使用ツール:HEW4, E8a (main.c) #include "iodefine.h" volatile unsigned int cnt; //グローバル変数 void main(void) {   cnt = 0;   while(cnt < 1000); //ここで無限ループのまま(補足も参照)   IO.PDR2.BIT.B0 = IO.PDR2.BIT.B0; //ここにブレークをかけても引っ掛らない } (intprg.c) #include <machine.h> #include "iodefine.h" extern volatile unsigned int cnt; #pragma section IntPRG  (略) // vector 22 Timer V __interrupt(vect=22) void INT_TimerV(void) {   cnt++; //(補足参照)   TV.TCSRV.BIT.CMFA = 0; //コンペアマッチフラグクリア } (hwsetup.c) void HardwareSetup(void) {   IO.PCR2 = 0xff; //出力ポート      //タイマVの設定   TV.TCRV0.BYTE = 0x4b; /* CMFA有効, コンペアマッチAでクリア, φ/128 = 125kHz */   TV.TCRV1.BYTE = 0x01; /* 外部入力禁止 */   TV.TCORA = 125; /* 1ms */   TV.TCSRV.BYTE = 0x00; /* フラグクリア, 出力禁止 */ } (補足) 割込動作内でブレークをかけるとブレークがかかり、そこからステップ実行するとグローバル変数が変化していることを確認しました。 同様に、メインループの数値チェック無限ループでブレークをかけ、条件を満たすようにグローバル変数を手動で書き換えステップ実行すると無限ループを脱出しました。

専門家に質問してみよう