動作環境・問題点
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後に変化させる必要があるため、上記と同様の問題に直面しました。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/30 06:34