Renesas Rulz - Japan
Renesas Rulz - Japan
  • User
    Join or sign in
  • Site
  • Search Japan.RenesasRulz.com
  • User
  • Renesas Rulz
  • FAQ
  • パートナー
  • 半導体セミナ
  • eラーニング
  • ヘルプ
  • More
  • Cancel
がじぇっとるねさすコミュニティ
がじぇっとるねさすコミュニティ
GR-CITRUS μsec単位の周期処理は?
  • Forums
  • Blog
  • Files
  • がじぇっとるねさす ゆーざー会 - Wiki
  • Tags
  • More
  • Cancel
  • New

 

 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関連

 女子美コラボ

 その他

 ※プロデューサミーティング中

 作り方使い方資料

 イベント関連

 作品記事

 体験記事

 その他

 

 ライブラリ

 ツール

 その他・過去ファイル

  • State Not Answered
  • Replies 19 replies
  • Subscribers 435 subscribers
  • Views 23859 views
  • Users 0 members are here
  • gr-citrus
Options
  • Share
  • More
  • Cancel
Related Tags
  • DS18B20
  • gr-citrus
  • gr-sakura
  • i2c
  • IDE for GR
  • led
  • NeoPixel
  • WS8212B
  • 簡易オシロスコープ
Related

μsec単位の周期処理は?

maenoh!
maenoh! over 4 years ago

秋月の超小型シリコンマイクモジュール(SPU0414HR5H-SB使用)

http://akizukidenshi.com/catalog/g/gM-08940/

を使ってみようと思い、先ずはKURUMIの

attachMicroIntervalTimerHandler(test_cyclic_handler, 100);

で試しました。100us周期処理なので、「あ」の波形もそこそこ綺麗にサンプリングできました。

これをCITURSに移植しようとしたところ、エラーになりました。

us単位の周期処理はサポートされていないのでしょうか?

仕方なく

     MsTimer2::set(1, test_cyclic_handler); // 1ms period

を使ってみましたが予想通り残念な結果でした。

波形:上がKURUMIの100us周期処理、下がCITURSの1ms周期処理

  • Reply
  • Cancel
  • Cancel
Parents
  • fujita nozomu
    0 fujita nozomu over 4 years ago

    GR-SAKURA の MsTimer2 に μ秒単位でタイマー割り込みを指定できる setMicros() と PCLK(=48MHz)単位で指定できる setPCLK() を追加してみました。

    使い方はだいたいこんな感じです。

    /* GR-SAKURA Sketch Template V2.13 */
    #include 
    #include 
    
    volatile uint32_t count = 0;
    
    void timer()
    {
        count++;
    }
    
    void setup()
    {
        Serial.begin(9600);
    #if 0   // 1ms 毎に割り込み
        MsTimer2::set(1, timer);
    #elif 0 // 100us 毎に割り込み
        MsTimer2::setMicros(100, timer);
    #else   // 10kHz で割り込み
        MsTimer2::setPCLK(PCLK / 10000, timer);
    #endif
        MsTimer2::start();
    }
    
    void loop()
    {
        Serial.println(count);
        delay(1000);
    }
    

    GR-CITRUS は持っておらず確認等しておりませんが、まあ似たようなもんじゃないかと思うので試されてみてはいかがでしょうか。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 4 years ago in reply to fujita nozomu

    fujitaさん、ありがとうございます。

    F_CPUが定義されていないようだったので

    MsTimer2.hの一部を以下のように変更(CITRUSのオリジナルから移植)したら正常に動作しました。

    #if defined (GRSAKURA)
    #define F_CPU 48000000 //PCLK is 48MHz, CPU is operating at 96MHz
    #else
    #include <avr/interrupt.h>
    #endif

    お陰様で100us周期で音声波形が取り込めました。秋月のマイクも小さくて使いやすいので色々作品が作れそうです。

    残念ながら、MP3再生用のWavMp3p.hとは同時に使えないみたいですが。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
Reply
  • maenoh!
    0 maenoh! over 4 years ago in reply to fujita nozomu

    fujitaさん、ありがとうございます。

    F_CPUが定義されていないようだったので

    MsTimer2.hの一部を以下のように変更(CITRUSのオリジナルから移植)したら正常に動作しました。

    #if defined (GRSAKURA)
    #define F_CPU 48000000 //PCLK is 48MHz, CPU is operating at 96MHz
    #else
    #include <avr/interrupt.h>
    #endif

    お陰様で100us周期で音声波形が取り込めました。秋月のマイクも小さくて使いやすいので色々作品が作れそうです。

    残念ながら、MP3再生用のWavMp3p.hとは同時に使えないみたいですが。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
