UMEHOSHI ITA TOP PAGE    COMPUTER SHIEN LAB

[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
以降では、このプログラムを「テスト・ウメ・フラッシュ」と呼ぶことにして解説します。
また、「テスト・ウメ・フラッシュ」を利用したユーザー用のプログラムを 「ウメ・エディットプログラム」と呼ぶことにします。
「ウメ・エディットプログラム」の開発では「umehoshiEditツール」が必要で、 その取得や最初の操作情報は、こちらを参照してください。
(「PICKit3などの書き込みツール」をお持ちの方で、「テスト・ウメ・フラッシュ」を利用しないで、 「MPLAB X IDE」の開発環境ですべてをプログラミングする場合の情報ではありません。)
「テスト・ウメ・フラッシュ」をどのように利用して、「ウメ・エディットプログラム」を 作るかの解説で、「umehoshiEditツール」の使用例を示しています。
各サンプルは、このWebページ上でドラック&コピーして、貼り付けしてご利用ください。

各種確認プログラム左記に必要な部品の追加例

USBで接続されるホストにメッセージ(文字列)を送信する。

とくに必要ありません。
(D1のLEDは、あるとよい)

モータ制御、PWM (Timer2利用)

PWM対応の部品追加例

ADC(A/Dコンバータ)を使う(Timer3利用)

ADC 対応の部品追加例

BEEP(ブザー音で、デフォルトのCORE Timer、Timer1を利用)

BEEP SWITCH 対応の部品追加例

[UMEHOSHI ITA]単体で動作させる

Reset SW, Type-A, CN2 部品追加例

赤外線制御

U20,D4,D5,NPN, D3 部品追加例

UART を介して、Bluetoothで制御

CN11,CN-12 部品追加例

UART を介して、ESP32-WROOM-32DをBASIC制御

U19 部品追加例

UART を介して、RN4020(BLE)で制御

U17にRN4020の部品を追加する例

[UMEHOSHI ITA]単体で動作させる

[UMEHOSHI ITA]単体で動作させる時に必要な部品の追加です。

以下のように電源だけ供給して、リセットボタン(赤)でプログラムを実行させるような作品が可能です。
下記では、単3電池4本を使っていますが、モバイルバッテリーなども利用できるでしょう。
(電源供給のUSBを抜いてしまうと、プログラムは消えてしまいます。
ですから電源を供給し続ける必要がありますが、比較的低電力の仕様なのでこのような電池駆動ができるでしょう。)


例として、以下で3分間タイマーの作成を示します。
赤のリセットスイッチ(SW1)を押すと、3分後にブザーを鳴らします。
その後、白のスイッチ(SW2)でブザーを止めることができるだけの簡単な仕様の作品です。

この仕様を実現するプログラムの作成

これは 『関数絶対アドレス(0x80005000など)を指定して「Execute」ボタンを押す』 ことで起動する作品ではありません。
しかし、「umehoshiEditツール」で、プログラムを転送する操作や、 [UMEHOSHI ITA]の起動ルーチンを自分用に書き換える動作を実行させる必要があります。
ここで、 [UMEHOSHI ITA]の起動を含めた内部動作の概要を示します。

リセットやPower ON時は、上記のように、 『ループ前の各種初期設定』を行った後、『USB受信文字列処理用のループ』に進みます。
(異常がなければ、これはUSB受信の無限ループです)

『ループ前の各種初期設定』では、 CPUの各種ポートの設定や割り込み処理の初期化、 関数へのポインタなど各種変数の初期化を行っています。
この中では、「_init_sub_func()」という初期化用マクロを呼び出しています。
これは、common.hで定義され、_HANDLES[_IDX_INIT_SUB_FUNC]に記憶される 関数を呼び出す表現です。

さてこの記憶域や、プログラムの転送先などのメモリ空間の記憶内容は、CPUのリセットで初期化されません。
言い換えると、「_init_sub_func()」を「自分用のプログラム」に _HANDLES[_IDX_INIT_SUB_FUNC]の変更で書き換えると、 、リセットボタンで「自分用のプログラム」が起動するようになります。
つまり、この仕組みを利用すれば、このようにリセットスイッチで起動する作品が可能です。

以前のページで、「割り込み処理の関数」を作って別途に作った 「割込み許可などのスタート処理」で起動する方法を紹介しました。

リセットで起動で動作するプログラムを作る場合も「割り込み処理の関数」を 作るまでは同じです。
そして、リセットで起動させるため、「割込み許可などのスタート処理」_HANDLES[_IDX_INIT_SUB_FUNC]設定します。
この設定処理は、絶対アドレス指定のUSBを介した実行処理で行います。
一度、設定すればリセットで初期化されない領域なので、リセット後でも登録処理が動作できるという訳です。
(なお、Power ON時には初期化されてしまいます。)
この実際のコードを以下に紹介します。

#include <xc.h>// timer.c
#include <stdlib.h>
#include "common.h"
void timer(){//「割り込みで目的のプログラム行うため処理: 0.00005秒ごとに呼び出される。」
	static int count=0;
	static int end_n = 20000 * 60 *3;//3分間に相当するカウント値

	if( count == end_n ){
		_set_beep_code((uint8_t)0b10110100);// ブザー通報音登録
		++count;
	}
	int sw2 = _switch2_state();//スイッチSW2の状態取得
	if( sw2 ){ // 押した時、
		_clear_beep_code();// ブザー関連初期化
		T4CONbits.ON = 0;// timer4割込みオフ
		count = 0;
		_RB15 = 0; // D1 LED の初期点灯
	}
	if( count == end_n+1){
		return;
	}

	++count;//20000回で1秒
	if( count % 10000 == 0 )  _RB15 = ! _RB15;// D1 LEDを反転
}
void restart(){
	_HANDLES[_IDX_TIMER_4_FUNC] = timer;//デフォルトで0.00005秒ごとに呼び出しに登録 	
	IEC0bits.T4IE = 1;// Timer4 Enable(割込み許可)
	T4CONbits.ON = 1;// timer割込みオン
}
__attribute__((address( 0x80005000 ))) void setting(void); void setting() { _HANDLES[_IDX_INIT_SUB_FUNC] = restart; //restart(); }

上記のままでは、USBを介した実行によるタイマー動作のスタートが出来ません。
リセットボタン(SW1)操作をすれば_HANDLES[_IDX_INIT_SUB_FUNC]に 記憶されるrestartが呼び出されて実行がスタートします。
まお、『//restart();』のコメントを外せば、USBを介した実行によるタイマー動作のスタートが可能です。

プログラムの転送と、電池駆動

上記で作成したプログラムの初期実行方法を示します。
「micro B」が電源供給専用で、「Type-A」が通信用となります。

まず、「micro B」のUSBも「Type-A」も接続を外しておきます。
  1. PCと「Type-A」を接続します。(「micro B」のUSBが電源に繋がっているとUSBが識別しません。
    画像クリックで画像の大きさが変わります。

  2. PCと「Type-A」は電源供給と通信を兼用します。(Type-AのCOMポートが確認できます。)

  3. 「Type-A」を介してプログラムを転送し、実行します。
    「umehoshiEditツール」で前述のプログラムをビルドして、出来たHexファイルを転送します。

  4. 「micro B」コネクタを介して電源を供給します。
    下記は、単3電池(1.5v)を4個を使った例です。電池は1.2vの「ニッケル水素電池 1.2v」も可能です。
    (モバイル・バッテリーも、使える可能性があります。)
    画像クリックで画像の大きさが変わります。

  5. 「Type-A」の接続を外します。これで[UMEHOSHI ITA]単体が「micro B」を介して電池で動作していることになります。
    画像クリックで画像の大きさが変わります。
    この状態で、リセットボタンを操作すれば、実行が始まります。
    これでタイマーが起動するとLED1が点滅します。
    そして3分間経過すると、0b10110100に相当する「−・−−」の音がなります。
    この音はSW2を押すと、音や割込みを停止し、変数countを0にします

  6. ここで、リセットボタンを操作すれば、再び実行が始まります。



上記ソースコードのsetting()関数内の最後の「//restart();」のコメントを外してビルドし、
そのhexファイルを実行させるumehoshiアプリ用のファイル「3minute_timer.umh」の例を以下に示します。

3MinuteTimer
S04800080000080EE36009E
S04800080040000000000D5
S108000500000E8FFBD271400BFAF1000BEAF21F0A00317
S10800050100000A0023CC84042340080033CC0516324C0
S108000502000000043AC7014000C0000000021E8C003DD
S1080005030001400BF8F1000BE8F1800BD270800E00373
S04800050400000000000D8
S108000504400E0FFBD271C00BFAF1800BEAF21F0A00300
S1080005054000180023C0480438C0180023C0080428CBD
S1080005064000C0062140000000000A0023CF0414234E4
S1080005074000000428CB400042409F8400000000000E8
S1080005084000180023C0480428C010043240180023CD6
S108000509400048043AC00A0023C1C4042340000428CAC
S10800050A40009F84000000000001000C2AF1000C28FAE
S10800050B400100040100000000000A0023CF4414234EE
S10800050C4000000428C09F840000000000080BF033CB3
S10800050D400000C6294C47B027C000C62A40180023C82
S10800050E400048040AC88BF033C20616294C47B027C57
S10800050F400206162A40180023C0080428C01004324C7
S1080005104000180023C0480428C0300621400000000FC
S1080005114006A140008000000000180023C0480428CE7
S108000512400010043240180023C048043AC0180023CD1
S1080005134000480458CDB68023CAD8B42341800A20073
S10800051440010100000031B0200C31705002318620003
S108000515400212060008010040021204000401104002A
S108000516400231044002110430080180200211043001D
S108000517400001102002318A2000A0060140000000012
S10800051840088BF023C2061428C008042300100422CAB
S108000519400FF00443088BF033C20616294C47B827C57
S10800051A400206162A421E8C0031C00BF8F1800BE8F45
S0C800051B4002000BD270800E0030000000065
S10800051C000F8FFBD270400BEAF21F0A00300A0023C2A
S10800051D000944042340080033C44506324000043ACC4
S10800051E00088BF033C6010628C01000424C49C827C6C
S10800051F000601062AC80BF033C000C62940100042499
S108000520000C47B827C000C62A421E8C0030400BE8F5A
S0C80005210000800BD270800E0030000000073
S108000521C0000800080040000000100000080EE3600F9
S088000522C00048000800400000029
R00800050000061
このタイマー割り込みのパルス変調で、どの程度の音質を出せるかを検討中
このタイマー割り込みで、I2Cインターフェイスを介したデバイスを制御する検討中