質問: 0) { SPI.beginTransaction(mySPISettings); digitalWrite(10, HIGH); SPI.transfer(B11011010); SPI.transfer(B11001111); digitalWrite(10, LOW); } //通常LOOP処理6 } delay(100); }
回答: あぁそうか、周波数範囲が切り替わったときだけデータ送信をしたいということか...って、最初から質問にそう書いてありますね。ボケてました。失礼しました。 でも、「ループ」という言葉はやっぱり違うと思います。 で。今のプログラムを出来るだけ活かすなら、 ``` void loop() { FreqCounter::f_comp = 8; // Set compensation to 12 FreqCounter::start(100); // Start counting with gatetime of 100ms while (FreqCounter::f_ready == 0); // wait until counter ready frq = FreqCounter::f_freq; // read result val = digitalRead(6); static int frqRange = -1; if (frq < 10000) { if (frqRange != 0) {//前回他の周波数レンジだったならSPIデバイス設定 SPI.beginTransaction(mySPISettings);//ここから digitalWrite(10, HIGH);// SPI.transfer(B01001000);// SPI.transfer(B11001111);// digitalWrite(10, LOW);//ここまでが極力ループさせず1回だけさせたい処理です } frqRange = 0;//この周波数レンジに入ったことを記憶 //通常LOOP処理1 } else if (frq < 20000) { if (frqRange != 1) { SPI.beginTransaction(mySPISettings); digitalWrite(10, HIGH); SPI.transfer(B01001010); SPI.transfer(B11001111); digitalWrite(10, LOW); } frqRange = 1; //以下同様につき略 } delay(100); } ``` なんていう手もあります。ちょっと力技感はあって、koujikuuさんの示されたプログラムのほうがやっぱりスマートです。 付け加えるなら、2%のフラつきがあるのなら、周波数境界付近でのバタ付きを防ぐとかも考えたほうがいいこともあるかも知れません。 例えば、9999->10000に上がったときは周波数レンジ1に移行するけど、10000->9999に下がったときはレンジ変更しなくて、9700(3%減)まで下がったときにやっと周波数レンジ0に移行するとか。