| PIC-BAISCでは、割り込みや、タイマーが使えませんが、こちらはそんなことありません。 ちゃんと使えます。 また、インラインアセンブルが出来てしまいます。変数渡しもできます。 なんでほったらかしにしていたんだろう!! 3048版として販売されていますが、ランタイムルーチンにパッチをあてれば、3052でも動作しました。 パッチのあてかたのヒントはちゃんと同梱の説明書にも書いてありますが、詳しく書かれたHPがありますので 探してみてください。ファイル名はRuntime.RTLです。ここをちょこっと! |
|
| 1.まずは、何か作らなきゃ始まりません。 簡単なロジックアナライザもどきのデータロガーでも作りましょう。 8chで128byteのデータを一定時間のサンプリングで取り込み、Excelで読んでグラフ表示しましょう。 てなわけで、ロジックアナライザのような表示をしてくれるグラフって無いことに気づき、はた? じゃあ、手書きで良くかとの結果。試行錯誤でまずは、 こんなんでどうでしょう、飾り一切無しプレーンな表示がすてき! Dim Span As Integer Dim SZ As Integer Function DrawOneChanel(Chanel_No) ' Chanel_Noで指定された1チャネル分のデータを表示 ' 表示データは、Buffer シートを直接参照する。 ' チャネルにより表示位置が縦方向に移動する。 ' Span:横方向の表示単位 SZ:縦方向の表示単位 On Error Resume Next Dim c As Range, myRange As Range, i As Long Dim gridNo As Long, grpHeight As Long, grpHeight2 As Long, cntr As Long Dim CHB(10) As Integer Set myRange = Selection ActiveSheet.Shapes("myGraph").Active iLastRow = Sheets("Buffer").Range("A65536").End(xlUp).Row myRange.Select For i = 2 To iLastRow ' 必要ならば縦線を描画 Bit = Sheets("Buffer").Cells(i, Chanel_No + 1) If CHB(Chanel_No) <> Bit Then x1 = Span * i x2 = Span * i y1 = Chanel_No * SZ y2 = Chanel_No * SZ + SZ / 2 With Sheets("Display").Shapes.AddLine(x1, y1, x2, y2).Line .ForeColor.SchemeColor = 50 End With End If ' Bitデータにより位置を変えて横線を描画 If Bit = 1 Then x1 = Span * i x2 = Span * (i + 1) y1 = Chanel_No * SZ y2 = Chanel_No * SZ Else x1 = Span * i x2 = Span * (i + 1) y1 = Chanel_No * SZ + SZ / 2 y2 = Chanel_No * SZ + SZ / 2 End If CHB(Chanel_No) = Bit With Sheets("Display").Shapes.AddLine(x1, y1, x2, y2).Line .ForeColor.SchemeColor = 50 End With Next End Function Function DrawForm() ' それらしいフォーマットを描画する ' まだ出来てません。 x1 = Span x2 = Span * 256 y1 = SZ y2 = SZ * 10 With Sheets("Display").Shapes.AddShape(x1, y1, x2, y2).Line .ForeColor.SchemeColor = 23 End With End Function Function Display_Data() ' グラフの大きさ Span = 3 SZ = 20 ' 一気に8ch分書き込みます。 ' データ数は、さしあたりシートにあるだけです。 For i = 1 To 8 ret = DrawOneChanel(i) Next End Function Public Function bit_check(a As Integer, b As Integer) ' 論理演算各ビットのOn、Offをチェックして値を返す bit_and = a And b If bit_and > 0 Then bit_check = 1 Else bit_check = 0 End If End Function Sub BitDeployment() ' 受け取ったバイトデータをビットに展開する。 ' 最終行の探索 iLastRow = Sheets("Buffer").Range("A65536").End(xlUp).Row For i = 2 To iLastRow For j = 0 To 7 Sheets("Buffer").Cells(i, j + 2) = bit_check(Sheets("Buffer").Cells(i, 1), 2 ^ j) Next Next Ret = Display_Data() End Sub |
|
![]() |
なにげに、ちゃんとロジアナ風になってます。 Excelに直にラインを書こうなんざ夢にも思いませんでした。 ダサいけど、必要最低限の表示が出来ますね。 あとは、データのサンプリングと転送です。 |
![]() |
久々の登場です。メモリは積んでありますが配線はしていません。ほぼ、素のH8マザーボードです。 ポート2を8ch入力として使いましょう。 内部でプルアップできるから、なにもいらずに、テスター棒(?引っ掛けるやつがかっこいい)だけでできます。 |
| :!INIT ' シリアルコミニュケーションインターフェース・チャンネル1の設定 ' 9600ボー、8ビット、1ストップビット、パリティなし SERIALSET 1, 9600, 8, 1, 0 console 1,0 dim r(129) poke &Hfffc1,&h00 'port2 リード poke &Hfffd8,&hff 'port2 プルアップ poke &Hfffc5,&h00 'port4 リード poke &hfffda,&hff 'port4 プルアップ print "PORT I/O TEST" :!main gosub !key_in for i=1 to 128 r(i)=peek(&hfffc3) console 1,1 print i next i console 1,1 wait 1000 print "END" END :!key_in key=peek(&HFFFC7) and &hf0 'Port4 タクトSWチェック if key=&hf0 then goto !key_in return |
さしあたり、インターバルなしで、128バイトのデータをポート2から読んでみましょう。 スタートするのにポート4のタクトスイッチを使ってみます。ポート4の上位4ビットは(&hf0)の部分はキーが押されたらそのビットが0になるので、何も押されてなければ、&hf0のままでループします。ちゃんとどのビットが何とプログラミングすべきですね! |
![]() |
開発ツールでコーディングし、コンパイルできます。 出来上がったMOTファイルを書き込むだけです。 H8WriterTerboにMOTファイルをドラッグアンドドロップで転送が始まります。 H8のマザーは書き込みモードにしてください。CPUのジャンパピンはなにも無い状態でOKです。 |
| あしたにつづく(2007/1/27) | |
| 昨日のあしたである、28日朝です。 さて、今日はH8とExcelの通信を目標とします。(実際やりながら書いているので目標達成は?) まず、オウム返しの通信でハイパーターミナルとつなぎましょう。 本当にH8が受け取っているのを確認するため、LCDにも表示しときましょう。 :!INIT ' シリアルコミニュケーションインターフェース・チャンネル1の設定 ' 9600ボー、8ビット、1ストップビット、パリティなし SERIALSET 1, 9600, 8, 1, 0 console 1,0 print "Serial I/O TEST" :!main gosub !lineinput goto !main REM シリアルインターフェースから一行文字列を入力するサブルーチン :!LINEINPUT Buf$="" :!LOOP_LINEINPUT IN$=INPUT$(#-1, 1) Print #-1,IN$ Buf$=Buf$+IN$ if IN$<>chr$(13) then goto !loop_lineinput print #-1,chr$(10) print left$(Buf$,len(Buf$)-1) return |
最後から2行目が不本意ですが、CRコードがLCDに黒塗りつぶしで表示されてしまうので、最後の1文字を削って表示します。かなりつじつまあわせですが、なんせ動けばラッキーで先に進まなきゃ。 またもや、コンパイルして、H8WriterTerboにドロップします。 書き込むときは、H8の電源を一回切って、Writeモードのスイッチを入れて電源オンにします。でないと以前のプログラムが動いて書き込めません。ライターでCPUを検出中ですとでたらまず怪しいです。ちゃんとスイッチを入れなおしましょう。(何度もやっちゃった) |
![]() |
起動時にエラーが出ても気にせず強気でGO! ファイルー>プロパティでボーレートだけあわせましょう。フロー制御は本当はなしだと思いますが、面倒なのでこれでよし。 |
![]() |
どうでしょう?LCDにも表示が出ています。 もう一歩で最低機能のロジアナができそうです。 すごい、簡単すぎる。 |
| では、先ほどのロジアナもどきとこの通信をドッキングしましょう。ロジアナをベースにこちらを貼り付けるとしましょう。ありゃ、HPからコーピーすると<BR>がついちゃいますね。めんどうなので 手で追加します。 |
|
![]() |
ふむふむ。 ここでハイパーターミナルって最初にEnterキーを押さないと通信開始になりませんから。Enterキーを押して画面右下の接続の時間がカウントされたら、H8のタクトSWを押しましょう。動いてる最中に無理やりディップスイッチを切り替えるとデータが変化します。(当たり前) じゃあ、あとはExcelで受信できれば良いじゃん。 |
| そろそろお昼なので(たったこれだけで午前中つぶしたか、まあ活字の裏には苦労があるこれらが こんなにスパスパ動けばそいつはきっと変人です)中断して、秋葉に行きます。 土日はいづれか秋葉に行ってます。ジャンク屋まわりはストレス解消ですね。 (あら、もしかして自分が変人か?いやいや...普通の人) この段階で、通信のデリミタ(区切り文字:ここではCRLF:キャリッジリターンとラインフィード)に一癖ありそう。でもCRLFをこのように発音するのもおっさんの証拠ですね。タイプライタ出力の名残です。改行(左隅に戻る)と行送り(1行分紙を送る) まじこのアナライザを完成させるべく、ケースに入れて... 形から入らないといまいち乗れないタイプなので。大好きなタカチのYM-150が手元にある(?YM-100,YM-180も開封せずにあったりする)のでそっとしのばせてみましょう。YM-100にも入りそうですが、下のオシロみたいにパンパンで手を入れられなくなります。 |
|
![]() |
きびしいー。 これは、H8ライターさんのフルコピーで、S/wはブラックボックスです。 ちょっと余裕のあるケースにして。そうそうLCDつけなやいけないですから。電池も内臓します。 |
![]() |
こんな感じですかね。四角いのはプッシュS/Wです。丸は電源S/W、リアパネルのWriteは、このままプログラム変更が出来るようにしたいのでちょっと電源周りと書き込み回路が要りますね。 ちゃんと部品メモって行きます。 それと、抵抗収集癖でまだ持っていないあたりを100本100円で5つくらい買ってきます。けっこーたまってます。 パーツ屋さんになりそう。 |
| :!INIT ' 超簡易ロジックアナライザーもどき ' サンプリング間隔は、BASICのフルスピード!? SERIALSET 1, 9600, 8, 1, 0 dim r(129) 'データ格納領域 変数の無駄遣いです。 poke &Hfffc1,&h00 'port2 リード poke &Hfffd8,&hff 'port2 プルアップ poke &Hfffc5,&h00 'port4 リード poke &hfffda,&hff 'port4 プルアップ console 1,0 print "LogicAnalyzer" print "Push to Start" :!main gosub !key_in console 1,1 print "Data Reading" for i=1 to 128 r(i)=peek(&hfffc3) 'read Port2 next i console 1,1 print "Rady to Send" Wait 1000 gosub !key_in console 1,1 print "Data Sending" for i=1 to 128 b$=right$("000"+str$(r(i)),3) ret$=input$(#-1,1) 'Excel側と同期をとる print #-1,r(i) 'Send to Excel print "Data Count:";i next console 1,1 print "Terminated" END :!key_in key=peek(&HFFFC7) and &hf0 'Port4 タクトSWチェック if key=&hf0 then goto !key_in return |
秋葉から帰ってきました。h8/3052も買っちゃいました。それはさておき、Excelとの通信です。 うまく同期を取って通信するため苦肉の策ですが、固定長としています。どなたかアドバイスください。 最初にフルスピードでデータをサンプリングします。その後ゆっくりデータ転送です。Read to Sendと表示されたら。もう一回タクトSWを押して、Excel側のマクロを動かします。 |
| まずは、基本となるAPIの宣言と、オープンや送信、受信の関数を設定します。ここにあります。これをモジュール1に貼り付けておきます。これは、今後も使いますので、とっておいてください。この中の関数を呼び出して通信します。 それがこれです。 Dim hComm As Long Sub start() Dim i As Integer Dim l As Integer Dim a As Long hComm = CommOpen("COM1", 9600) If hComm < 0 Then MsgBox "COM1" & "が使用できません." End End If For i = 2 To 129 SendDataComm hComm, "S" Cells(i, 1).Value = ReceiveDataComm(hComm, 6) ' データを読み込む Next CommClose (hComm) End Sub |
今度はExcel側です。モジュール1には左記のモジュールを入れ込んでおいてください。コピー&ペーストでOKです。 |
![]() |
早速やってみましょう。 うまく受信してますね。もう一息です。今度はロジアナ画面とのドッキングです。 |
| 今日はここまで | |
| しばらく日にちが空いてしまいました。 じつは、データを読み込んでExcelに取り込み、表示をしていたのですが、一向に変化のない直線です。 理論的に何か不都合があるか試行錯誤してました。 測定対象がPIC-BASICとDDSコントロール部分のクロック、データストローブなのですが、おかしい? データが拾えないのです。ふと、PIC-BASICからDDSへの送信は32ビット送信ですが、1秒ウエイトして 繰り返しています。こては、すごく好都合にタイミングが合わなければデータは取れそうにありません。 で、トリガをかけてみましたがどうもうまくいかず、PIC-BASICをウエイトなしの連続送信にして、256バイト 読み込みに変更したら、以下の画面が表示されました。 ![]() |
うまくタイミングが取れていないのでしょう。どれがクロック? でも、まあ自分なりの理論は大きく間違っていないようです。 実用化に向けては、インラインアセンブラでデータを取り込み、サンプリング時間をマイクロ秒で4kByteくらい取れば、うまくいきそうです。 ここでは、H8/3052にお出ましいかがないと、3048ではRAMが4Kですから無理というもの。次回までにはインラインアセンブラと3052の環境を構築するということで、このPJはいったん完了とします。めでたしめでたし。 |
| では次のステップですが、3052とDDSをケースに入れLCDもつけ前述のようなマルチ測定器へ 行こうと思っています。 今週末は、大好きな板金加工です。タカチのYM-150に収めると、作成済のアンプの利得、残留ハム測定器と ぴったりマッチします。 もうひとつハードルがあります。音声信号の電圧測定です。デジタルテスターではACモードでちゃんと測定できているので 何らかの解決策があるはずです。 まずは整流+コンデンサで平滑して測定してみます。低周波では、測定タイミングで波形のいろんな部分を測定してしまいそうです。これらの実験は、アナログ発信機とブレッドボードとオシロでできそうです。今週末は、ケースとこの実験で決まりです。それと日曜日の秋葉詣でもかかせません。 |
|
| ちょっと(いやかなり?)進展しました。CPUはH8/3052です。ケースに組み込み信号レベル測定のための整流回路も追加しました。あとはソフトだけです。 今回も、板金配線から一発書き込みOK、動作OK。最高にすっきりしますね! |
|
| はじめに |
| 以前買ったBasicコンパイラをインストールもせずほったらかしていました。 先日PIC-BAISCをちょっと動かし、その後このコンパイラに気づき、インストールしてみました。 自分の備忘録としてちょくちょく内容を追加していきます。 |
| H8/3048F用BASICコンパイラ たぶん¥2,000.− |
| H8 Basicコンパイラ(秋月) |