Children
  • fujita nozomu
    0 fujita nozomu over 4 years ago in reply to maenoh!
    F_CPUが定義されていないようだったので

    MsTimer2.hの一部を以下のように変更(CITRUSのオリジナルから移植)したら正常に動作しました。

    #if defined (GRSAKURA)
    #define F_CPU 48000000 //PCLK is 48MHz, CPU is operating at 96MHz
    #else
    #include <avr/interrupt.h>
    #endif

    F_CPU は Arduino.h で

    #define F_CPU (96 * 1000 * 1000)
    

    と定義されており再定義は不要な筈です。そもそも MsTimer2 で使用しているタイマは 48MHz の PCLK で動作しており F_CPU は関係ありません。

    改変前の GR-SAKURA 版 MsTimer2 では元となった AVR 版では CPU クロックとペリフェラルクロックの区別がないためか CPU クロックの F_CPU とペリフェラルクロックの PCLK を混同しており、Arduino.h で (96 * 1000 * 1000) と定義されている F_CPU が MsTimer2.h をインクルードした後では (48 * 1000 * 1000) に再定義されるというわけの分からないことになっていましたが、今回投稿したものではその点を改めています。PCLK を使用したい場合は Arduino.h をインクルードしてください。

    残念ながら、MP3再生用のWavMp3p.hとは同時に使えないみたいですが。

    見ていませんが、恐らくは同じタイマを使用しているのだと思います。WavMp3p の改変が必要でしょう。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 4 years ago in reply to fujita nozomu
    詳しい説明、ありがとうございます。
    標準ライブラリへの反映やMP3再生との両立(切替)を含めてOkamiyaさんにお願いするしかなさそうですね。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • fujita nozomu
    0 fujita nozomu over 4 years ago in reply to maenoh!

    改善の意思があるようには思いませんがどうですかね?

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • fujita nozomu
    0 fujita nozomu over 4 years ago in reply to maenoh!

    setPCLK() を使用する際に PCLK を参照できるよう MsTimer2.h の中から Arduino.h をインクルードするよう変更しました。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 4 years ago in reply to fujita nozomu
    Maenoさん、現状のMsTimer2はTPU1で、MP3はMTU1をDMA起動で使ってますが、タイマー衝突はしてないように思います。もしかするとMP3のデコードが間に合っていないのかもしれません。WAVとかで試せないですか?
    また、音声取得は割込み内でanalogReadの他にSerialも使ってますか?
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 4 years ago in reply to Okamiya Yuuki
    MsTimer2の入力指定時間を小数も受け入れるようにしてはと思ってました。0.1ぐらいから指定できてよいかなと思ってます。現状はプリスケーラ1/64で、全然余裕がありますので。

    あと、KURUMI系の周期処理ライブラリは実装しようかと思ってましたが、ちょっと止まってます。その前に今回のMaenoさんのように波形をとる場合、V2の途中段階まで入れていたanalogBulkReadとかでFFTも使えるようにした方がよいかなぁとは思ってましたがやれてないのは確かです。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • @chobichan
    0 @chobichan over 4 years ago in reply to Okamiya Yuuki
    タイマーとADCとDMACと割り込みを使うライブラリが有ればイイのにね。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • NoMaY
    0 NoMaY over 4 years ago in reply to @chobichan

    @chobichan様wrote: said:
    タイマーとADCとDMACと割り込みを使うライブラリが有ればイイのにね。引用終わり

    Okamiya Yuuki様wrote: said:
    KURUMI系の周期処理ライブラリは実装しようかと思ってましたが、ちょっと止まってます。その前に今回のMaenoさんのように波形をとる場合、V2の途中段階まで入れていたanalogBulkReadとかでFFTも使えるようにした方がよいかなぁとは思ってましたがやれてないのは確かです。引用終わり

    岡宮様、こんにちは。
    analogBulkRead()というのは、@chobichan様が仰っているような実装になっていたりしますでしょうか?もしそうであるなら、私が先週投稿した簡易オシロの移植でやろうとしていることと重複する(私の参考になる/私が寄与出来る)部分もそれなりにあると思います。途中まで作られたというanalogBulkRead()のソースを見せて頂くことは出来ますでしょうか?

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 4 years ago in reply to NoMaY

    NoMaYさん、添付します。

    当時のソースを見ていると、タイマーとDMAを使ってサイズ分バッファに取得するというものですね。FFTライブラリで周波数設定が必要だった記憶があるので、引数に周波数を与えるような作りになってます。確かこれでFFTが含まれたDSPライブラリを動かした記憶があるので動くとは思うのですが、すみません今回は試してないです。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • NoMaY
    0 NoMaY over 4 years ago in reply to Okamiya Yuuki

    Okamiya Yuuki様wrote: said:
    添付します。当時のソースを見ていると、タイマーとDMAを使ってサイズ分バッファに取得するというものですね。...略... 動かした記憶があるので動くとは思うのですが、すみません今回は試してないです。引用終わり

    岡宮様、どうもありがとうございます。
    後ほど試してみます。(動かなければ動くように改造してみます。) 結果は、簡易オシロの方のスレッドに投稿しようと思っています。ありがとうございました。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 4 years ago in reply to Okamiya Yuuki
    もう一度試したところ、ROM内のmp3を再生しながらそれをマイクで100us毎にサンプリングすることができました。両立可能ですね。ところでanalogReadの周期はどこまで短くできるのでしょうか?
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • NoMaY
    0 NoMaY over 4 years ago in reply to maenoh!

    maenoh!さんwrote: said:
    ところでanalogReadの周期はどこまで短くできるのでしょうか? 引用終わり

    先日、以下のスケッチにてGR-CITRUSのanalogRead()の時間を測定してみたところ42μsec程でした。(また、試しにanalogReadClock()という内部関数でA/D変換ユニットの動作クロックを速くしてみたところ若干速くなって34μsec程になりました。)

    analogRead_speed.ino

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 4 years ago in reply to NoMaY
    ありがとうございます。人の声なら十分な性能ですね。欲を言えばAD変換終了時に割り込みをかけられればメインの処理(FFTとかボイスチェンジャーとか)も行えるのですが...
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • NoMaY
    0 NoMaY over 4 years ago in reply to maenoh!

    maenoh!さんwrote: said:
    AD変換終了時に割り込みをかけられればメインの処理(FFTとかボイスチェンジャーとか)も行えるのですが...  引用終わり

    ボイスチェンジャーというのは、例えば、100μsec周期 × 数百個連続一括A/D変換、といったやり方で得られるブロックデータを使っても実装出来たりするでしょうか?

    というのは、ソースを見ると、analogReadClock(3)でA/D変換ユニットの動作クロックをPCLKとした時のanalogRead()の処理時間の34μsecのうち、A/D変換自体は1μsec(96MHz動作であるGR-CITRUSでは正確には1.04μsec)しか使わず、残りの33μsecはお膳立て処理でみっちりCPUクロックを使っているようなのです。なので、analogRead()を利用する手では思惑通りには行かなそうだからです。(ここまで書いて気になったのですが、既に周期ハンドラを使われていると思いますので、CPUクロック使用率を度外視すれば、バックグランド処理すること自体は既に出来ていることのような気がします。)

    他方、今、先日の投稿で岡宮様から頂いたanalogBulkRead()をGR-CITRUSの現ソース中でビルド出来るように改造中ですが、先日の投稿で@chobichan様も話題にしておられたDMAを使いますので、大量の連続一括A/D変換を行わせた場合にはCPUクロック使用率は変換全体からすれば非常に低くなる筈で、これに藤田様が別スレッドで話しておられたGR-KURUMI(/COTTON?/ADZUKI?)のWavpライブラリ再構築で今後提案されるコールバックAPI等に似せたラッパーを被せる手はありかもしれない、という気はしています。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • fujita nozomu
    0 fujita nozomu over 4 years ago in reply to fujita nozomu

    GR-KURUMI にクロック単位で指定できるタイマー割り込み機能を追加したのに合わせ、GR-SAKURA の MsTimer2 ライブラリに先に追加したメソッド setPCLK() を GR-KURUMI と同じ setClock() に変更しました。他の変更はありません。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2021 Renesas Electronics Corporation. All rights reserved.