ふと、現状のTS820の外部DDS-VFO(VFOsys改)のシリアル通信を複数使い、現状の周波数情報とは別の割り込みを追加し別のシリアル通信を行って見ることにしました。現状も割り込み処理はオリジナルのVFOsysでも周波数の設定で使用していますが、別途新たに割り込み処理を追加することをから確認してみました。
オリジナルの周波数設定の割り込みです。
/*--------------------------------------------------------------------------
Timer ISR
---------------------------------------------------------------------------*/
hw_timer_t * timer = NULL;
void IRAM_ATTR onTimer(){}
Timer ISR
---------------------------------------------------------------------------*/
hw_timer_t * timer = NULL;
void IRAM_ATTR onTimer(){}
//-----------------------------------------------------------------------
void setup(){
〜省略
//--------- create tasks on core0 --------------------------------
xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
//--------- Set up Interrupt Timer -------------------------------
timer = timerBegin(0, 80, true); //use Timer0, div80 for 1us clock
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 10000, true); // T=10000us
timerAlarmEnable(timer); // Start Timer
timer = timerBegin(0, 80, true); //use Timer0, div80 for 1us clock
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 10000, true); // T=10000us
timerAlarmEnable(timer); // Start Timer
〜省略
}
/*-----------------------------------------------------------------------------------------------
Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
〜task0スケッチ(省略)
}
上記以外でのあらたな割り込み追加です。割り込みでは2秒間隔でLEDをブリンクさせます。
//for warikomi led blink
timer = timerBegin(0,80,true);
timerAttachInterrupt(timer,&LED_Blink,true);
timerAlarmWrite(timer,2000000,true);
timerAlarmEnable(timer);
timer = timerBegin(0,80,true);
timerAttachInterrupt(timer,&LED_Blink,true);
timerAlarmWrite(timer,2000000,true);
timerAlarmEnable(timer);
//------------------------------------------------------------------------
void IRAM_ATTR LED_Blink(){
digitalWrite(ICHI_POSI1,!digitalRead(ICHI_POSI1));
}
digitalWrite(ICHI_POSI1,!digitalRead(ICHI_POSI1));
}
//------------------------------------------------------------------------
LED_Blinkルーチンの割り込み実行時の動画です。
ロータリーエンコーダーは回していませんが周波数の変更は通常通り出来ます。
LEDの点滅のルーチンが出来たので、やりたい事の一つのシリアル通信スケッチを追加
してみました。
//------------------------------------------------------------------------
void IRAM_ATTR LED_Blink(){
digitalWrite(ICHI_POSI1,!digitalRead(ICHI_POSI1));
digitalWrite(ICHI_POSI1,!digitalRead(ICHI_POSI1));
Serial2.write(frq);
}
//------------------------------------------------------------------------
コンパイルも問題なく通ります。TFT液晶にもサブダイヤル、周波数と問題なく表示されロータリーエンコーダーも問題ありません。ところが、ある時間(1分くらい)経過すると次のようにリブートされて、再起動してしまう状態がシリアルモニターで確認出来ました。
なぜ Guru Meditation Error:Core 1 panic'ed(Cache disabled but cached memory region accessed)
が起きるのかをひとまずWebで確認です。
関係してそうな原因その1、その2などの対策やってみましたが、リブートは相変わらず起きてしまいます。
どうも、割り込みルーチンでのシリアル通信など負荷が大きいスケッチではリブートしてしまうことのようです。LED点滅は負荷が軽いので、問題ないということです。なお、UART2のシリアル通信は本体のルーチン内での使用が、常道のようでした。本当であれば割り込みで使いたかったのですが、負荷が大きい為、リブートしてしまうので、先の話ですが、常道の本体側で使用します。このUART2を使いハムログの周波数読み取り用のシリアルポートで使用したいという事です。TS820からハムログへの周波数データー送出のシリアル通信処理を付けたいという思いです。目標でもあります。Hi
ちなみにUART2のシリアルポートは、ロータリーエンコーダーを他の4,19ピンに変更し16,17をUART2様にしました。RXが16ピンで、TXが17ピンです。作製済みのパターンは変更が必要です。
ハムログ用のデータでの送出対応はまだしてませんが、適当に周波数を送るコードをいれて、リブートしないことを確認はしてあります。
#define PULSE_INPUT_PIN 4 // Rotaty Encoder A
#define PULSE_CTRL_PIN 19 // Rotaty Encoder B
//#define PULSE_INPUT_PIN 16 // Rotaty Encoder A
//#define PULSE_CTRL_PIN 17 // Rotaty Encoder B
#define PULSE_CTRL_PIN 19 // Rotaty Encoder B
//#define PULSE_INPUT_PIN 16 // Rotaty Encoder A
//#define PULSE_CTRL_PIN 17 // Rotaty Encoder B
#define RXD2 16
#define TXD2 17
#define TXD2 17
void setup(){
Serial.begin(115200); //add 2020.oct.18
Serial2.begin(115200,SERIAL_8N1,RXD2,TXD2);
Serial2.begin(115200,SERIAL_8N1,RXD2,TXD2);
〜省略
}
void loop(){
〜省略
Serial2.println(frq);
//Display Dial
Dial(frq); //long frq=init_freq ;#define init_freq 7******
Dial(frq); //long frq=init_freq ;#define init_freq 7******
//-------- Display Digital Frquency ---------------------------------------
sprintf(str, "%3d.%03d,%02d", frq/1000000, (frq/1000)%1000, (frq/10)%100 );
sprintf(str, "%3d.%03d,%02d", frq/1000000, (frq/1000)%1000, (frq/10)%100 );
disp_str16(str,17, 110, 0xffd080);
sprintf(str, "MHz" );
sprintf(str, "MHz" );
disp_str12(str,120, 111, 0xffd080);
〜省略
}
本当は、レジュームの機能をさせる為のEEPROMのまとめをするつもりでしたが、ふと割り込みの確認をしてしまいました。実際のEEPROMのスケッチは、かなり変更が入りましたので、まとめがまだ出来ていません。(周波数情報用のコード変更、つまり仕様変更が出てしまいました。)
今回のUART2を追加した分のESP32DevKitCのスケッチファイル名はサフィックスに-aを付けて変更しました。(いつでも、前のスケッチが使用出来るようにしておく為です。)
今回のスケッチファイル名: (VFOsys-SERIAL-a.ino)
それ以前のスケッチファイル名:(VFOsys-SERIAL.ino)
つづく?