Renesas Community
Renesas Community
  • User
    Join or sign in
  • Site
  • Search Community
  • User
  • Renesas Engineering Community
  • FAQ
  • HELP
  • More
  • Cancel
がじぇっとるねさすコミュニティ
がじぇっとるねさすコミュニティ
GR-LYCHEE タイマー割込みでAnaloginが動作しません
  • Forums
  • 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 Suggested Answer
  • Replies 10 replies
  • Answers 1 answer
  • Subscribers 440 subscribers
  • Views 3497 views
  • Users 0 members are here
Options
  • Share
  • More
  • Cancel
Related Tags
  • 5Vトレラント
  • binファイル
  • BLE
  • DisplayApp
  • e2studio
  • error
  • ESP32
  • GR-LYCHEE
  • GR-PEACH
  • html
  • includeに関しては、C言語のヘッダファイルの意味合いを理解すれば、どういうことなのか?がわかるんじゃないか?と思いますよ。
  • OpenCV
  • pwm
  • WebCamera
  • webコンパイラ
  • カメラ
  • コンパイラー
  • シリアル
  • ダウンロード
  • ツールチェン
  • ファームウェア
  • 基板サイズ
  • 解凍
Related

タイマー割込みでAnaloginが動作しません

sam
sam over 2 years ago

(1)にanalog.read()がある場合、コンパイルはできますが実行時にエラーが出ます。

(2)であれば動作します。割り込み先でanalog.read()を行うにはどのようにすればよいでしょうか。

#include "mbed.h"

AnalogIn ain(A0);
Ticker timer;

int k=0;
float val;
void i_timer(){
    val=ain.read();    //(1)
    k=1;
}

int main() {
    timer.attach(&i_timer,1.0);

    while(1) {
        if(k==1){
//         val=ain.read();    //(2)
            printf("%f\r\n",val);
            k=0;
        }
    }
}

  • Reply
  • Cancel
  • Cancel
