UMEHOSHI ITA TOP PAGE

4bitのコードをブザーで鳴らす(D2のLED点滅が連動)

圧電サウンダ(PKM13EPYH4000)を使って、4ビットの2進コードを、音で表現します。
圧電サウンダの接続は、下記回路図で赤の接続線で示しています。
これは制御チップで[PORTB REGISTER]のBit5をを意味しています(資料:DS60001168K TABLE 11-4: PORTB REGISTER MAP)。
よってこの圧電サウンダに繋がるRB5の端子は、D2のLEDにも接続しています。
この端子を1→0→1→0→1→0→1→0→1→0→1と設定を繰り返すことで出来る振動波で音をが鳴ります。
なお、サウンド制御関数を使うと容易に鳴らすことができます。

デバックのブザー音制御用関数の int _debug_hex4(n,c,b)で、第2引数cの下位4bitのバイナリ情報の音を出しの登録をします。
(第1引数で、登録に使う識別番号を指定します。登録済み番号を指定しても意味はありません。
  また登録は第3引数が0以外で可能です。戻り値は、登録時や後の戻り値は1です。)
この関数で振動するブザー用の端子は、D2のLEDと同じで、兼用の出力になっています。
この音がなる振動によりD2 LEDも点灯します。(音が出ない時はLowレベルで消灯します。)

以下では、リセットで0x01の登録の試みを繰り返しています。
繰り返し内で最初のint flag0 = _debug_hex4(0,0x01,TRUE);で、0x01の音が登録されます。
それにより、0x01の音が鳴り始めます。
短音と長音のパターンで、0が短音の「・」で、1が長音の「―」で下位ビットから上位ビットの順番で鳴らします。
よって、「・・・―」のパターンの音が鳴ります。
_debug_hex4(0,0x01,TRUE);を繰り返していますが、登録は1回だけです。
そして登録された音は繰り返しで鳴ります。
また、登録や登録後の戻り値は1となります。
この戻り値flag0とスイッチSWがONをAND条件にした第3引数で、 _debug_hex4(2,0x0e,sw2 && flag0); を実行しています。
つまりこの第3引数は、先行の_debug_hex4の登録を経由してSW2がONの場合だけ 0x0eのデータの音を鳴らす登録をしています。
この登録音のパターンは「― ― ―・」で、 登録出来た場合の戻り値はflag2に設定され、1であれば繰り返しを停止させるプログラムにしました。
この音が登録されると全体の音は、「・・・―  ― ― ―・」の繰り返し音となり、プログラムが終了しても 鳴り続ける仕様が確認できます。
また「・・・―」の後「― ― ―・」が鳴ることから、 0x01の登録後に0x0eのdebug_hex4の登録が行われたと分かります。
このようにdebug_hex4の戻り値を、次のdebug_hex4の第3引数に指定することで、 どのdebug_hex4が、どの順番で登録されたかたを確かめることができます

(下記C言語ソースは、「umehoshiEdit」ツールで、ビルド実行できます。
右ソースは逆アセンブルしたコードで、これを参考に、後述のアセンブリソースを作っています。)

#include <xc.h>//beep4bit.c

#include "common.h"

#define TRUE 1

__attribute__((address( 0x80005000 ))) void start_boot(void);

void start_boot()
{
	extern void start_main();

	_HANDLES[_IDX_INIT_SUB_FUNC] = start_main; //起動時に動作する関数に、下記start_mainを登録
}

void start_main()
{
	int flag2 = 0;

	while( flag2 == 0){

		// 0の識別番号で、0x01(ー・・・のパターンの音)を登録
		int flag0 = _debug_hex4(0,0x01,TRUE);
		// (音の登録は、第1引数の識別番号が未登録の時だけです。登録後は鳴り続けます。)

		int sw2 = (PORTB & 0x80) == 0;// SW2のスイッチを押すと1にセット

		// 「sw2 && flag0 」が0でなければ、2の識別番号で、0x0e(ー・・・のパターンの音)を登録
		flag2 = _debug_hex4(2,0x0e, sw2 && flag0 );
		// flag0の1を得た _debug_hex4の後に、上記を実行しているか確かめることができる。

	}
}











