長いパルスか短いパルスかが判別できればよいだけなので、ビジーウェイトを利用して、パルスがHの状態にあるときのループ回数を数えるだけにする。正確なパルス幅は測らない。
#include "MicroBit.h" MicroBit uBit; //MicroBitPin P0 = uBit.io.pin[0]; MicroBitPin P0 = uBit.io.P0; int main(void){ uBit.init(); // スタートシーケンスを開始する。 P0.setDigitalValue(1);// P0を一旦Hにしてから、 P0.setDigitalValue(0);// P0をLにして、 uBit.sleep(1); // Lの状態を0.8~20ミリ秒間保ってから、 P0.getDigitalValue(); // P0のIOをINに(Hi-Zに)切り替える。バスはプルアップされているのでHになる。 while(P0.getDigitalValue() == 1){} // バスがLになるのを待って、 // スタートビットも含めて全部で41ビットのHパルスの持続時間(ループ回数)を取得する。 int buf[41]; for(int j=0; j<41; j++){ while(P0.getDigitalValue()==0){} // バスがHになるのを待って、 int i; for(i=1; i<256; i++){ if(P0.getDigitalValue()==0){break;} } buf[j] = i; // Hの持続時間(ループ回数)を配列に格納する。 } for(int j=0;j<41;j++){ printf("%d: %d\n", j, buf[j]); // 確認する。 } }
短いパルスが大体5~7、長いパルスが大体18~19であった。