将Arduino连接到C64的磁带端口


8

更新:实际的实现是在Peter Edwards的Tapuino项目中完成的。检查一下,所有内容都是开源的:https : //github.com/sweetlilmre/tapuino


我正在使用我的Arduino将TAP磁带数据文件从PC传输到C64的项目中工作。该项目的软件方面进展顺利,但是我对电子行业还是陌生的,我不喜欢炒我的准将。所以我实际上需要硬件接口帮助。

C64磁带使用PWM调制将程序存储在盒式磁带上,并在回读数据时使用运算放大器+施密特触发器将音频信号转换为方波。每个高低转换都会触发机器中的一个中断,并且两个中断之间的距离(即脉冲的长度)代表了流的原子部分。

卡带盒端口的引脚分配如下所示(顶部和底部两次具有相同的引脚):

C64的磁带端口

A-1,GND,地

B-2,+ 5V,5伏直流电

C-3,MOTOR,电机控制,约 电机6伏电源

D-4,读取,数据输入,从数据集中读取数据

E-5,写,数据输出,将数据写入数据集

F-6,SENSE,检测(如果按下了PLAY,RECORD,F.FWD或REW键之一)

我当前的想法如下:

基于C64接口蓝皮书(从第29页开始),机器在READ和WRITE端口上使用TTL电平,因此我想我可以将Arduino的PWM引脚直接连接至READ引脚。

我还需要与SENSE引脚连接。我想我也可以直接将其连接到数字PIN之一,并在需要发信号通知按钮状态时将数字LOW写入那里。那是对的吗?

稍后,我希望检测MOTOR引脚上是否存在+ 6V信号。一些加载器会在加载过程中停止数据集,因此我也必须检测到该信息以正确模拟磁带。我应该使用某种电阻来限制那里的电流,还是可以直接将其连接起来?也许我应该在那儿使用继电器?


来自Arduino的PWM信号到达WRITE(非READ)引脚。
Telaclavo

我喜欢用Arduino模拟数据集,所以我应该与READ引脚连接,因为那是C64接受输入的地方。
NagyI,2012年

根据我对数据格式的了解,您不会像传统的PWM信号那样重复脉冲-而是长,中和长脉冲的组合来承载数据。Arduino可以发送这样的PWM信号吗?
Johncl

Answers:


4

根据您提供的文档,数据集端口正在寻找占空比变化(H为0.75,L为0.25)的纯数字信号。

只要Arduino引脚可以驱动足够的电流(应该可以)并以5V电压运行,直接连接就可以工作。您可能需要研究在Arduino和C64之间使用TTL缓冲区(该缓冲区将由数据集端口的+5电源供电,并且C64和Arduino的接地均共用)。

至于SENSE,使用数字输出来驱动小信号MOSFET(如2N7002)会更容易-逻辑高电平将MOSFET导通,从而将SENSE引脚(连接到漏极)接地(已连接)到源头),而Arduino根本不需要吸收任何电流。

MOTOR引脚也可用于驱动MOSFET栅极。漏极将通过弱上拉(大约10k)上拉至Arduino电源电压,源极接地。漏极也将流向数字逻辑引脚。当MOTOR为高电平时,逻辑输入为低电平,反之亦然,并且Arduino看到干净的逻辑信号。

例如...

Arduino至C64 V1

请注意,使用两个“与非”门作为各种缓冲区。(你能告诉我我曾经沉迷于零件吗?)

TTL相当强大。我认为损坏的可能性不大。


哇,漂亮的原理图。我想我会先尝试将Arduino的PWM输出引脚直接连接到D-4,因为它也使用5V。反正谢谢你!:)
NagyI'5

@NagyI它应该工作。
亚当·劳伦斯

哦,天哪,我没有接受这个答案?真可惜 无论如何,我只是订购了胶带边缘连接器来尝试一下,下周我的焊接站就到了。因此,希望我能尽快对此进行测试:)
NagyI 2013年

因为我无法获得2N7002,所以我的同事向我建议了BS170。感测信号完美运行。但是,电机检测已损坏。Arduino总是读取逻辑低电平。无论我将Gate设置为Low还是High都没有关系,Arduino总是读取逻辑低电平。这是BS170的问题还是其他问题?我已经尝试过另一个BS170,但问题仍然存在。在我看来,BS170只能切换GND,而不能切换电压。
NagyI 2013年

2

听起来像一个有趣的项目。我的回忆是,VIC-20的硬件将来自Datasette的脉冲馈送到边缘检测电路(我忘记了它是检测到上升沿还是下降沿)。C64磁带加载例程与VIC-20兼容,因此,我认为标准加载器不会使用VIC-20不支持的任何技巧,尽管自定义加载器可能如此。那天我从来没有玩过足够的东西来确定Datasette本身是否将上升沿和下降沿都转换为脉冲(例如,通过将延迟且无延迟的信号馈入XOR门)。我想出了一个将数据转换为脉冲宽度的例程,但根本没有弄清楚如何使用边缘检测器。

关于从PC到C64的数据获取,如果您不想使用声卡(某些声卡具有立体声图像处理功能,可能会对输出音频的相位造成严重破坏),有两种方法可能会建议:(1)将脉冲间隔数据从PC发送到Arduino,并简单地让Arduino对单个输出脉冲进行计时。也许使用类似于以下编码的方式对每个字节两个脉冲编码数据格式:

0000-1100-输出20us高,然后输出24-60us低(3us的倍数)
1101-输出40us低
1110-输出80us低
1111-$ FF的字节值将被忽略
          -其他半字节等于1111的字节可以用来模拟
             胶带电机按钮或指示“可以在此处暂停”指示。

我认为没有任何加载方案会尝试以高于3us的精度对脉冲计时,并且该方案将允许通过UART在115200处发送数据。PC应该添加0xFF填充字节,以便将数据发送到的速率Arduino会合理地匹配Arduino将其输出的速率。因为每个半字节需要44到80微秒来处理,所以Arduino只需在半个字节之间轮询其UART,并可以在每个脉冲结束时禁用中断。如果PC合理有效地填充其数据,则可以(1)让PC尝试比Arduino输出数据更快地发送数据,并使用硬件或软件握手来减慢其速度,或者(2)让Arduino当缓冲区的缓冲区快满时,将每个脉冲减少一微秒,或在其缓冲区几乎为空时为每个脉冲增加一个微秒。为了避免由于短暂的PC打h而导致音频故障,如果缓冲区的缓冲区未满,可以让Arduino以“可以在这里暂停”字节暂停输出。


谢谢你的想法。实际上,我正在将TAP文件数据直接流式传输到Arduino。它用一个字节指定每个脉冲。(请参阅:c64tapes.org/dokuwiki/doku.php?id=analyzing_loaders)克服了数据传输的故障,我在Arduino上使用了一个kB圆形缓冲区,该缓冲区正在主循环中填充。数据由附加到PWM发生器的match事件的中断功能消耗。这被称为两次脉冲。那是我更改PIN级别的地方,在高低转换时,我根据下一个字节写入新的匹配寄存器值。
NagyI 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.