80005000 <start_boot>:
80005000:	27bdfff8 	addiu	sp,sp,-8
80005004:	afbe0004 	sw	s8,4(sp)
80005008:	03a0f021 	move	s8,sp
8000500c:	3c02a000 	lui	v0,0xa000
80005010:	344240c8 	ori	v0,v0,0x40c8
80005014:	3c038000 	lui	v1,0x8000
80005018:	24635034 	addiu	v1,v1,20532
8000501c:	ac430000 	sw	v1,0(v0)
80005020:	03c0e821 	move	sp,s8
80005024:	8fbe0004 	lw	s8,4(sp)
80005028:	27bd0008 	addiu	sp,sp,8
8000502c:	03e00008 	jr	ra
80005030:	00000000 	nop

80005034 <start_main>:
80005034:	27bdffd8 	addiu	sp,sp,-40
80005038:	afbf0024 	sw	ra,36(sp)
8000503c:	afbe0020 	sw	s8,32(sp)
80005040:	03a0f021 	move	s8,sp
80005044:	afc00010 	sw	zero,16(s8)
80005048:	08001436 	j	800050d8 <.LBE2>
8000504c:	00000000 	nop

80005050 <.LBB2>:
80005050:	3c02a000 	lui	v0,0xa000
80005054:	3442420c 	ori	v0,v0,0x420c
80005058:	8c420000 	lw	v0,0(v0)
8000505c:	00002021 	move	a0,zero
80005060:	24050001 	li	a1,1
80005064:	24060001 	li	a2,1
80005068:	0040f809 	jalr	v0
8000506c:	00000000 	nop
80005070:	afc20014 	sw	v0,20(s8)
80005074:	3c02bf88 	lui	v0,0xbf88
80005078:	8c426120 	lw	v0,24864(v0)
8000507c:	30420080 	andi	v0,v0,0x80
80005080:	2c420001 	sltiu	v0,v0,1
80005084:	304200ff 	andi	v0,v0,0xff
80005088:	afc20018 	sw	v0,24(s8)
8000508c:	3c02a000 	lui	v0,0xa000
80005090:	3442420c 	ori	v0,v0,0x420c
80005094:	8c430000 	lw	v1,0(v0)
80005098:	8fc20018 	lw	v0,24(s8)
8000509c:	10400007 	beqz	v0,800050bc <.LBB2+0x6c>
800050a0:	00000000 	nop
800050a4:	8fc20014 	lw	v0,20(s8)
800050a8:	10400004 	beqz	v0,800050bc <.LBB2+0x6c>
800050ac:	00000000 	nop
800050b0:	24020001 	li	v0,1
800050b4:	08001430 	j	800050c0 <.LBB2+0x70>
800050b8:	00000000 	nop
800050bc:	00001021 	move	v0,zero
800050c0:	24040002 	li	a0,2
800050c4:	2405000e 	li	a1,14
800050c8:	00403021 	move	a2,v0
800050cc:	0060f809 	jalr	v1
800050d0:	00000000 	nop
800050d4:	afc20010 	sw	v0,16(s8)

800050d8 <.LBE2>:
800050d8:	8fc20010 	lw	v0,16(s8)
800050dc:	1040ffdc 	beqz	v0,80005050 <.LBB2>
800050e0:	00000000 	nop
800050e4:	03c0e821 	move	sp,s8
800050e8:	8fbf0024 	lw	ra,36(sp)
800050ec:	8fbe0020 	lw	s8,32(sp)
800050f0:	27bd0028 	addiu	sp,sp,40
800050f4:	03e00008 	jr	ra
800050f8:	00000000 	nop

  以下に、上記の実際に動作した、アセンブリリストを示します。上のC言語の逆アセンブルリストをコードにしてみました。

(UMEHOSHI ITA基板で使っている制御チップのPIC32MX270F256B用(MIPS32系)アセンブリに必要な情報の概要です。)

以下は上記のリセット操作で、0x01に対応する「・・・―」の音を鳴らします。その後SW2のスイッチを押すと 0x0eに対応する「― ― ―・」音をが追加されるプログラムです。

  上記で編集したアセンブリソースを、左のボタンで「アッセンブル」できます。
番地から実行するUME専用Hexコマンドを、 最後に追加埋め込みする場合にチェックする==>

