[リストへもどる]
一括表示
タイトルCD-ROMコントローラを作りました
記事No353
投稿日: 2005/12/01(Thu) 23:40:16
投稿者やまじ
はじめまして。このサイトの記事を参考に、CD-ROMコントローラを作ってみました。
ユニバーサル基板を使用していますが、基本的にプリントパターンと同じ配線をしています。
まだバラック状態ではありますが、なかなか好感触です。

ところで、Ejectの際にハングしてしまう件(トレーが出たままで、操作不可能)ですが、
こちらでも以下のドライブにて再現しました。
Pioneer DVR-A03,DVR-105

そこで、http://www.ueno.no-ip.org/%7Etube-audio/cgi-bin/bbs.cgiのNo.17からの記事を参考に試し、
最終的に以下のような(自分流)解決法を見出しました。
do_eject_loop内
rcall get_disk_status

cpi ata_data,0x70
rcall wait_10us    ;追加
breq tray_check_loop

タイミングを取っている形になりますが、これでいいのでしょうか?
ちなみに、No.21の方法を試すと、コードが表示される前にハングします。

あと、Ver2.6のプログラムを使うと、Total Trackが00になってしまうCDがあり、
Ver2.5に変更すると直りました。
この辺りはもう少し調べてみます。

当方での動作確認ドライブ
PHILIPS CDD4801/81
NEC NR-7900A
TOSHIBA SD-M1712
Pioneer DVR-A03,DVR-105 ;Eject時にハングするが、上記変更で対応

タイトルRe: CD-ROMコントローラを作りました
記事No354
投稿日: 2005/12/02(Fri) 07:31:50
投稿者上野 < >
> do_eject_loop内
> rcall get_disk_status
>
> cpi ata_data,0x70
> rcall wait_10us    ;追加
> breq tray_check_loop
>
> タイミングを取っている形になりますが、これでいいのでしょうか?

それだと、cpiの比較結果がrcall wait_10usで上書きされてしまうので、breqで正しい分岐が行われないと思います。たぶん、tray_check_loopへの分岐が常に行われなくなっているのでしょうか。

rcall wait_10usを、cpi ata_data,0x70の前にしても、期待通りの動作となるか試してみてください。駄目ならば、cpi ata_data,0x70と breq tray_check_loopを削除するのが良いのかも。

> ちなみに、No.21の方法を試すと、コードが表示される前にハングします。

ハングしますか。うーむ...

> あと、Ver2.6のプログラムを使うと、Total Trackが00になってしまうCDがあり、
> Ver2.5に変更すると直りました。
> この辺りはもう少し調べてみます。

プログラムを見返して気づきましたが、Ver2.6ではエンファシスされたCDだとTotal Trackが00になってしまうようです。私は持っていないので気づきませんでした。
loop_read_toc: の少し下の、

ldi tmp,0x0f
and audio_status,tmp
ldi tmp,0x00
cp audio_status,tmp
brne PC-16

この0x0fを0x0cにしてみてください。

タイトルRe^2: CD-ROMコントローラを作りました
記事No355
投稿日: 2005/12/02(Fri) 10:07:48
投稿者やまじ
> それだと、cpiの比較結果がrcall wait_10usで上書きされてしまうので、breqで正しい分岐が行われないと思います。たぶん、tray_check_loopへの分岐が常に行われなくなっているのでしょうか。
やはり問題ありですよね。文法的(ちょっと違う)に。

> rcall wait_10usを、cpi ata_data,0x70の前にしても、期待通りの動作となるか試してみてください。駄目ならば、cpi ata_data,0x70と breq tray_check_loopを削除するのが良いのかも。
cpi ata_data,0x70の前においても、やはりハングすることは確認済みです。
cpi ata_data,0x70とbreq tray_check_loopを削除しても、ハングした気がします。
このあたりは、もう一度確認してみます。

> プログラムを見返して気づきましたが、Ver2.6ではエンファシスされたCDだとTotal Trackが00になってしまうようです。私は持っていないので気づきませんでした。
> loop_read_toc: の少し下の、
>
> ldi tmp,0x0f
> and audio_status,tmp
> ldi tmp,0x00
> cp audio_status,tmp
> brne PC-16
>
> この0x0fを0x0cにしてみてください。
なるほど。。。これも試してみます。
ありがとうございました。

タイトルRe^3: CD-ROMコントローラを作りました
記事No356
投稿日: 2005/12/02(Fri) 23:17:14
投稿者やまじ
と言うことで、試してみました。

rcall wait_10usを置く場所は、やはり最初に書き込んだ場所以外ではだめでした。
cpi ata_data,0x70とbreq tray_check_loopを削除しても、やはりハングします。
で、do_eject_loopを回すことを考え、rcall wait_10usは削除し、
do_eject_loopの最後にrjmp do_eject_loopを入れるとOKでした。

あと、loop_read_tocのほうは、0x0fを0x0cにすることで解決しました。
ありがとうございました。