<紙>さんLOG

「パソコンヲタクの雑記帳」
 PC/Linux系/物理・化学で遊んでいます。
思いついたことを綴っています。

78K0マイコン:ブートローダ

2008年08月06日 | PIC・マイコン
昨日までの累計アクセス数=5,907。 ご訪問頂き、ありがとうございます。         日記@BlogRanking

78K0マイコンとは、トランジスタ技術8月号(まだ、最新号? 10日発売)の付録として付いている基板で、
PCから見れば、PIC(6) USB・Genで列挙した内の、CDCデバイスにあたります。
付録のままでも、PCにUSB(延長)ケーブルで繋いで使えます。

ちょっとしたプログラムを作れば、USB-IOもどきにすることができますね。

発売翌日の、JA1OHP さんのブログ小さなマイコンが雑誌の付録に付いてた ~ 動きました ~に刺激されて、
2週間遅れで買っていました。

活用例は、JJ1WKN さんのブログトラ技 付録 NEC 78K0 マイコン その1(続きあり)に詳しく載っています。

<紙>も、ツール(アセンブラ、Cコンパイラ、+α)をインストールして、
(最初に作ってみる)1秒毎のLED 点滅プログラムを CC78K0 コンパイラで作ってみました。

時間待ちとして、インラインアセンブラを使って NOP命令を入れてみたが、
リンカで .rel ファイルが無いとか出て悩みました。
結局、空の while ループで約1.4マイクロ秒が作れたので、それで誤魔化しています。

そして、トラ技BIOS対応のブートローダを作りました。(Active BASICで。)
プログラム名は、AB_78K0.abp です。(下記)

使い方は、CC78K0 でビルドした結果を a,hex とし、AB_78K0.exe と同じところに置く。
78K0 ボードを繋いでから、AB_78K0.exe を実行すると、a.hex が書き込まれて実行される。
というものです。
78K0 ボードは、COM8 と決めうちしています。(パラメータ化は可能ですね。)
a.hex の実行でUSB 通信する場合は、追加のコーディングをします。

AB_78K0.abp でのシリアルIO処理は、PC:PIC 接続[シリアル編]で作ったものを改造しました。


' ------------------------- AB_78K0.abp
#include "RS232Cdecl.sbp" ' RS232Ctest.sbp を含む
#prompt ' 無くてもいい
'
Dim hComm As HANDLE, a$ As String
Dim buf[255] As Byte, k As Long, v As Long
'
a$=GetOneselfFileNameStr() : a$=Left$(a$,Len(a$)-11)
ChDir(a$) ' 自分自身("AB_78K0.exe")のディレクトリへ
'
hComm=CommOpen("COM8",115200,8,0,1) ' オープンCOMポート=コネクト78K0
'
' ------------- トラ技BIOS 開始
buf[0]=13 : buf[1]=0 : WriteFile(hComm, buf, 1, VarPtr(k), ByVal 0)
Sleep(15) : ReadFile(hComm, buf, 255, VarPtr(k), ByVal 0)
'
' ------------- load   a.hex
buf[0]=&H6C : buf[1]=&H6F : buf[2]=&H61 : buf[3]=&H64 : buf[4]=13 : buf[5]=0
WriteFile(hComm, buf, 5, VarPtr(k), ByVal 0)
Sleep(15) : ReadFile(hComm, buf, 255, VarPtr(k), ByVal 0)
Open "a.hex" For Input As #1
While Not(Eof(1))
Input #1,a$
v=len(a$) : memcpy(buf,StrPtr(a$),v)
buf[v]=13 : v++ : buf[v]=0
WriteFile(hComm, buf, v, VarPtr(k), ByVal 0)
Wend
Close #1
Sleep(15) : ReadFile(hComm, buf, 255, VarPtr(k), ByVal 0)
'
' ------------- jmp f000
buf[0]=&H6A : buf[1]=&H6D : buf[2]=&H70 : buf[3]=32
buf[4]=&H66 : buf[5]=48 :buf[6]=48 : buf[7]=48 : buf[8]=13 : buf[9]=0
WriteFile(hComm, buf, 9, VarPtr(k), ByVal 0)
Sleep(15) : ReadFile(hComm, buf, 255, VarPtr(k), ByVal 0)
'
' ======= 78K0 とのIO処理は、ここに追加する ========
'
*fin:
CloseHandle(hComm) ' クローズCOMポート
End
'
' ----------------------------------------
Function GetOneselfFileNameStr() As String
Dim buf[255] As Byte, length As Long
length=GetModuleFileName(NULL,buf,MAX_PATH)
GetOneselfFileNameStr=ZeroString(length)
memcpy(StrPtr(GetOneselfFileNameStr),buf,length)
End Function
' ================================= End Prog. ==============
ReadFile はすべてダミー(バッファ・クリアの為)です。

お手数をおかけしますが、2クリック(投票を)して頂けるとうれしいです。 ⇒ 日記@BlogRanking
お引き立て頂き、「60代~日記@BlogRanking」で上位になれています。ありがとう御座います。

最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
なにかいているんだかわかんね・・・ (Holy night)
2008-08-07 01:18:30
それより、近くに美味しいラーメン屋さんありませんか?
返信する
Holy night さんへ (<紙>)
2008-08-07 18:51:08
わかって下さい。
こんな田舎には見あたらないね。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。