ご覧いただきありがとうございます。
子供のころからものづくりが好きな
50代のおじさんです。
「PICマイコン」を使った電子工作や、
「Unity」というゲームエンジンを使った
遊びについて書いています。
ものづくりで悪戦苦闘している様子を
見て行ってください。
前回判明した課題
「ボールに基板が入った状態で電源をON/OFFする方法を考えなければなりません」に現在、挑戦中です。
ミズノの計測ボールについて調べたところスマホアプリのメニューからボールの起動ができるようです。
なので今の段階としては、TeratermからPICをSLEEPモードにしたり復帰させたりすることを考えようと思います。
実現方法を一から調べることに貴重な時間や仕事で疲れている頭を使うのはやめたいので、今回もChatGPTに頼ります。
「COMポート経由でPICをSLEEPモードにしたり、SLEEPモードから復帰させたりするPIC16F1455のソースコードを書いてほしいんだけどできるかな?」と書きこんだところ、こころよくコードを書いてくれました。
#include <xc.h>
#include <stdint.h>
// CONFIG1
#pragma config FOSC = INTOSC // 内部発振器を使用
#pragma config WDTE = OFF // ウォッチドッグタイマーを無効
#pragma config PWRTE = OFF // 電源ONリセットタイマーを無効
#pragma config MCLRE = ON // 外部リセットを使用
#pragma config CP = OFF // プログラムメモリ保護を無効
#pragma config CPD = OFF // データメモリ保護を無効
#pragma config BOREN = ON // ブラウンアウトリセットを有効
#pragma config CLKOUTEN = OFF// CLKOUTピンを使用しない
#pragma config IESO = OFF // 内部/外部スイッチオーバーを無効
#pragma config FCMEN = OFF // 外部クロック監視を無効
// CONFIG2
#pragma config WRT = OFF // フラッシュメモリ書き込み保護を無効
#pragma config PLLEN = OFF // 内部クロックの4倍周波数増幅を無効
#pragma config STVREN = ON // スタックオーバフロー/アンダフローリセットを有効
#pragma config BORV = HI // ブラウンアウトリセット電圧(高)
#pragma config LVP = OFF // 低電圧プログラミングを無効
#define _XTAL_FREQ 8000000 // PICの動作クロック周波数(ここでは8MHzと仮定)
void main(void) {
// 内部クロックの設定
OSCCONbits.IRCF = 0b111; // 最大クロック周波数8MHzを選択
// シリアル通信の設定
TXSTAbits.SYNC = 0; // 非同期モード
TXSTAbits.BRGH = 1; // 高速ボーレート選択
BAUDCONbits.BRG16 = 0; // 8ビットボーレートジェネレータ
SPBRG = 51; // 9600ボーレートの場合
TXSTAbits.TXEN = 1; // 送信有効化
RCSTAbits.SPEN = 1; // シリアルポート有効化
while (1) {
if (PIR1bits.RCIF) { // 受信割り込みフラグが立っているかどうか確認
char command = RCREG; // 受信したコマンドを取得
if (command == 's') { // 's'が受信された場合、SLEEPモードに入る
SLEEP(); // SLEEPモードに入る
} else if (command == 'w') { // 'w'が受信された場合、SLEEPモードから復帰
asm("NOP"); // ダミー命令(必要なクロックサイクルの確保)
}
}
}
return;
}
上のコードを参考に、以前作成済みのコードに変更を加え動かしてみたところ、センサー基板からの文字列をTeratermで受信している状態でキーボードの"s"キーを押すと、表示が止まるのでSLEEP状態には移行できているようです。
しかし、その状態からキーボードの"w"キーを押しても復帰する気配がありません。
継続して調べてみます。
ではまた。
時間があればこちらもどうぞ