GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
秋月で買えるデジタルシリコンマイクロホン SPM0405HD4H( http://akizukidenshi.com/catalog/g/gM-05577/ , 1MHzクロック駆動を想定)ですが、外部クロックでカウントできるタイマーを使う必要がある思ってます。
これに使えるタイマー(16bit)の空きは、ありますでしょうか?
自己レスですが、RL78/G13ユーザーズマニュアル ハードウェア編のページ335の表6-3に「イベント・カウンタ・モード、ダウン・カウント」と書いてありました。
参考に、時点のサンプルプログラムのソースコードを、以下に置いときます。マイクのデータ線は、D3で、マイクのクロック線は、D10にしています。また、D9にLEDを繋ぐと、音検知で、LEDが光るようになります。なお、下記で使う関数のstatic 宣言を外すように、gr_common/RLduino78/cores/RLduino78_basic.cppの修正が必要です。
誰か、さらに進めて、サンプリング周波数はもう少し上げて、PWMへ変換するとかしませんか?
/*GR-KURUMI Sketch Template Version: V1.12*/ #include <Arduino.h> #include <stdlib.h> #include "RLduino78_mcu_depend.h" #include "RLduino78_timer.h" #include "pintable.h" #include "fastio.h" #ifdef USE_RTOS #include "FreeRTOS.h" #include "task.h" #include "semphr.h" #endif #ifdef USE_RTOS #define FUNC_MUTEX_LOCK xSemaphoreTake(xFuncMutex, portMAX_DELAY) //!< 関数用MUTEX LOCKマクロ #define FUNC_MUTEX_UNLOCK xSemaphoreGive(xFuncMutex) //!< 関数用MUTEX UNLOCKマクロ #else #define FUNC_MUTEX_LOCK //!< 関数用MUTEX LOCKマクロ #define FUNC_MUTEX_UNLOCK //!< 関数用MUTEX UNLOCKマクロ #endif // ライブラリ側で公開するように修正が必要 void _startTAU0(uint16_t u16TimerClock); void _stopTAU0(); void _startTimerChannel(uint8_t u8TimerChannel, uint16_t u16TimerMode, uint16_t u16Interval, bool bPWM, bool bInterrupt); void _stopTimerChannel(uint8_t u8TimerChannel); void outputClock( uint8_t, uint32_t ); // Pin 22,23,24 are assigned to RGB LEDs. int led_red = 22; // LOW active int led_green = 23; // LOW active int led_blue = 24; // LOW active void inputClock(bool start); unsigned short readTimer(); unsigned short min = 0xffff; unsigned short max = 0x0000; #define TIMER_INITIAL_VALUE (0xfffe) void inputClock(bool start ) // Timer 0 Channel 1; を前提 { FUNC_MUTEX_LOCK; min = 0xffff; max = 0x0000; pinMode( 3, INPUT ); // Channel 1 // pinMode( 5, INPUT ); // Channel 2 if (start) { // タイマーアレイユニットの開始 _startTAU0(TIMER_CLOCK); // タイマーの開始 _startTimerChannel( 1, 0x1106, TIMER_INITIAL_VALUE, false, false); // Channel 1 // _startTimerChannel( 2, 0x1106, 0xfffe, false, false); // Channel 2 } else { // タイマーの停止 _stopTimerChannel( 1 ); // Channel 1 // _stopTimerChannel( 2 ); // Channel 2 // タイマーアレイユニットの停止 _stopTAU0(); } FUNC_MUTEX_UNLOCK; } unsigned short readTimer() { // TCR01から値を読み取る unsigned short ret = TIMER_INITIAL_VALUE - TCR01.tcr01; // Channel 1 // unsigned short ret = TIMER_INITIAL_VALUE - TCR02.tcr02; // Channel 2 if (ret > max) max = ret; if (ret < min) min = ret; // rest the timer TS0.ts0 = 0x0002; // Channel 1 // TS0.ts0 = 0x0004; // Channel 2 return ret; } void MyCycle(unsigned long ms) { unsigned short val = readTimer(); } // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. Serial.begin(115200); Serial.println("Hello"); pinMode(led_red, OUTPUT); pinMode(led_green, OUTPUT); pinMode(led_blue, OUTPUT); pinMode( 9, OUTPUT); // turn the LEDs on, glow white. digitalWrite(led_red, LOW); digitalWrite(led_green, LOW); digitalWrite(led_blue, LOW); digitalWrite( 9, HIGH ); outputClock( 10, 1000000 ); // 1MHz clock for the mic attachIntervalTimerHandler( MyCycle ); inputClock( true ); // Timer 0 Channel 1; を前提 } int cnt = 0; // the loop routine runs over and over again forever: void loop() { unsigned short diff = max - min; if (diff > 10) digitalWrite( 9, LOW ); else digitalWrite( 9, HIGH ); if (((cnt++) % 1000 ) == 0) { Serial.println( diff ); min = 0xffff; max = 0x0000; } }
以上
ソースコードですが、修正済みのライブラリと込みで、guthubにアップしました。
github.com/.../MEMS-MIC4GR-KURUMI
ご参考