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