UMEHOSHI ITA TOP PAGE COMPUTER SHIEN LAB
[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
以降では、このプログラムを「テスト・ウメ・フラッシュ」と呼ぶことにして解説します。
また、「テスト・ウメ・フラッシュ」を利用したユーザー用のプログラムを
「ウメ・エディットプログラム」と呼ぶことにします。
「ウメ・エディットプログラム」の開発では「umehoshiEditツール」が必要で、
その取得や最初の操作情報は、こちらを参照してください。
(「PICKit3などの書き込みツール」をお持ちの方で、「テスト・ウメ・フラッシュ」を利用しないで、
「MPLAB X IDE」の開発環境ですべてをプログラミングする場合の情報ではありません。)
「テスト・ウメ・フラッシュ」をどのように利用して、「ウメ・エディットプログラム」を
作るかの解説で、「umehoshiEditツール」の使用例を示しています。
各サンプルは、このWebページ上でドラック&コピーして、貼り付けしてご利用ください。
各種確認プログラム | 左記に必要な部品の追加例 |
---|---|
とくに必要ありません。 (D1のLEDは、あるとよい) | |
PWM対応の部品追加例 | |
ADC 対応の部品追加例 | |
BEEP SWITCH 対応の部品追加例 | |
Reset SW, Type-A, CN2 部品追加例 | |
U20,D4,D5,NPN, D3 部品追加例 | |
CN11,CN-12 部品追加例 | |
U19 部品追加例 | |
U17にRN4020の部品を追加する例 |
[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を介した実行によるタイマー動作のスタートが可能です。
PCと「Type-A」を接続します。(「micro B」のUSBが電源に繋がっているとUSBが識別しません。)
PCと「Type-A」は電源供給と通信を兼用します。(Type-AのCOMポートが確認できます。)
「Type-A」を介してプログラムを転送し、実行します。
「umehoshiEditツール」で前述のプログラムをビルドして、出来たHexファイルを転送します。
「micro B」コネクタを介して電源を供給します。
下記は、単3電池(1.5v)を4個を使った例です。電池は1.2vの「ニッケル水素電池 1.2v」も可能です。
(モバイル・バッテリーも、使える可能性があります。)
「Type-A」の接続を外します。これで[UMEHOSHI ITA]単体が「micro B」を介して電池で動作していることになります。
この状態で、リセットボタンを操作すれば、実行が始まります。
これでタイマーが起動するとLED1が点滅します。
そして3分間経過すると、0b10110100に相当する「−・−−」の音がなります。
この音はSW2を押すと、音や割込みを停止し、変数countを0にします
ここで、リセットボタンを操作すれば、再び実行が始まります。
上記ソースコードの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