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コンパイラ(秋月)