Parents
  • sam
    0 sam over 2 years ago
    hold layeeさん、dkatoさん、ご回答ありがとうございます。知識不足で申し訳ありませんが、下記教えていただけないでしょうか。
    ①オーバーライドのサンプルにある Class1 *c2 = new Class2;は、初期化パラメータのあるAnalogInではどのように書けばよいでしょうか。
    ②AnalogIn.hではもともと lock()とunlock()にvirtualがついていると考えればよいでしょうか。
    ③下記のようにタイマー割込みをやめてスレッドをループで回し、時間間隔をwait()で設定する場合、1msecより短い設定はできるでしょうか。100μsecで回したいと考えています。(ちなみに下記servo()のwhileループ内の処理負荷を上げ下げしても処理が1msecで収まれば実行回数(cnt)はほぼ毎秒1000回となり、1msecを超える処理であれば毎秒500回となりましたので、等時間間隔の制御は行えそうです。)よろしくお願いいたします。

    //servoメイン
    int cnt=0;
    void servo(void const *n){
    while(1){
    ADread();
    controller();
    DAwrite();
    cnt++;
    Thread::wait(1); //←100μsecにしたい
    }
    }

    void check(void const *n){
    while(1){
    printf("cnt=%d\r\n",cnt);
    cnt=0;
    Thread::wait(1000);
    }
    }

    int main(void) {
    Thread servo_t(servo , NULL , osPriorityHigh);
    Thread check_t(check , NULL , osPriorityHigh);

    Thread::wait(osWaitForever);
    }
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • dkato
    0 dkato over 2 years ago in reply to sam
    ①この辺りが参考になると思います。
    www7b.biglobe.ne.jp/.../cpp02016.html
    ②上のリンクで紹介した通りvirtual付いてます。
    ③wait_us()やwait_ns()があります。
    github.com/.../mbed_wait_api.h
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • sam
    0 sam over 2 years ago in reply to dkato
    dkatoさん、ご回答ありがとうございます。
    理解ができなくて申し訳ありません。

    ①についてです
    オーバーライドのサンプル
    itsakura.com/cpp-override
    を基に、

    従来このように書いたものを
    AnalogIn a0(A0);
    void i_func() { //タイマー割込み関数
    float dat=a0.read(); //AD読み出し
    ;
    }

    このようにするという理解でよろしいでしょうか。
    // AnalogInの子クラス
    class AnalogIn2 : public AnalogIn {
    public:
    void lock() override { //空の関数
    ;
    };
    void unlock() override { //空の関数
    ;
    };
    };
    // 子クラスを使用
    AnalogIn *a0(A0) = new AnalogIn2; //←①ここをどのように書いたらよいでしょうか
    void i_func() { //タイマー割込み関数
    float dat=a0->read();
    ;
    }


    ③についてです、
    スレッドのウエイトでもusが可能でしょうか。
    Thread::wait(1); で動いていたものを Thread::wait_us(1000);とするとエラーになりました。
    どのように書いたらよいでしょうか。

    たびたびで申し訳ありませんが、何卒よろしくお願いいたします。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • hagiryo
    0 hagiryo over 2 years ago in reply to sam

    samさん

    wait_us()関数はThread用関数ではありません。

    以下のようにクラス指定なしでコールすると、コールできます。

    void i_func()

    {

    float dat1,dat2;

    dat1=a0.read();

    wait_us(100);

    dat2=a0.read();

    }

    ただし、wait_us()はその場で待ち続けるため、他のタスクが裏で動作しません。

    ・AD読み込みタスクでevent_flag待ちする。フラグが立ったらADを読んで、またevent_flag待ちに戻る

    ・Timerハンドラを定期的に呼び出し、ハンドラ内でevent_flagをセットする

    という実装ではいかがでしょうか?

     

    以下はmbed-os blinkyに上記機能を追加したmainc.cppです。

    1307.main.zip

     

    難しいのであれば、作成したソースを公開するとか考えていない場合、AnalogInのlock/unlockをコメントアウトしてしまうのが最も簡単です。

     

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • sam
    0 sam over 2 years ago in reply to hagiryo
    ありがとうございます。
    1307.mainを参考に考えてみます。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • sam
    0 sam over 2 years ago in reply to hagiryo
    1307.mainを基に下記の方法でperiodを変えて試してみました。EventFlagsで応答するのはタイマー割込み間隔がおおよそ3msecまででした。
    アドバイスなどありましたらお願い致します。

    #include "mbed.h"
    #include "platform/mbed_thread.h"

    Thread thread;
    EventFlags event_flags;

    volatile int th_cnt=0, i_cnt=0;
    void ad_thread()
    {
    while(1) {
    event_flags.wait_any(1);
    th_cnt++;
    }
    }

    Ticker timer;
    void ticker_handler()
    {
    event_flags.set(1);
    i_cnt++;
    }

    int main()
    {
    DigitalOut led(LED1);
    int period=10000; //タイマー割込み間隔us ←この値を変えます
    int counter=1000000/period; //1秒間の割り込み回数
    printf("counter=%d\r\n", counter);

    thread.start(ad_thread);
    timer.attach_us(&ticker_handler, period);

    while (true) {
    if(i_cnt>=counter){
    i_cnt=0;
    printf(" th_cnt=%d\r\n", th_cnt);
    th_cnt=0;
    led = !led;
    }
    }
    }
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • sam
    0 sam over 2 years ago in reply to hagiryo
    hagiryoさん、
    以前のアドバイスで、「AnalogInのlock/unlockをコメントアウトしてしまうのが最も簡単です。」と頂きました。
    知識が乏しくて申し訳ありません。具体的にはどのように行えばよいでしょうか。
    よろしくお願いします。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
Reply
  • sam
    0 sam over 2 years ago in reply to hagiryo
    hagiryoさん、
    以前のアドバイスで、「AnalogInのlock/unlockをコメントアウトしてしまうのが最も簡単です。」と頂きました。
    知識が乏しくて申し訳ありません。具体的にはどのように行えばよいでしょうか。
    よろしくお願いします。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
Children
No Data
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2022 Renesas Electronics Corporation. All rights reserved.