フォト
無料ブログはココログ

« 深く考える力 <「賢明なもう一人の自分」は暗黙知のことか?> | トップページ | 奇跡のレッスン <日本の教育への強烈な批判かも> »

2018年9月21日 (金)

Bus pirate(4) <スクリプトを動かしてみる>

相も変わらず Bus Pirateで遊んでいる。

 BusPirateには組み込みscript(BASICのサブセット)がある。
terminalインタフェースではデバイスからのレスポンスを待つのは難しいが、scriptを使うとできるようになる。

 以前に買ったLED&KEYを制御してみた。

 このモジュールのLEDコントローラにはTM1638が使われている。インタフェースは、クロック(CLK)に同期したシリアル通信で、データ(DIO)は双方向だ。デバイの選択はSTBをLにする。

 英語版のデータシートは(https://www.mikrocontroller.net/attachment/332035/TM1638_V1.3_EN.pdf)にある。

 BusPirateの raw 2-wireで制御してみる。

 接続はこんな感じ↓

BusPirate
LED&KEYMOSI---DIOCLK---CLKAUX---STB5V-+-VCCVPU-+ 
GND---GND

 ビットオーダーには注意が必要だ。SPIやI2CはMSBから送るMSB-firstだがTM1368はLSBから送るLSB-firstだから、"L"コマンドでビットオーダーを切り替えなくてはならない。

 ↓実行結果

HiZ>m 6 1 1 ← raw 2-wire R2W (spd hiz)=( 0 1 )
Ready
2WIRE>WPLc ← PowerON,PullUP,LSBfirst,ctrlAUX Power supplies ON
Pull-up resistors ON
LSB set: LEAST sig bit first ← "L"command a/A/@ controls AUX pin ← "c"command 2WIRE>v
Pinstates:
1.(BR)  2.(RD)  3.(OR)  4.(YW)  5.(GN)  6.(BL)  7.(PU)  8.(GR)  9.(WT)  0.(Blk)
GND     3.3V    5.0V    ADC     VPU     AUX     SCL     SDA     -       -
P       P       P       I       I       I       O       I       I       I
GND     3.29V   5.02V   0.00V   5.02V   H       L       H       H       H
2WIRE>a 0x40 A ← DataCommand: WriteRegister,AutoIncremet AUX LOW
WRITE: 0x40
AUX HIGH
2WIRE>a 0xC0 ← AUX←L、AddressCommand: 00h AUX LOW
WRITE: 0xC0
2WIRE>  0x76,0x00, 0x79,0x00, 0x38,0x00, 0x38,0x00 ← "HELL" WRITE: 0x76
WRITE: 0x00
WRITE: 0x79
WRITE: 0x00
WRITE: 0x38
WRITE: 0x00
WRITE: 0x38
WRITE: 0x00
2WIRE>  0x3F,0x00, 0x40,0x01, 0x40,0x01, 0x40,0x01 ← "O---"
WRITE: 0x3F
WRITE: 0x00
WRITE: 0x40
WRITE: 0x01
WRITE: 0x40
WRITE: 0x01
WRITE: 0x40
WRITE: 0x01
2WIRE>A ← AUX←H AUX HIGH
2WIRE>a 0x8A A ← DisplayControl: DispON AUX LOW
WRITE: 0x8A
AUX HIGH
2WIRE>

BP-HELLO

 表示を動かそうとするとコマンドを何回も入力しなければならないので、scriptで動かしてみる。

 BusPireteのscriptはBASICのサブセットなので制限がある。

  • 数値は10進数だけ。16進数は使えない
     "="コマンドで10進、16進、2進の変換ができるので、10進数にする。
  • 変数への代入はLETを使う
     ×A=10、〇LET A=10
  • "DATA"、"READ"コマンドはあるけど"RESTOR"コマンドが無い
  • AUXピンが制御できない
     "AUXPIN 0"でAUXピンが制御できるはずだが、CSしか制御できない(BUG?)
  • "SEND"コマンドのビットオーダーは常にMSB-First
     ターミナルコマンド"L"を引き継がない。

 AUXピンが制御できないのは致命的だ。 仕方がないので、ターミナルコマンドでDataCommand(40h)、DispContorl(88h)を送っておいて、表示データをscriptで送ってみる。

 ↓ターミナルで送るコマンド

m 6 1 1 ← raw 2-wire
WPLc ← PowerON,PullUP,LSBfirst,ctrlAUX
a 0x40 A ← DataCommand: WriteRegister,AutoIncremet
a 0xC0 ← AUX←L、 AddressCommand: 00h

 scriptを例えば"hello.bas"というファイル名で保存しておいて、ターミナル・ソフトのファイル送信機能でBusPirateに送ると簡単。 BusPirateが処理する時間を確保するために行当たり500msの時間待ちしている。

 scriptはこんな感じ↓

hello.bas
10 FOR I=1 TO 100
20   GOSUB 1000
30   DELAY 100
40 NEXT I
50 END
999  REM Disp HELLO
1000 IF I<50 THEN SEND 0
1010 IF I<50 THEN SEND 128   
1020 SEND 110
1030 SEND 0
1040 SEND 158
1050 SEND 0
1060 SEND 28
1070 SEND 0
1080 SEND 28
1090 SEND 0
1100 SEND 252
1110 SEND 0
1120 SEND 0
1130 SEND 128
1140 SEND 0
1150 SEND 128
1160 IF I<50 THEN SEND 0
1170 IF I<50 THEN SEND 128
1180 RETURN

↑SENDコマンドで送る数値はビットオーダーを変えてある。 例えば1020行の SEND 110は、表示したいパターンは01110110(76h)なので、01110110b→01101110b→6Eh→110を送る。

 scriptでLSBから1bitづつ送るようにすれば、いちいち変えなくてよいのだがどちらも面倒。

↓動いているところ。

Bphello_1

ダウンロード BP-HELLO.mp4 (1110.6K)

↑途中でメッセージが移動する方向が変わる。

 待てよ、AUXではなくCSを使えばいいじゃないかと気が付いた。

###

この記事に書いた制限(BUG?)は↓のFirmware固有のものかもしれない。

HiZ>i
Bus Pirate v3b
Firmware v5.10 (r559)  Bootloader v4.4
DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
http://dangerousprototypes.com
CFG1:0xF9DF CFG2:0x3F7F

最新のFirmwareにアップデートしてみるか



最近の投稿】【最近のCPUボード】【2017の投稿】【2016の投稿】【2015の投稿

« 深く考える力 <「賢明なもう一人の自分」は暗黙知のことか?> | トップページ | 奇跡のレッスン <日本の教育への強烈な批判かも> »

CPUボード」カテゴリの記事

プログラミング」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Bus pirate(4) <スクリプトを動かしてみる>:

« 深く考える力 <「賢明なもう一人の自分」は暗黙知のことか?> | トップページ | 奇跡のレッスン <日本の教育への強烈な批判かも> »

2019年8月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

最近のトラックバック