モニタが簡単に起動するようになったので、アプリケーションを動かしてみることにしました。

やはりまずはBASICでしょう。68000プロセッサで動作するBASICを探したところ、以下のものがありました。

かなり強力そうなBASICです。EASy68Kのシュミレータでも動くようでグラフィック機能も実装されています。今回はSBCですのでコンソール機能しか使いませんが、それでも有益なステートメントが装備されているようです。

モニタで大量にメモリに書き込みたい

ブートローダーでメモリにロードする場合はBレコードを準備すればよいのですが、モニタのコマンドにはSレコードやBレコードの読み込み機能はなく、アドレスとデータを指定してメモリに書き込む機能「(D)eposit」しかありません。今回はこの機能を使って手入力と同じになるようなファイルを作成して、アップロードすることでメモリにデータを書き込むことにしました。具体的には以下のようなデータになります。

D ADDRESS DATA DATA DATA DATA.....

(例)D 00003020 E5 D4 67 32 B0 3C 00 2C

何バイトまで書き込みができるのかを確認してみました。

mc68ez328_dragonone_sbc_ehbasic_dtest.png

一度に9バイトまで書き込みができるようなので、1回の書き込みは8バイトとして、Pythonでstod.pyというスクリプトを作成し、Sレコードからメモリ書き込みデータ(ここではDレコードと呼ぶことにします)を作成するようにしました。

モニタを起動した状態で、Sレコードから変換したDレコードをアップロードすると、次々とメモリに書き込むことができます。

フラッシュツールの開発が完了し、フラッシュメモリの情報の表示だけでなく、消去や書き込みも行えるようになりました。68k-Monitorをベースとしたので比較的短時間にできました。

mc68ez328_dragonone_sbc_flash_monitor0.png

第41回(4月3日)ではArduinoからルンバに対してコマンドを送ってモーターを動かしました。第42回(4月17日)はルンバのセンサーデータをArduinoで読み取ることを試してみます。

ルンバから読み取れるデータ

ルンバにはいろいろなセンサーが取り付けられています。障害物に接触したことを検知するバンパーやモーターの回転数を読み取るエンコーダー、各種スイッチが押されたかを読み取るなどが考えられます。

今回はモーターの回転数をエンコーダーという仕組みで読み取ります。モーターに電流を流すとモーターが回転します。しかし、本当に回転しているのかはモーター側ではわかりません。もし何かに引っかかってモーターが回らない状態になっているにも関わらず、モーターに電流を流し続けるとモーターが焼けてしまうかもしれません。このため想定通りにモーターが動いているかを検知する仕組みが必要になるのです。

Roomba-robot-otafab42_encorder1.jpg

無事モニタプログラムが動き始めた MC68EZ328 DragonOne SBCですが、次はフラッシュメモリへの書きこみテストが必要です。これがうまくできればスイッチONでモニタが動き、ゆくゆくはμCLinuxが動くようになるはずです。

公式サイトのフラッシュツールが動かない

まずは公式サイトに掲載されている2flash-khを動かしてみたのですが、残念ながらメニューが表示されずにハングアップして動きませんでした。私のgccのクロスコンパイル環境に問題があるのかもしれません。

gccの環境を見直すのは原因の切り分けに時間がかかると思われたので、フラッシュツールをシンプルな68000アセンブラで書くことにしました。ゼロから書くのは大変ですので、現在動作しているChartreuseK/68k-Monitorをベースとして、フラッシュメモリ操作機能を追加していきます。こうすると基本的なコマンドメニュー、文字列や16進数の表示などユーティリティがそのままつかえますし、将来的に68k-Monitorに組み込むこともできます。

フラッシュメモリの情報を取得

2flash-khのソースとフラッシュメモリのデータシートを照らし合わせながら、実装を進めて、フラッシュメモリの情報が取得できるようになりました。

dragonone_flashtools_info1.png

このDragonOne SBCでは、4Mbitx8のフラッシュメモリを2つ使い、上位バイトと下位バイトでチップが分かれているので、Manufactures Codeも上位と下位で2個のメモリの情報が取得できます。Manufacturers Codeの01はAMD、Device CodeのA3はAm29LV033Cを示します。また、The Common Flash Interface (CFI)の情報から"QRY"の文字列や、Device Sizeの情報から4MBと確認できました。

実は私はNORフラッシュメモリを直接操作するのは初めてでして、どのように書き込みや消去を行うのかという流れを理解する良い機会となっています。

ここまで動けば2個のフラッシュメモリは正常に接続できているでしょう。この調子で、Erase機能、Program機能をこのツールに追加していきます。

SBC1802を組み立ててみました - COSMAC研究会

