2026.9.27
前へ
次へ
ホームページトップへ戻る


[新連載開始]W65C02マイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第82回]



●USBによるデータの送受信(4)DMAON,DMAOFF,MWRITE,MREAD(2)

前回のテストではPIC18F45K50から1バイトのデータを送りW65C02はそのデータを読んでその値を+1してPIC18F65K50に返すという一連の動作を一回だけ実行して終りました。
その動作はPIC18F45K50もW65C02も実際はメモリに対してWRITE、READを行なっているのですが実質的にPIC18F45K50からW65C02にデータを送りそしてW65C02からPIC18F45K50にその返答としてのデータを返すという動作と同じことをしていると言えますから上記のように表現しました。
それで前回はそのように一回のデータの送信、受信をして終ったのですがW65C02の側のプログラムはエンドレスになっています([第80回]参照)。
今回はPIC18F45K50の側のBASICプログラムもエンドレスにして連続して繰り返し実行するようにしてみました。
下がPIC18F45K50の側のBASICプログラムです。


W65C02の側のプログラム(前回と同じ65C02TEST52.BIN)は先に/LDコマンドでロード済みです。
PIC18F45K50側のBASICプログラムは/SAVEコマンドでセーブしました。
うっかりして拡張子なしでセーブしてしまいました(RWTEST2F)。
/SAVEコマンドは拡張子なしの場合でもTXTファイルとして保存するので支障はないのですがあとで直しておくようにします。
なお/SVコマンドはバイナリファイルとして保存します。
/RUNコマンドでW65C02側のプログラムの実行を開始し次にRUNコマンドでPIC18F45K50側のBASICプログラムの実行を開始しました。

BASIC側が$12を入力してそれを送ることで開始されます。
次にW65C02側の値を読むのですがこの時点ではW65C02からのデーテタはありません(その理由は後で説明します)。
画面はBASICプログラムがメインプログラムとして実行されているのでW65C02側のプログラムは「相手」の動作なので見えません。
データの応答によってW65C02が反応していることを知ることができます。
BASICプログラムは再び送信データの入力に戻ります。
$34を入力して送ると今度はW65C02からのデータが受信されます。
受信したデータは13です。
これは先に送った$12に対する応答のようです。
次の入力データ$56を送ると35が返ってきました。
次に$78を送ると57が返ってきました。
送信と受信のタイミングが1サイクルずれています。
その理由はBASICプログラムにあります。
最初にDMAONしてMWRITEを実行したあとそのままMREADを実行しているのでその間はDMA状態になっていてW65C02は停止状態になったままだからです。
MREADの後でDMAOFFが実行されるのでそこで待たされていたW65C02側のプログラムが動いて入力データを読んで処理をして送信データとしてメモリに書き込むため1サイクルずれてしまうのです。

ずれが起きないようにプログラムを直しました。

MWRITEとMREADの前後で毎回DMAON、DMAOFFを実行するようにしました。

そのように直してからプログラムを実行しました。

ずれがなくなりました。

W65C02マイコンボードの製作[第82回]
2026.9.27 upload

前へ
次へ
ホームページトップへ戻る