質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

解決済

Arduino(M5StickC-Plus)タイマー割込み処理中のdelay処理を行う方法はありますか?

Yasu0421
Yasu0421

総合スコア35

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

3回答

0リアクション

0クリップ

606閲覧

投稿2022/05/29 08:54

動作環境・問題点

ESP32picoを搭載したArduino-IDEで動作するM5StickC-Plusを使用しています。
M5StickC-Plus表面にある「ボタンA」を押下した時点で
①sec毎にタスクが実行されるタイマー割込みを起動
②そのタスクにおいてGPIO25ピンから割込み開始時から50mSecだけHighを出力
③同時にそのタスクにおいてLEDの出力を反転させる処理を実行
するようなプログラムを作成しております。上記②の処理で「delay(50)」関数を用いて
50mSec後にGPIO25ピンを反転させる処理をおこなっているのですが、実行してくれず困っております。
素人のご質問で大変恐縮ではございますが、ご教示いただけますと幸いです。

実現したいこと

実現したいことは
①ボタンAを押下すると、1秒毎のタイマー割込みの動作が開始されます
②タイマー割込み処理では以下の処理を実施したいです。
・タイマー割込み処理毎にLED(GPIO10)の出力を反転させる処理を行う
・タイマー割込み処理開始時に50mSec間だけGPIO25ピンからHighを出力させる
タイミングを図示すると以下の様になります。
イメージ説明
③ボタンBを押下すると、①の動作を停止する

です。

発生している問題

下記の「該当のソースコード」を実行し、シリアルモニターで動作を確認しましたところ

HOME_BTN was pressed...... 16:54:06.344 -> start_time =6036 16:54:06.344 -> delay_time =6036 16:54:06.377 -> end_time =6036

と、タスク内で実行した時刻が全て同じに表示されており、GPIO25からの出力もHighのまま変化してくれません

該当のソースコード

#include <M5StickCPlus.h> hw_timer_t * timer1 = NULL; int onemicro; unsigned long exe_time; void IRAM_ATTR onTimer() { exe_time = millis(); Serial.print("start_time ="); Serial.println(exe_time); digitalWrite(GPIO_NUM_10, !digitalRead(GPIO_NUM_10)); digitalWrite(25, 1);//OE on delay(100); exe_time = millis(); Serial.print("delay_time ="); Serial.println(exe_time); digitalWrite(25,0); //OE off exe_time = millis(); Serial.print("end_time ="); Serial.println(exe_time); Serial.println("-------"); } void setup() { M5.begin(); Serial.begin(9600); pinMode(25, OUTPUT); pinMode(GPIO_NUM_10, OUTPUT); onemicro =getApbFrequency()/1000000; timer1 = timerBegin(0, onemicro, true); timerAttachInterrupt(timer1, &onTimer, true); } void loop() { M5.update(); // Buttonの状態更新のため必要 if(M5.BtnA.wasPressed()){ Serial.println("HOME_BTN was pressed......"); timerAlarmWrite(timer1, 1000000, true); //1000msec毎に実施 timerAlarmEnable(timer1); } if(M5.BtnB.wasPressed()){ Serial.println("B-BTN was pressed......"); timerAlarmDisable(timer1); } }

試したこと

もう1つタイマーを設けて並列処理を考えてみましたが、やはり50mSec後に変化させる必要があるため、上記と同様の問題に直面しました。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。