上記で生成した[UME専用Hexコマンド]のテキストを コピー(CTRL+A CTRL+C)してUMEHOSHI ITAへ転送して動かすことができます。

上記コードを、Pythonで[UMEHOSHI ITA]基板で転送して実行する手順の紹介

予め、pythonが動作するターミナル(コマンドプロンプト)を、開いて準備して置くとよいでしょう。
以下では、R:\workを作業位置(カレントディレクトリ)にして説明しています。
また、pythonプログラムでは、serialモジュールを追加しておく必要があります。
「pip show serial」のコマンド操作で、インストールされているか確認できます。
インストールされていない場合は、「pip install pyserial」の操作で、インストールしておくと良いでしょう。

【1】 [UMEHOSHI ITA]基板で転送するテキストファイル「command.txt」を用意します。

上記の「アセンブラ編集部」の直下にある「アセンブル」ボタンをクリックします。
(このボタン右下の、指定アドレスから実行させるコード埋め込み用のチェックボックスがチェックされていること確認して行う)

「アセンブラ編集部」のソースにエラーが無ければ、[UME専用Hexコマンド]のテキストが、その下の TextArea に表示されます。
(エラーがあれば、エラーが無くHEXコードが生成されるまで、「アセンブラ編集部」の修正とアセンブル」を繰り返します)

