明けましておめでとうございます。はじめまして、ニックダラスと申します。初めての投稿で、RXマイコンプログラムは初心者です。失礼がありましたら、お許しください。昨年11月よりRX231を用いて、RX231のAD変換にて音声信号をRXマイコンに取り込んで、そのデジタル信号を加工し、RX231のDA変換して、音声信号を出力を試みていますが、うまくいきません。事前に、LED点滅プログラム と FFTデモプログラムの動作確認はできましたが、FFTプログラムを改造して、AD変換し、1024個のデータをリングバッファリングして、そのデータをDA変換するようにしたいのですが、サンプリング周波数の変更、DA変換器の追加、DA変換器割り込み設定等ができません。ほぼ初心者で申し訳ないですが、ご指南、ご指導願えないでしょうか。ルネサスさんのHP掲載のマニュアル等は一通り、読みました。ほかに参考書等があれば、教えてくださいませ。ターゲットボード: Target Board for RX231開発環境: setup_e2_studio_2022-10 VSCodeUserSetup-x64-1.74.0FTTデモプログラム: dsp_demo_rx231_tb r01an4431jj0160-rx-apl.pdfGND GND J2-12アナログ入力 AN0001 J2-43アナログ出力 IO_DA1 J2-50その他 ファンクションジェネレーター、オシロスコープ以上です
ニックダラスさん、こんにちは。NoMaYと申します。すみません、念の為にちょっと確認させて欲しいのですけれども、RXスマートコンフィグレータというツールが存在することをご存知でしょうか?
NoMaY さん、コメントありがとうございます。RXスマートコンフィグレータのツールがあることはマニュアル等をみて、知っていますが、使い方を知らないでおります。
デモプロジェクトで提供されたソースコード等をエディタで修正して、新たなプロジェクトを作成するのかなと思って色々と資料を読んでおりましたが、停滞しております。
まずは、スマートコンフィグレータツールを起動させ、どんなGUIが出てくるのかをみてみます。ツールを使ってみて、また、質問をさせてくださいませ。
NoMaYさん、ニックダラスと申します。
初心者です。分かりやすいご説明をありがとうございます。感謝!!!トライしてみます。
ニックダラスさん、こんにちは。NoMaYです。あと、注意点として、DSP演算を組み込む段取りになりましたら、以下の赤文字のコンパイルオプションを指定しておくことを忘れないようにしておいて下さい。RXファミリ FFTによるデジタル信号解析・判定デモンストレーションwww.renesas.com/jp/ja/document/apn/rx-family-demonstration-digital-signal-analysis-and-judgement-using-fft#page=11「Cコンパイラコンパイルオプション・ -lang = c99・ -fpu・ -save_acc」
ニックダラスさん、こんにちは。NoMaYです。私はA/D変換もD/A変換も細かいことは分からないのですけれども、たまたま電気的特性を見ていて気になったことがあります。D/A変換の変換時間のmaxが30μsecとなっていて、48KHzの周期の20.83μsecより長くなっていました。このことは大丈夫なのでしょうか?RX230グループ、RX231グループ ユーザーズマニュアル ハードウェア編R01UH0496JJ0120 Rev.1.20 Pages 1983 2018.09.28www.renesas.com/jp/ja/document/mah/rx230-group-rx231-group-users-manual-hardware-rev120#page=1946「50.6 D/A 変換特性表50.52 D/A変換特性(1)表50.53 D/A変換特性(2)表50.54 D/A変換特性(3)」
NoMaYさん、いつもお世話になります。ニックダラスです。
注意点、ありがとうございます。
現状では、48kHzサンプリングはD/A変換の性能からNGですね。ほんと、ご指摘ありがとうございます。
サンプリング周波数は、8kHz~16kHzで考え直します。先ずは、AD,DAの折り返しの動作確認することが自分には最優先です。
NoMaYさん、いつもお世話になります。色々とやってました。ニックダラスです。
長々とすみません。
DMAを使うことになりました。また、FITモジュールを使います。理由は、AD変換器からメモリへの転送プログラムが提供されているからです。
AD変換器からメモリへ転送プログラムが提供されていることから、メモリからDA変換器への転送もDMAを使うことにし、色々と取り組んでいます。なお、AD部分がコード生成(CG)ではなく、FITモジュールで設計されているので、DA部分もFITモジュールで下記のように設計し、色々と設定をトライしていますが、動作しない状況です。
★デモプログラムで提供されているmain.cに書かれている内容static void init_dmac_s12ad(void){ dmaca_stat_t status; /* ---- Set up the DMAC module ---- */ gs_dmac_cfg_s12ad.transfer_mode = DMACA_TRANSFER_MODE_NORMAL; gs_dmac_cfg_s12ad.repeat_block_side = DMACA_REPEAT_BLOCK_DISABLE; gs_dmac_cfg_s12ad.data_size = DMACA_DATA_SIZE_WORD; /* S12AD's ADDR register width */ gs_dmac_cfg_s12ad.act_source = IR_S12AD_S12ADI0; /* S12AD as activation source */ gs_dmac_cfg_s12ad.request_source = DMACA_TRANSFER_REQUEST_PERIPHERAL; gs_dmac_cfg_s12ad.dtie_request = DMACA_TRANSFER_END_INTERRUPT_ENABLE; gs_dmac_cfg_s12ad.esie_request = DMACA_TRANSFER_ESCAPE_END_INTERRUPT_DISABLE; gs_dmac_cfg_s12ad.rptie_request = DMACA_REPEAT_SIZE_END_INTERRUPT_DISABLE; gs_dmac_cfg_s12ad.sarie_request = DMACA_SRC_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE; gs_dmac_cfg_s12ad.darie_request = DMACA_DES_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE; gs_dmac_cfg_s12ad.src_addr_mode = DMACA_SRC_ADDR_FIXED; gs_dmac_cfg_s12ad.des_addr_mode = DMACA_DES_ADDR_INCR; gs_dmac_cfg_s12ad.src_addr_repeat_area = DMACA_SRC_ADDR_EXT_REP_AREA_NONE; gs_dmac_cfg_s12ad.des_addr_repeat_area = DMACA_DES_ADDR_EXT_REP_AREA_NONE; gs_dmac_cfg_s12ad.interrupt_sel = DMACA_CLEAR_INTERRUPT_FLAG_BEGINNING_TRANSFER; gs_dmac_cfg_s12ad.p_src_addr = (void *)&S12AD.ADDR1; /* ADDR1 - A/D Data Registers 1 */ gs_dmac_cfg_s12ad.p_des_addr = gs_buf_info_s12ad[CURRENT].p_buf_start; gs_dmac_cfg_s12ad.transfer_count = gs_buf_info_s12ad[CURRENT].samples;
IEN(S12AD,S12ADI0) = INT_DISABLE; /* Once S12ADI0 interrupt is disabled here, R_S12AD_Start enables the interrupt again. */
★下記は、デモプログラムを参考に当方でDA変換器からメモリへのDMA設定を書いたものです。static void init_dmac_da(void){ dmaca_stat_t status; /* ---- Set up the DMAC module ---- */ gs_dmac_cfg_da.transfer_mode = DMACA_TRANSFER_MODE_NORMAL; gs_dmac_cfg_da.repeat_block_side = DMACA_REPEAT_BLOCK_DISABLE; gs_dmac_cfg_da.data_size = DMACA_DATA_SIZE_WORD; /* S12AD's ADDR register width */ gs_dmac_cfg_da.act_source = IR_S12AD_S12ADI0; /* ???????????????? S12AD as activation source */ gs_dmac_cfg_da.request_source = DMACA_TRANSFER_REQUEST_PERIPHERAL; gs_dmac_cfg_da.dtie_request = DMACA_TRANSFER_END_INTERRUPT_ENABLE; gs_dmac_cfg_da.esie_request = DMACA_TRANSFER_ESCAPE_END_INTERRUPT_DISABLE; gs_dmac_cfg_da.rptie_request = DMACA_REPEAT_SIZE_END_INTERRUPT_DISABLE; gs_dmac_cfg_da.sarie_request = DMACA_SRC_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE; gs_dmac_cfg_da.darie_request = DMACA_DES_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE; gs_dmac_cfg_da.src_addr_mode = DMACA_DES_ADDR_INCR; gs_dmac_cfg_da.des_addr_mode = DMACA_SRC_ADDR_FIXED; gs_dmac_cfg_da.src_addr_repeat_area = DMACA_SRC_ADDR_EXT_REP_AREA_NONE; gs_dmac_cfg_da.des_addr_repeat_area = DMACA_DES_ADDR_EXT_REP_AREA_NONE; gs_dmac_cfg_da.interrupt_sel = DMACA_CLEAR_INTERRUPT_FLAG_BEGINNING_TRANSFER; gs_dmac_cfg_da.p_src_addr = gs_buf_info_da[CURRENT].p_buf_start; gs_dmac_cfg_da.p_des_addr = (void *)&DA.DADR1; /* DADR1 - D/A Data Registers 1 */ gs_dmac_cfg_da.transfer_count = gs_buf_info_s12ad[CURRENT].samples;
IEN(S12AD,S12ADI0) = INT_DISABLE; /* ?????????? Once S12ADI0 interrupt is disabled here, R_S12AD_Start enables the interrupt again. */ DSP FTTのデモプログラムのAD部分のDMA設定を参考に、DA部分のDMA設定部分を設計してみましたが、RX231 TBの100pinからアナログの出力がありません。お忙しいところ、恐縮ですが、アドバイスを頂けないでしょうか。
ニックダラスさん、こんにちは。NoMaYです。まずは、以下の設定でコードを書いてみてはどうでしょうか。(サンプルプログラムも存在すると信じていますけれども。)(1) ソフトウェアトリガ(2) データ転送数は1(3) 転送元も転送先もメモリ動いたら(4) 転送先をD/A変換レジスタへ変更動いたら(5) DMA起動要因を割り込みへ変更動いたら(6) 転送数を2以上へ変更なお、(4)(5)(6)の順番は、動作しない状況/デバッグ状況に応じて、弾力的に変えて試行錯誤してみる。また、FITモジュール関連の構造体をスタック上に配置することは避ける。[関連リンク]FIT moduleを使っていてtroubleに遭遇してしまったところです。community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/6382/fit-module-trouble
NoMaYさん、ニックダラスです。
早々にありがとうございます。とにかくやってみます。
トラブル遭遇も参考にさせていただきます。
NoMaYさん、ニックダラスです。ご報告です。【DA用のDMA動作しました】
CMT1のCMI1の割り込み許可、dmaca_stat_t da_status; と main.cのIEN の変更をして動作確認しました。
dmaca_stat_t da_status; /* ---- Set up the DMAC module ---- */ gs_dmac_cfg_da.act_source = IR_CMT1_CMI1;
gs_dmac_cfg_da.src_addr_mode = DMACA_SRC_ADDR_INCR; gs_dmac_cfg_da.des_addr_mode = DMACA_DES_ADDR_FIXED; gs_dmac_cfg_da.p_src_addr = gs_buf_info_da[CURRENT].p_buf_start; gs_dmac_cfg_da.p_des_addr = (void *)&DA.DADR1; /* DADR1 - D/A Data Registers 1 */ IEN(CMT1,CMI1) = INT_DISABLE;
IEN(CMT1,CMI1) = INT_ENABLE;