H8-MLの皆様、はじめまして。 今までずっとROMでした、のだと申します。 H8/3048F(AKI-H8)を使いまして、 ADXL202のパルス出力2軸分をITU1とITU2のインプットキャプチャで 取り込もうとしていますが、思った動作にならず難儀しております。 #ADXL202のパルス幅を取り込む話自体は過去にも流れていますが、 #最終的な答えを見つけられていません。 初歩的なミスかもしれませんが、皆様のお知恵をお貸しください。 ADXL202の出力は X軸パルス出力をTIOCA1とTIOCB1、 Y軸パルス出力をTIOCA2とTIOCB2、 にそれぞれ接続しております。 オシロスコープで見る限りでは、パルス出力の周期は約4msです。 この入力に対して、H8側では、 立ち上がりでGRBキャプチャ、TCNTクリア、 立ち下がりでGRAキャプチャと設定し、 フリーランでパルスの長さを取り込もうとしています。 プログラムとしてはITU0で10ms毎の割り込みを発生させ、 そのたびにITU1.GRAとITU2.GRAの値をシリアルで送り出すようにしています。 ITU1.GRAの方は正常にHighの時間に相当する値(φ/8で0x1000前後)になるのですが、 ITU2.GRAの方はでたらめな値となってしまいます。 ITU1とITU2は独立に動作すると理解しているのですが、 このような使い方に何か問題があるのでしょうか? 以下、現在試しているプログラムのソースです。 #include "3048f.h" #include "mytype.h" #include "serial.h" #pragma interrupt(intimia0) int main(void){ initio(); /* Serial port Initialize */ PA.DDR = 0x00; ITU1.TCR.BYTE = 0xC3; /* GRBでTCNTクリア */ ITU1.TIOR.BYTE = 0xCD; /* 立ち下がりでGRAキャプチャ、立ち上がりでGRBキャプチャ */ ITU2.TCR.BYTE = 0xC3; ITU2.TIOR.BYTE = 0xCD; ITU0.TCR.BYTE = 0x23; ITU0.GRA = 0x4e20; ITU0.TIER.BYTE = 0xF9; ITU.TSTR.BIT.STR1 = 1; ITU.TSTR.BIT.STR2 = 1; ITU.TSTR.BIT.STR0 = 1; while(1){ } } void intimia0(void){ unsigned int counterx; unsigned int countery; counterx=(ITU1.GRA); countery=(ITU2.GRA); outch((short)(counterx >> 8)); outch((short)(counterx & 0xff)); outch((short)(countery >> 8)); outch((short)(countery & 0xff)); crlf(); ITU0.TSR.BIT.IMFA = 0; } 以上のようなプログラムで正常な動作を期待してよいでしょうか? それとも根本的にITUの使い方を間違えているでしょうか? よろしくお願いします。 ---- M.Noda tochan@xxxxxxxxxxx