CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

ADSP2k

コーデックでLチカ

コーデック本来の機能であるA/D、D/A部分の確認が先にできてしまったのですがおまけ機能の汎用出力ピンでLチカも一応やっておきます 汎用出力ピンXCTL0/1の制御はインデックスアドレス#10:pin control regに割り付けられています ループバックプログラ…

ループバック実行

コーデックへの初期化コマンドチェインの内容はこうなっています。コントロールワードに含まれるインデックスでポイントされる13個の8ビットレジスタにデータをセットしていきます。コード上はプログラムメモリ領域に埋め込まれるので24ビット幅データですが…

コーデック初期化

下準備ができてやっとAD1847の初期化になりますが、前述の通りバッファにコマンドワードを書き込むと勝手に送信されてしまいます。初期化コマンドチェインinit_cmds[14]を割込みごとに1ワードづつ送るために初期化のためだけの割込みルーチンframe_intの中…

DSP初期化

コーデックがバスマスタになるのでコーデック側に送受信データがあるときフレーム同期をつかってDSPへ割込みをかけることになりますが、それに応答してDSP側で送受信プログラムを起動するのではなく、ハードウェアで循環バッファとの入出力を自動でやってく…

設定移植

ADSP-2181のコードをADSP-2101用に変更していますが割込み要因が変更になっているため関連する内蔵レジスタも意味付けが変わっています 以下の2個のレジスタはSPORT0 Rxのビット位置が変わってしまったためセットするデータを修正しておきました IMASK(Inte…

割込みベクタ

最後まで残っていたΦ3.5イヤホンジャックを取り付けて部品実装は全て完了しました。 サンプルコードのリストを読んでコーデックの使い方を勉強しています。アセンブルはノーエラーで通ったのですが細かい修正は要りそうです。 まずサンプルコードはADSP-2181…

ソースアセンブル

アプリケーションノートに書かれているサンプルコードをそのままコピペしてきました。単純なループバック(入力されたアナログ信号をA/DしたものをそのままD/Aに書き込んでアナログ信号を出力)なんですがコメント含めて約350行もあります。ただそのほと…

部品実装完了

アナログ系の部品取付けはさらっと済みました。オーディオ信号入出力のΦ3.5ジャックは足を少しヤスらないと挿入できないので後回しです。 コーデックAD1847には汎用のデジタル出力端子が2個ありこれにLEDを接続してあります。まず手始めにこれを制御してLED…

アナログ部組立て

デジタル系のみ動作確認していたADSP2101ボードですが、放置していたアナログ系も着手することにします アナログ系のオプションパーツキットです(ディアゴスティーニだと挫折/飽きたころに届くセット) そろえたものはキーパーツのコーデックAD1847の他、入…

抵抗セット

アナログフィルタに使う中途半端な値の抵抗をどうしようかと考えてました。 1種につき10個もあれば十分ですが千石の10個のテープカット品¥53(@5.3)を必要な値を揃えるのはやはり高い。秋月の5000個リール品¥980は単価が@0.2で安いですがほとんど余らせて…

割込み処理(2)

ブート部分、ベクタテーブル、アプリケーション全てを1本のアセンブラで記述すればこのような面倒くさいことしなくてもよいのですが、いちおうCで開発した場合の走行環境はあったほうがよいでこういうことになっています。 サンプルプログラムとしてタイマ…

割込み処理

デジタル系であと確認しておくこととして割込みがありました。DSPの本来の処理はサンプリング間隔の一定のタイムスロット内で完了させるものであり、それに必要な周期割込みが機能するかやってみます。 ADSP-2101の割込み要因はハード割込み3本、シリアル送…

ベンチマークテスト

全体像がうまくいったのでメッシュを細かくして特定部位を拡大する計算をやってみました。ほかのボードでもやっているベンチマークテストで同じ条件を設定します。ただしこのボードではデータメモリ領域が0x3C00ワード(30kbyte)しかないので出来上がりイメ…

浮動小数点演算

デジタル系のハードデバッグもできたし、Cでの開発環境も整ったので部品がそろうまで他のプロジェクトに移行しようかと思ったのですが、一応確認で浮動小数点演算が動くかやってみました。ADSP2101のアーキテクチャ自体が固定小数点での処理を想定していてソ…

デジタル系完成

DSP周りのデジタル系はほぼデバッグ完了でよいかと思います。アセンブラ、Cでの開発環境もできたので、いよいよアナログ系を着手していきます。 いまのところ全く部品が実装されていませんが、やはりアナログフィルタを構成するCRの値が手持ちがなかったりで…

アセンブラI/F

PXレジスタを経由したポート出力はできましたが、今度はポート入力を考えてみます。やはりPXレジスタを読むアセンブラコードを書かなければなりませんがasm()文では引数でそのあたりの制御ができるようです。 ここでは以下のように記述しました。”=a”はAX系…

ツール修正

Cソースをコンパイルして無事バイナリイメージ(EXE形式)まではできたのですがボードに転送してメモリ上に配置するとどうも内容がおかしいし、実行しても暴走してしまうという状況が続いていました。バイナリエディタで開いてみると、どうも先頭部分が壊れ…

CでLチカ

Cでの開発環境が整ったのでテストプログラムを書いてみました。LEDに接続したパラレルポートを叩く関数led_dsp()にインクリメントデータを渡しています。 ここで問題なのがやはり8ビットの周辺デバイスを最下位のD0..D7に接続してしまったこと。直で出力でき…

Cコンパイラ

モニタでロードできるユーザプログラムをCで書けるようにしてみます。AnalogDevicesが提供しているツールの中にGCCベースのADSP21xx用CコンパラG21.EXEが含まれてました。 一般的な使い方ではこの程度のコマンドラインでいいようです。 自分のPC上のDOSBOX内…

ファイル変換(2)

EXEファイル(memory image file)フォーマットの解説はありますが、中身を見れば明らか。テキストで書かれているので1行づつ順にバイナリにしていくだけです。 EXE2BINの中核部分のソースです。ローディングアドレスを取り出したら1つ前のメモリブロック…

ファイル変換

PROMスプリッタが出力したbytestreamファイルを見てみるとこの時点でMSG1とMSG2の隙間にFFが3個(1ワード)しかなくバッファ空き領域の詰め物が無くなってしまっています。 よくよくマニュアルのbytestreamファイルに関する説明をみてみるとちゃんと書いてあ…

プログラムリロケート

ボードをテスト治具に接続し安定したデバッグ環境になりました。消費電流は意外に小さくこの程度です。 モニタのLOADコマンドはシリアル入力からボード上のプログラムメモリ0x800番地・・・これは外付け拡張したSRAMが有効になる先頭番地・・に配置するよう…

統合環境に登録

統合環境CMPLDRVにADSP-2101のツールチェインを登録しました 内部的には以下のバッチを呼んでいるだけです。アセンブラ、リンカ、PROMスプリッタでHEXファイルを生成した後、hex→binコンバータでバイナリのベタファイルに変換しています。 ここで問題なのはA…

モニタ完成

今までいろいろなCPUボードで共通に記述してきたバイナリ→HEX表示変換ですがADSP2101ではこのような感じになりました。バイト2桁表示のHEX2DSPとその下請けになるニブル1桁表示のHEX1DSPのコーディング例です。 演算に使える汎用レジスタに制限があるのとコ…

Tipsつづき

モニタのコマンド入力でそれぞれの処理に分岐する部分の記述はこうなっています。ほとんどBASICかと見紛うようなコードですが制約はいろいろあります (2)文字リテラルを定数として使えない これはアセンブラの仕様ですが’D’、’L’といった表記でASCIIコー…

モニタ作成開始

ボードにSRAM:HM62832HLPを実装しました。メモリ3個使いというのがいままでちょっとないパタンです LEDチカチカループと8251を通した1文字入出力ルーチンができているのでこれを拡張していき簡易モニタを作っていこうとしていますが、コーディングをしてみ…

無電源動作

インクリメントデータのシリアル出力をターミナルソフトで受けると012345・・・ABCDEF・・・というようないつもの文字列が垂れ流しされるので動作はOKです。 うまくいったと満足してボードの電源を切ったら、何故かその後もたらたらとキャラクタが出てきます…

シリアル出力

8251の初期化ルーチンを修正したところ、シリアルが正常に出力されるようになりました。振幅は±8.5V程度ですがこんなものでしょう /DTR,/RTSのインジケータも点灯しました。 Dsubの他、コネクタ類も追加で挿入しデジタル系の部品実装はほぼ完成です。SRAMは…

8251プログラミング

シリアルコントローラ8251がうまく初期化できない件ですが、よくよく考えると前にも同じような失敗をしたことがあって、たぶんリカバリータイムの不足が原因です。 UART_INITルーチンの中で8251に書き込みをしているところを観察してみました。 (Ch1:8251の…

シリアルテスト

アセンブラでの開発環境が使えそうなので少し長いプログラムもコーディングできます。モニタが載せられるようにシリアル入出力を確認しておくことにします。 チェックの仕方は毎回同じですがLEDチカチカループに1文字出力ルーチンUART_SENDを組み込んだだけ…