#include <xc.h>// cn6_mortor_rom.c #include "common.h" #define CN6B02 0x0004 //CN6のPORTBbits.RB2制御用bit #define CN6B03 0x0008 //CN6のPORTBbits.RB2制御用bit #define D1LED 0x8000 // RB7 #define D2LED 0x0020 // RB5 int cn6 = 0;// 0→1→2→0→1→2・・・ __attribute__((address( 0x80005000 ))) void set_boot(void); void set_boot(){// 一回だけ実行することで、ROM(0x9D03fff0)に登録 extern void start_boot(); // パワーオンの場合だけ、実行する関数start_bootの登録 _nvm_write_word(0x9D03fff0,(uint32_t)start_boot); } // ROM領領域置は、以下のように絶対アドレスを指定しなければならない。 __attribute__((address( 0x9D020300 ))) void start_boot(void); void start_boot(){// パワーONオンで実行する関数定義 cn6 = 0; PORTBCLR = CN6B02 | CN6B03 | D1LED | D2LED; } // ROM領領域で、パワーONを伴わないResetで起動する絶対番地( 0x9D020000 ) __attribute__((address( 0x9D020000 ))) void start_main (void); void start_main() { cn6++; if(cn6 == 1){ // 正転と、D1を0、D2を1 PORTBCLR = CN6B03 | D1LED; PORTBSET = CN6B02 | D2LED; } else if(cn6 == 2){ // 逆転と、D1を1、D2を0 PORTBCLR = CN6B02 | D2LED; PORTBSET = CN6B03 | D1LED; } else { cn6 = 0; PORTBCLR = CN6B02 | CN6B03 | D1LED | D2LED;// 全てOFF } } |
80005000 <set_boot>: 80005000: 27bdffe8 addiu sp,sp,-24 80005004: afbf0014 sw ra,20(sp) 80005008: afbe0010 sw s8,16(sp) 8000500c: 03a0f021 move s8,sp 80005010: 3c02a000 lui v0,0xa000 80005014: 344240f4 ori v0,v0,0x40f4 80005018: 8c420000 lw v0,0(v0) 8000501c: 3c039d02 lui v1,0x9d02 80005020: 24630300 addiu v1,v1,768 80005024: 3c049d03 lui a0,0x9d03 80005028: 3484fff0 ori a0,a0,0xfff0 8000502c: 00602821 move a1,v1 80005030: 0040f809 jalr v0 80005034: 00000000 nop 80005038: 03c0e821 move sp,s8 8000503c: 8fbf0014 lw ra,20(sp) 80005040: 8fbe0010 lw s8,16(sp) 80005044: 27bd0018 addiu sp,sp,24 80005048: 03e00008 jr ra 8000504c: 00000000 nop 80008000 <cn6>: 80008000: 00000000 nop 9d020000 <start_main>: 9d020000: 27bdfff8 addiu sp,sp,-8 9d020004: afbe0004 sw s8,4(sp) 9d020008: 03a0f021 move s8,sp 9d02000c: 3c028001 lui v0,0x8001 9d020010: 8c428000 lw v0,-32768(v0) 9d020014: 24430001 addiu v1,v0,1 9d020018: 3c028001 lui v0,0x8001 9d02001c: ac438000 sw v1,-32768(v0) 9d020020: 3c028001 lui v0,0x8001 9d020024: 8c438000 lw v1,-32768(v0) 9d020028: 24020001 li v0,1 9d02002c: 14620009 bne v1,v0,9d020054 <start_main+0x54> 9d020030: 00000000 nop 9d020034: 3c02bf88 lui v0,0xbf88 9d020038: 34038008 li v1,0x8008 9d02003c: ac436124 sw v1,24868(v0) 9d020040: 3c02bf88 lui v0,0xbf88 9d020044: 24030024 li v1,36 9d020048: ac436128 sw v1,24872(v0) 9d02004c: 0b408027 j 9d02009c <.L3> 9d020050: 00000000 nop 9d020054: 3c028001 lui v0,0x8001 9d020058: 8c438000 lw v1,-32768(v0) 9d02005c: 24020002 li v0,2 9d020060: 14620009 bne v1,v0,9d020088 <start_main+0x88> 9d020064: 00000000 nop 9d020068: 3c02bf88 lui v0,0xbf88 9d02006c: 24030024 li v1,36 9d020070: ac436124 sw v1,24868(v0) 9d020074: 3c02bf88 lui v0,0xbf88 9d020078: 34038008 li v1,0x8008 9d02007c: ac436128 sw v1,24872(v0) 9d020080: 0b408027 j 9d02009c <.L3> 9d020084: 00000000 nop 9d020088: 3c028001 lui v0,0x8001 9d02008c: ac408000 sw zero,-32768(v0) 9d020090: 3c02bf88 lui v0,0xbf88 9d020094: 3403802c li v1,0x802c 9d020098: ac436124 sw v1,24868(v0) 9d02009c <.L3>: 9d02009c: 03c0e821 move sp,s8 9d0200a0: 8fbe0004 lw s8,4(sp) 9d0200a4: 27bd0008 addiu sp,sp,8 9d0200a8: 03e00008 jr ra 9d0200ac: 00000000 nop 9d020300 <start_boot>: 9d020300: 27bdfff8 addiu sp,sp,-8 9d020304: afbe0004 sw s8,4(sp) 9d020308: 03a0f021 move s8,sp 9d02030c: 3c028001 lui v0,0x8001 9d020310: ac408000 sw zero,-32768(v0) 9d020314: 3c02bf88 lui v0,0xbf88 9d020318: 3403802c li v1,0x802c 9d02031c: ac436124 sw v1,24868(v0) 9d020320: 03c0e821 move sp,s8 9d020324: 8fbe0004 lw s8,4(sp) 9d020328: 27bd0008 addiu sp,sp,8 9d02032c: 03e00008 jr ra 9d020330: 00000000 nop |
以下に、上記の実際に動作した、アセンブリリストを示します。上のC言語の逆アセンブルリストをコードにしてみました。
予め、pythonが動作するターミナル(コマンドプロンプト)を、開いて準備して置くとよいでしょう。
以下では、R:\workを作業位置(カレントディレクトリ)にして説明しています。
また、pythonプログラムでは、pyserialモジュールを追加しておく必要があります。
「pip show serial」のコマンド操作で、インストールされているか確認できます。
インストールされていない場合は、「pip install pyserial」の操作で、インストールしておくと良いでしょう。
上記の「アセンブラ編集部」の直下にある「アセンブル」ボタンをクリックします。
(このボタン右下の、指定アドレスから実行させるコード埋め込み用のチェックボックスがチェックされていること確認して行う)
「アセンブラ編集部」のソースにエラーが無ければ、[UME専用Hexコマンド]のテキストが、その下の TextArea に表示されます。
(エラーがあれば、エラーが無くHEXコードが生成されるまで、「アセンブラ編集部」の修正とアセンブル」を繰り返します)
メモ帳などで、「command.txt」のファイルを生成して開き、
上記操作で得られたTextAreaの[UME専用Hexコマンド]のテキストを、 コピー(CTRL+A CTRL+C)操作し、
それを「command.txt」編集画面で貼り付け((CTRL+V)して、保存します。
保存位置は、pythonが動作するターミナルの作業位置(カレントディレクトリ)です。(後述例では、R:\workで示しています)
上記で作った「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 シリアル デバイス が見つからない場合、次の点が考えられます。
R:\work>python instruct.py USB シリアル デバイスで、使用するCOMの番号を入力>>4 S04800080000000000000 D9チェックサム: 0 USB受信● b'S04800080000000000000D9\r\n' USB受信● b'SET:80008000\r\n' S108000500000E8FFBD271400BFAF1000BEAF21F0A003 17チェックサム: 0 USB受信● b'S108000500000E8FFBD271400BFAF1000BEAF21F0A00317\r\n' USB受信● b'SET:80005000\r\n' S10800050100000A0023CF44042340000428C029D033C B1チェックサム: 0 USB受信● b'S10800050100000A0023CF44042340000428C029D033CB1\r\n' USB受信● b'SET:80005010\r\n' S10800050200000036324039D043CF0FF843421286000 A9チェックサム: 0 USB受信● b'S10800050200000036324039D043CF0FF843421286000A9\r\n' USB受信● b'SET:80005020\r\n' S10800050300009F840000000000021E8C0031400BF8F B0チェックサム: 0 USB受信● b'S10800050300009F840000000000021E8C0031400BF8FB0\r\n' USB受信● b'SET:80005030\r\n' S1080005040001000BE8F1800BD270800E00300000000 BDチェックサム: 0 USB受信● b'S1080005040001000BE8F1800BD270800E00300000000BD\r\n' USB受信● b'SET:80005040\r\n' S109D02000000F8FFBD270400BEAF21F0A0030180023C 34チェックサム: 0 USB受信● b'S109D02000000F8FFBD270400BEAF21F0A0030180023C34\r\n' USB受信● b'SET:9D020000\r\n' S109D020010000080428C010043240180023C008043AC C1チェックサム: 0 USB受信● b'S109D020010000080428C010043240180023C008043ACC1\r\n' USB受信● b'SET:9D020010\r\n' S109D0200200001000224090062140000000088BF023C DCチェックサム: 0 USB受信● b'S109D0200200001000224090062140000000088BF023CDC\r\n' USB受信● b'SET:9D020020\r\n' S109D0200300008800324246143AC88BF023C24000324 9Aチェックサム: 0 USB受信● b'S109D0200300008800324246143AC88BF023C240003249A\r\n' USB受信● b'SET:9D020030\r\n' S109D02004000286143AC2580400B000000000180023C C7チェックサム: 0 USB受信● b'S109D02004000286143AC2580400B000000000180023CC7\r\n' USB受信● b'SET:9D020040\r\n' S109D020050000080438C020002240900621400000000 FEチェックサム: 0 USB受信● b'S109D020050000080438C020002240900621400000000FE\r\n' USB受信● b'SET:9D020050\r\n' S109D0200600088BF023C24000324246143AC88BF023C 60チェックサム: 0 USB受信● b'S109D0200600088BF023C24000324246143AC88BF023C60\r\n' USB受信● b'SET:9D020060\r\n' S109D0200700008800324286143AC2580400B00000000 CCチェックサム: 0 USB受信● b'S109D0200700008800324286143AC2580400B00000000CC\r\n' USB受信● b'SET:9D020070\r\n' S109D020080000180023C008040AC88BF023C2C800324 7Eチェックサム: 0 USB受信● b'S109D020080000180023C008040AC88BF023C2C8003247E\r\n' USB受信● b'SET:9D020080\r\n' S109D02009000246143AC21E8C0030400BE8F0800BD27 56チェックサム: 0 USB受信● b'S109D02009000246143AC21E8C0030400BE8F0800BD2756\r\n' USB受信● b'SET:9D020090\r\n' S089D0200A0000800E00300000000 15チェックサム: 0 USB受信● b'S089D0200A0000800E0030000000015\r\n' USB受信● b'SET:9D0200A0\r\n' S109D02030000F8FFBD270400BEAF21F0A0030180023C 31チェックサム: 0 USB受信● b'S109D02030000F8FFBD270400BEAF21F0A0030180023C31\r\n' USB受信● b'SET:9D020300\r\n' S109D02031000008040AC88BF023C2C800324246143AC 6Bチェックサム: 0 USB受信● b'S109D02031000008040AC88BF023C2C800324246143AC6B\r\n' USB受信● b'SET:9D020310\r\n' S109D0203200021E8C0030400BE8F0800BD270800E003 72チェックサム: 0 USB受信● b'S109D0203200021E8C0030400BE8F0800BD270800E00372\r\n' USB受信● b'SET:9D020320\r\n' S049D0203300000000000 C4チェックサム: 0 USB受信● b'S049D0203300000000000C4\r\n' USB受信● b'SET:9D020330\r\n' R008000500000 61チェックサム: 0 実行スタートの Enter >> USB受信● b'R00800050000061\r\n' USB受信● b'START:80005000\r\n' 終了確認の Enter >>> R:\work>
[command.txt」の中に"R008000500000"のような実行コマンドが存在すると、実行スタートの Enter >>の
プロンプトが出て、一時停止します。
これで0x80005000からのRAM領域と、0x9D020000からと0x9D020300からのEEPROM領域にプログラムが配置されます。
そこでENTERキーを入力することで、"R00800050000061"が送られ、UMEHOSHI ITA基板で「0x80005000」番地から実行しますが、
それは、0x9D03fff0のEEPROM領域にパワーオンで実行するための0x9D020300から始まるstart_boot関数を登録するだけです。
ここで、USBのケーブル一度抜いて、改めて差し込んで電源を供給します。(パワーオン時だけ実行するstart_boot関数が実行)
そして赤のリセットスイッチを押すと、CN6コネクタに正転の電圧が印加されてモータを動かして、LEDのD2を点灯させます。
再び、赤のリセットスイッチを押すと、モータが逆転して、LEDのD2は消灯します。
再び、赤のリセットスイッチを押すと、モータが停止します。
再び、赤のリセットスイッチを押すと、モータの正転とLEDのLEDのD2の点灯に戻ります。
(リセットスイッチでstart_main()関数が実行され、cn6の変数が、0→1→2→0→1→2・・・と変化して対応のモータ制御が行わます。)
なお、EEPROMの消去は、こちらで示す方法で消去できます。