SBC1802は電脳伝説(@vintagechips)さんが設計したシンプルなシングルボードコンピュータで、CDP1802 COSMAC CPUでRCA BASIC3が動作します。この専用基板の品薄が続いていましたが、ようやく入手できましたので早速組み立ててみました。この専用基板はオレンジピコショップさん、スイッチサイエンスさんで取り扱っています。(5/4現在、品切れのようです。)

SBC1802の基板をチェック

今回購入したSBC1802基板です。他の基板と一緒に購入しました。

sbc1802_pcb1.jpg

DRAMのおかげで8MByteという広いメモリ空間ができました。まずはモニタプログラムを載せて自由自在にコントロールできるようにしてみますが、その前にシリアル入出力の確認を進めます。

Hello Worldを表示してみる

MC68EZ328のUART送信レジスタに文字コードを書き込むことで、シリアルターミナルに文字を表示することができます。テストプログラムをアセンブルし生成されたSレコードからBレコードに変換したあとに、ブートローダーで読み込ませて実行します。ソースはGitHubにコミットしておきました。

実行結果は以下のようになりました。

dragonone_helloworld1.png

ロジアナを使っていろいろためしてみましたが、DRAMの仕様書にある通りの信号がでていました。タイミング的にも余裕があります。謎は深まるばかりです。

CASが逆になっている?

偶数アドレスにアクセスしたときは、CASHがLとなり、奇数アドレスにアクセスすると、CASLがLとなります。これでデータバスの上位8ビットを読み取るか、下位8ビットを読み取るかが決まるわけです。ここで、ふと思いました。CASHとCASLが逆になっているのではないかと。

CPUが上位バイトを読み取ろうとしているときに、DRAMが下位バイトの情報をバスに出しているとしたら、目的のデータは読み取れません。

回路図を確認したところ、プリント基板のレイアウトを優先しているためにデータバスの上位バイトと下位バイトが逆に接続されていました。ということは、CASLとCASHを入れ替える必要があるのではということで、パターンカットとジャンパー線で修正してみることにしました。

DRAMへのアクセスの様子をロジアナで確認できるように8バイトのIBUFFで動かすことができるプログラムを書きました。bレコードにしてブートローダに読み込ませ実行できます。アセンブラはEASy68Kを使用しました。

ここでは$00000000番地にD0レジスタの内容を連続してREAD/WRITEするようにしました。繰り返すことでロジアナでも状態が確認しやすくなります。本来なら固定値を書き込みたいところですが、8バイトに納めるためにこのようにしています。

WRITEプログラム

FFFFFFAA              7          ORG     $FFFFFFAA    ; instruction buffer location
FFFFFFAA 8 START:
FFFFFFAA 11C0 0000 9 move.b d0,$000000
FFFFFFAE 60FA 10 bra START
FFFFFFB0 11
FFFFFFB0 12 END START ; last line of source

これをbレコードにすると次のようになります。

FFFFFFAA0811C0000060FA
FFFFFFAA00

MC68EZ328 DragonOne SBCでDRAMが認識しない問題はまだ解決していません。解決の糸口を見つけるためにロジアナで信号を確認してみます。

DRAMにロジアナを接続

DRAMにワイヤーをはんだ付けすることで、外部に信号線を引き出します。今回はAWG30のラッピングワイヤーを使用しました。

dragonone_dram_analyze1.jpg

メモリダンプができるようになったDragonOne SBCにメモリを接続してみます。

DRAMを接続しよう

MC68EZ328で本格的なプログラムを動かすためには外部にメモリを接続しなければなりません。DragonOne SBCでは4Mx16bit EDO DRAMを搭載していますのでこれを使います。

リセット直後ではDRAMは使用できない状態なので、CPUに内蔵されているDRAMコントローラを設定してメモリの配置とリフレッシュ動作をするようにしなければなりません。この設定はCPUの内部レジスタに値を書き込む必要がありますが、これもブートローダーで行うことができます。

ブートローダーで設定する内容もDragonOneのホームページに登録されているのでそれを使えばすぐ動くと思ったのですが、そううまくはいきませんでした。

最近のコメント

アセット

  • mc68ez328_dragonone_sbc_flash_monitor0.png
  • mc68ez328_dragonone_sbc_flashtools_run.png
  • mc68ez328-dragonone-sbc-flash-boot.jpg
  • mc68ez328_dragonone_sbc_ehbasic_asciiart.png
  • mc68ez328_dragonone_sbc_ehbasic_load1.png
  • mc68ez328_dragonone_sbc_ehbasic_dtest.png
  • mc68ez328_dragonone_sbc_flash_monitor3.png
  • mc68ez328_dragonone_sbc_flash_monitor1.png
  • mc68ez328_dragonone_sbc_flash_monitor1.png
  • Roomba-robot-otafab42_encorder1.jpg

カテゴリ

ウェブページ

  • about
  • blogs
  • today
Powered by Movable Type 7.6.0