タイマーと配列

はじめまして,softmと申します。

現在RX65Nを用いてデータ計測を行っています。

データを取得してからPCにデータをシリアル通信で

送っているのですが,これを1分間経ったらい分間のデータを

まとめて送信できるようにしたいです。

しかし,その間のタイマーの使い方とデータの保管の仕方がわかりません

どなたかわかる方ご教授願います。

ちなみに開発環境はcs+です。

  • softmさん、こんにちは。NoMaYと申します。

    少しお尋ねしたいのですが、シリアル通信で垂れ流し送信ではなく、1分間分をまとめて送信したい、というのはどのような理由によるものですか?そちらの事情として、垂れ流し送信で困っている、というのはどのような点ですか?

  • softmさんこんにちは、NAKAといいます。

    例えばこういう事でしょうか?

    「1秒毎にデータを取得し、配列に溜めておいて、1分毎に送信する。」

    タイマー(TPUなど)で1秒毎にフラグ(f_TIME_1s)を"1”にするように初期設定しておいて

    AD_GET():データ習得関数

    SCI_TX():1分間分のデータ送信関数

    を作り、

    こんな感じにする?

    while(1)
    {
     if(f_TIME_1s == 1)    //1秒のフラグ確認
     {
         f_TIME_1s = 0;    //1秒のフラグクリア

         DATA[COUNT_60] = AD_GET();   //1秒毎にデータ取得(例:A/D変換?)
         COUNT_60++;     //1分間カウンタ インクリメント
         if(COUNT_60 >= 60)    //1分になったら
         {
            COUNT_60 = 0;    //1分間カウンタ クリア
            SCI_TX(DATA):    //1分分のデータを送信
         }

     }
    }

  • NoMaYさん,こんにちは。

    返信ありがとうございます。

    理由としては,まずa/d変換器からデータを取得し,てそれをpcにシリアル通信で送信しています。

    そしてpc側のプログラムでデータを読み込んだらcsvファイルに書き込んで,1分経ったら

    また新しいcsvファイルに書き込むという作業を行っております。しかし1分毎のデータ数が違っており

    今後の処理を行う上で障壁となっています。

    なので,まとめると時間ごとに生じるデータ数のばらつきを抑えて,1分,10秒,1秒ごとのデータ数を同じにしたいということです。つたない文章で分かりづらいと思いますがよろしくお願い致します。

     

  • NAKAさん,こんにちは。

    返信ありがとうございます。

    なるほど。

    参考にさせてもらいます。

    またわからないところがあったら質問させていただきます。

  • softmさん、こんにちは。NoMaYです。

    いつA/D変換するか、というのがイベントドリブンになっていて変換タイミングが不定な感じかな、、、そして、送信データは1分毎(or 10秒毎、1秒毎)の計測回数(A/D変換回数)と平均値、といった感じでしょうか、、、

    それで、推測なのですが、まず、1分毎とか10秒毎とか1秒毎とか、そういった時間間隔を生成するところから分からない状況でしょうかね?

  • NoMaYさん,こんにちは。

    返信ありがとうございます。

    ちなみにA/D変換器はADS1015を使用しており,サンプリングは1600Hzに設定してます。

    >>それで、推測なのですが、まず、1分毎とか10秒毎とか1秒毎とか、そういった時間間隔を生成するところから分>>からない状況でしょうかね?

    マイコンについては全然利用したことないので正直

    わからないです。

  • softmさん、こんにちは。NoMaYです。

    ちょっとググってみたのですけれど、今現在のADS1015の使い方は、RDYピンをポーリングして変換完了毎にI2Cで読み出す、といった使い方でしょうか?それと、RXスマートコンフィグレータは使われていますか?使われているのであれば、I2C読み出しAPI関数名はどういう名前の関数を使われていますか?

    Google検索: ADS1015
    www.google.com/search?q=ADS1015

    A/Dコンバータ ADS1015(I2C)を利用しA/D変換を行う
    zattouka.net/GarageHouse/micon/circuit/A_D2.htm
     

  • NoMaYさん,こんにちは。

    返信ありがとうございます。

    RDYピンの設定はデフォルトで行っております。

    スマートコンフィグレータも使用しており,

    R_Config_SCI0_IIC_Master_Receive

    を使用しております。

    また,複数のA/D変換器を使用しており,順番に

    データを読み込んでいってます。

  • softmさん、こんにちは。NoMaYです。

    まだ、ちょっと、そちらの課題を私が理解しきれている感じでは無いですけど、そのあたりは新たなことがあれば随時分かっていくだろうと思いますので、今思い浮かんでいる案を書くと以下のようなものですね。

    (1) 1ms毎にカウントアップされるハードウェアカウンタを1つ用意します。(どのハードウェアカウンタが良いかは後で調べてみます)

    (2) たぶん、main()の中に無限ループがあると思いますので、その中で以下のような処理を記述します。

    void main(void)
    {
        for(;;)
        {
            A/D変換結果読み込み(イベントドリブン?) → 配列へ順次格納?
            if (カウンタ >= 60000)
            {
                /* 60秒毎の処理 */
                カウンタクリア → クリア後は再度1ms毎にカウントアップ
                配列へ格納したA/D変換結果を一挙に文字列化して一括送信?
            }
        }
    }

     

  • softmさん、こんにちは。NoMaYです。

    先程はハードウェアカウンタを1つ用意して、と思ったのですが、ハードウェアタイマ1つとソフトウェアカウンタ1つで実装する方が話が分かり易そうかな、と思い直しました。RXスマートコンフィグレータで以下の画面コピーのようにCMT0(CMT1,2,3とかでも可)を設定し、その割り込みルーチンの中でuint32_t型の変数をインクリメントして1ms毎にカウントアップさせて頂けますか?また、クリア時は以下のように、割り込み禁止/割り込み許可でサンドイッチしてクリアして下さい。

    clrpsw_i();
    カウンタ = 0;
    setpsw_i();


    以下、RXスマートコンフィグレータの画面コピーです。




     

  • NoMaYさん,こんにちは。

    返信ありがとうございます。

    今日は作業する時間がないので

    また明日やってから連絡させていただきます。

  • NoMaYさん,こんにちは。

    スマートコンフィグレータの設定までは終わりました。

    clrpsw_i();
    カウンタ = 0;
    setpsw_i();

    はmain()の中に書き込めばよいのでしょうか?
    本当に無知なものですみません。

     

  • softmさん、こんにちは。NoMaYです。

    > main()の中に書き込めばよいのでしょうか?

    はい、以下の赤文字箇所のことです。

    void main(void)
    {
        for(;;)
        {
            A/D変換結果読み込み(イベントドリブン?) → 配列へ順次格納?
            if (カウンタ >= 60000)
            {
                /* 60秒毎の処理 */
                カウンタクリア → クリア後は再度1ms毎にカウントアップ
                配列へ格納したA/D変換結果を一挙に文字列化して一括送信?
            }
        }
    }

     

  • NoMaYさん,こんにちは。

    連絡が遅くなり申し訳ございません。

    頑張って実装してみます。