めかたさん こんにちは,小坂です。 > ITU0.TCR.BYTE = 0x20; /* 00100000 */ > ITU0.TSR.BYTE = 0x00; > ITU0.GRA = 0x01; > ITU0.TCNT = 0x00; > ITU.TSTR.BIT.STR0 = 1; > ITU0.TIER.BYTE = 0x01; と設定していますので,ITUの「割り込み要求発生」は2クロックごとです。 (GRA=1ですと,TCNTは010101...を繰り返し,1の終わりにコンペアマッチが生じます。こちらが本論ではなく,「割り込み周期」ではなく「割り込み要求発生周期」であることを言いたかったんです) 割り込み要求があると。CPUは割り込み処理を起動しますが,割り込み処理中はCPUは割り込み禁止(割り込み要求があっても見向きもしない状態)になっています。割り込み処理が終ると割り込み禁止が解除になります。その時,割り込み要求があると,その割り込み要求を受け付けて,割り込み処理を開始します。 この例の場合も,このようなことが起こっていて,ITUはひたすら割り込み要求を出していますが,そのほとんどの部分はCPUに無視されます。そじて割り込み処理が終ってCPUがやれやれと思ったとたん,あ!次の割り込み要求がある,それいけ...が繰り返されていると思います。ですので,この例における見かけ上の「割り込み周期」は「割り込み要求発生周期」ではなく「割り込み処理作業時間」が見えていると思います。 >出力を周波数カウンタにかけてみたところ76KHzと表示されました。 ということなので,「割り込み処理の起動」は152kHz位になります。(ONになる割り込み処理とOFFになる割り込み処理の2回で周波数カウンタの読み取る一周期ですので。) そうすると割り込み処理には100クロックほど費やしていることになります。 たぶん,示されている割り込み関数を用いた割り込み処理はその程度のクロックを要すると考えられます。 そうすると次のようにまとめられます。 「ITUの割り込み要求発生周期」:2クロック 「CPUの割り込み処理起動周期」:100クロック程度 割り込み処理中もITUは高速に割り込み要求を発しているが,実際に起動する割り込み処理は割り込み処理にかかる時間に依存している。 >3048 16MHzでは76KHzが最高となるんでしょうか? 割り込み処理部分を高速化すれば,もう少しON-OFF周波数を上げることが出来るでしょう。 例えば同じ機能を実現するのに次のようなのもあります。あとはコンパイラが不要なコードを出さないかにかかっています。(行数は減っていますが,レジスタやPCの退避復帰など時間のかかる作業は減っていないため,高速化の度合いは10%位かもしれません。) #pragma interrupt(timer1INT) void timer1INT(void) { ITU0.TSR.BYTE=(ITU0.TSR.BYTE&0xfe); /*Clear IMFA*/ P5.DR.BYTE~=0xff; } --------------------------------------------------- 〒193 0997 八王子市椚田町1220-2 東京工業高等専門学校 情報工学科 小坂敏文 phone0426-68-5199 Fax68-5098