メモ帳などで、「command.txt」のファイルを生成して開き、
上記操作で得られたTextAreaの[UME専用Hexコマンド]のテキストを、 コピー(CTRL+A CTRL+C)操作し、
  それを「command.txt」編集画面で貼り付け((CTRL+V)して、保存します。
保存位置は、pythonが動作するターミナルの作業位置(カレントディレクトリ)です。(後述例では、R:\workで示しています)

【2】 [UMEHOSHI ITA]基板へ[command.txt」を転送するpythonファイルを用意します。

「instruct.py」の名前のソースファイルを、[command.txt」と同じ位置に作ります。
(一度作れば、次回は使うだけで、作る必要はありません。(CTRL+A CTRL+C)操作で、コピー可能)


【3】 [UMEHOSHI ITA]基板へ[command.txt」を転送して実行させる。

上記で作った「instruct.py」と[command.txt」が存在する位置で、 pythonが動作するターミナル(コマンドプロンプト)を開きます。
以下では、この作業位置(カレントディレクトリ)が、R:\workである場合の例で説明しています。

まず [UMEHOSHI ITA]基板と、PCをUSBで接続します。

次にターミナルプロンプトを『powershell』にして、
『Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like "*(COM*"} | Select-Object Caption』
のコマンド操作で、USBのシリアル デバイスのCOM番号を調べます。

実行例
R:\work>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS R:\work> Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like "*(COM*"} | Select-Object Caption

Caption
-------
Bluetooth リンク経由の標準シリアル (COM10)
USB シリアル デバイス (COM4)
Bluetooth リンク経由の標準シリアル (COM11)
PS R:\work>

この実行例から、USB シリアル デバイス がCOM4が使える状態になっていることが分かります。
このリンクページで示すように、デバイスマネージャで確認することもできます)
この番号の4を記憶して次の転送プログラム実行に進むのですが、 そのUSB シリアル デバイス が見つからない場合、次の点が考えられます。

  • 正しく[UMEHOSHI ITA]基板がUSBで接続されていない。
  • USBのCDCドライバがWindowsで使える状態になっていない。
       (Microchip社 USB CDC用 Driverが自動的にインストールされるはずですが、それが働いていないなど )
  • [UMEHOSHI ITA]基板で、既にUSBを介さないプログラムが動いている。
      (この場合、電源を入れ直す(またはSW1とSW2を押して、SW1を離してから2秒以内でSW2を離す操作)初期化で、USB通信が可能となります)
いずれにしても、接続でUSB シリアル デバイスCOM番号が得られないと、次に進めません。

続いて、以下の『python command.txt』の操作で、転送実行プログラム(上記のアセンブラ用の例)を実行します。
実行例 (最初に上記で得られた番号の4をキー入力しています。)
R:\work>python instruct.py
USB シリアル デバイスで、使用するCOMの番号を入力>>4
S108000500000F8FFBD270400BEAF21F0A00300A0023C  3Eチェックサム: 0
USB受信● b'S108000500000F8FFBD270400BEAF21F0A00300A0023C3E\r\n'
USB受信● b'SET:80005000\r\n'
S108000501000C84042340080033C34506324000043AC  CBチェックサム: 0
USB受信● b'S108000501000C84042340080033C34506324000043ACCB\r\n'
USB受信● b'SET:80005010\r\n'
S10800050200021E8C0030400BE8F0800BD270800E003  87チェックサム: 0
USB受信● b'S10800050200021E8C0030400BE8F0800BD270800E00387\r\n'
USB受信● b'SET:80005020\r\n'
S10800050300000000000D8FFBD272400BFAF2000BEAF  40チェックサム: 0
USB受信● b'S10800050300000000000D8FFBD272400BFAF2000BEAF40\r\n'
USB受信● b'SET:80005030\r\n'
S10800050400021F0A0031000C0AF3614000800000000  DDチェックサム: 0
USB受信● b'S10800050400021F0A0031000C0AF3614000800000000DD\r\n'
USB受信● b'SET:80005040\r\n'
S10800050500000A0023C0C4242340000428C21200000  E5チェックサム: 0
USB受信● b'S10800050500000A0023C0C4242340000428C21200000E5\r\n'
USB受信● b'SET:80005050\r\n'
S108000506000010005240100062409F8400000000000  15チェックサム: 0
USB受信● b'S108000506000010005240100062409F840000000000015\r\n'
USB受信● b'SET:80005060\r\n'
S1080005070001400C2AF88BF023C2061428C80004230  8Cチェックサム: 0
USB受信● b'S1080005070001400C2AF88BF023C2061428C800042308C\r\n'
USB受信● b'SET:80005070\r\n'
S1080005080000100422CFF0042301800C2AF00A0023C  98チェックサム: 0
USB受信● b'S1080005080000100422CFF0042301800C2AF00A0023C98\r\n'
USB受信● b'SET:80005080\r\n'
S1080005090000C4242340000438C1800C28F07004010  C6チェックサム: 0
USB受信● b'S1080005090000C4242340000438C1800C28F07004010C6\r\n'
USB受信● b'SET:80005090\r\n'
S10800050A000000000001400C28F0400401000000000  0Dチェックサム: 0
USB受信● b'S10800050A000000000001400C28F04004010000000000D\r\n'
USB受信● b'SET:800050A0\r\n'
S10800050B00001000224301400080000000021100000  30チェックサム: 0
USB受信● b'S10800050B0000100022430140008000000002110000030\r\n'
USB受信● b'SET:800050B0\r\n'
S10800050C000020004240E0005242130400009F86000  E9チェックサム: 0
USB受信● b'S10800050C000020004240E0005242130400009F86000E9\r\n'
USB受信● b'SET:800050C0\r\n'
S10800050D000000000001000C2AF1000C28FDCFF4010  82チェックサム: 0
USB受信● b'S10800050D000000000001000C2AF1000C28FDCFF401082\r\n'
USB受信● b'SET:800050D0\r\n'
S10800050E0000000000021E8C0032400BF8F2000BE8F  81チェックサム: 0
USB受信● b'S10800050E0000000000021E8C0032400BF8F2000BE8F81\r\n'
USB受信● b'SET:800050E0\r\n'
S0C800050F0002800BD270800E00300000000  5Eチェックサム: 0
USB受信● b'S0C800050F0002800BD270800E003000000005E\r\n'
USB受信● b'SET:800050F0\r\n'
R008000500000  61チェックサム: 0
実行スタートの Enter >>
USB受信● b'R00800050000061\r\n'
USB受信● b'START:80005000\r\n'
終了確認の Enter >>>
R:\work>

[command.txt」の中に"R008000500000"のような実行コマンドが存在すると、実行スタートの Enter >>の プロンプトが出て、一時停止します。
上記例では、そこでENTERキーを入力することで、"R00800050000061"が送られ、UMEHOSHI ITA基板で「0x80005000」番地から実行しますが、
まだ実行しません。
実行するのは _HANDLES[_IDX_INIT_SUB_FUNC] = start_main相当の登録処理です。
この登録の実行の後で、リセットボタンを押すと、登録関数実行が始まります。