Kết nối Arduino với cổng băng của C64


8

Cập nhật : một triển khai thực tế của việc này được thực hiện trong dự án Tapuino do Peter Edwards thực hiện. Hãy xem thử, mọi thứ đều được mở nguồn: https://github.com/sweetlilmre/tapuino


Tôi đang làm việc trong một dự án mà tôi đang sử dụng Arduino của mình để truyền các tệp dữ liệu băng TAP từ PC sang C64. Phần mềm của dự án đang diễn ra tốt đẹp tuy nhiên tôi vẫn chưa quen với thiết bị điện tử và tôi không muốn rán hàng hóa của mình. Vì vậy, tôi cần sự giúp đỡ can thiệp phần cứng thực sự.

Băng C64 sử dụng điều chế PWM để lưu chương trình trên băng cassette và khi đọc lại dữ liệu, bộ kích hoạt opamp + schmitt chuyển đổi tín hiệu âm thanh thành sóng vuông. Mỗi chuyển tiếp cao thấp sẽ kích hoạt một ngắt trong máy và khoảng cách giữa hai ngắt (là độ dài của xung) đại diện cho một phần nguyên tử của luồng.

Sơ đồ chân của cổng cassette trông như thế này (mặt trên và mặt dưới có cùng một chân hai lần):

Cổng băng của C64

A-1 , GND, mặt đất

B-2 , + 5V, 5 Vôn

C-3 , ĐỘNG CƠ, Điều khiển động cơ, khoảng. Bộ nguồn 6 V của động cơ

D-4 , READ, Nhập dữ liệu, đọc dữ liệu từ bộ dữ liệu

E-5 , VIẾT, Xuất dữ liệu, ghi dữ liệu vào bộ dữ liệu

F-6 , SENSE, Phát hiện, nếu nhấn một trong các phím CHƠI, GHI, F.FWD hoặc REW

Ý tưởng hiện tại của tôi là như sau:

Dựa trên Sách xanh giao diện C64 (bắt đầu từ trang 29), máy sử dụng cấp độ TTL trên cổng READ và WRITE để tôi đoán rằng tôi có thể kết nối trực tiếp một chân PWM từ Arduino với chân READ.

Tôi cũng cần giao diện với pin SENSE. Tôi nghĩ rằng tôi có thể kết nối trực tiếp với một trong các mã PIN kỹ thuật số và viết kỹ thuật số THẤP ở đó khi tôi cần báo hiệu trạng thái nút nhấn. Đúng không?

Sau này tôi muốn phát hiện sự hiện diện của tín hiệu + 6V trên chân ĐỘNG CƠ. Một số trình tải dừng tập dữ liệu ở giữa quá trình tải vì vậy tôi cũng phải phát hiện ra điều đó để mô phỏng băng chính xác. Tôi có nên sử dụng một số loại điện trở để hạn chế dòng điện ở đó hay tôi chỉ có thể nối trực tiếp với nó? Có lẽ tôi nên sử dụng một rơle ở đó?


Tín hiệu PWM từ Arduino đi đến chân WRITE (không phải READ).
Telaclavo

Tôi thích mô phỏng tập dữ liệu với Arduino vì vậy tôi nên giao tiếp với chân READ vì đó là nơi C64 chấp nhận đầu vào.
NagyI

Từ những gì tôi hiểu định dạng của dữ liệu, bạn không lặp lại các xung như tín hiệu PWM cổ điển - nhưng đó là sự kết hợp của các xung dài, trung bình và dài mang dữ liệu. Arduino có thể gửi tín hiệu PWM như vậy không?
Johncl

Câu trả lời:


4

Theo tài liệu bạn cung cấp, cổng bộ dữ liệu đang tìm kiếm một tín hiệu số thuần túy với chu kỳ nhiệm vụ khác nhau (0,75 đối với H, 0,25 đối với L).

Miễn là chân Arduino có thể điều khiển đủ dòng điện (cần có thể) và hoạt động ở mức 5V, kết nối trực tiếp sẽ hoạt động. Bạn có thể muốn điều tra bằng cách sử dụng bộ đệm TTL giữa Arduino và C64 (bộ đệm sẽ được cấp nguồn từ nguồn cung cấp +5 của cổng dữ liệu và mặt đất sẽ phổ biến cho cả C64 và Arduino).

Đối với SENSE, việc sử dụng đầu ra kỹ thuật số để điều khiển MOSFET tín hiệu nhỏ sẽ dễ dàng hơn (như 2N7002) - mức cao logic bật MOSFET, kéo chân SENSE (được kết nối với cống) xuống đất (được kết nối đến nguồn) mà không cần Arduino phải chìm bất kỳ dòng điện nào cả.

Chân XE cũng có thể được sử dụng để lái cổng MOSFET. Cống sẽ được kéo lên đến điện áp cung cấp Arduino với lực kéo yếu (10k hoặc hơn), nguồn kết nối với mặt đất. Cống cũng sẽ đi đến một pin logic kỹ thuật số. Khi ĐỘNG CƠ cao, đầu vào logic thấp và ngược lại, và Arduino thấy tín hiệu logic sạch.

Ví dụ...

Arduino đến C64 V1

Lưu ý sử dụng hai cổng NAND làm bộ đệm. (Bạn có thể nói tôi đã từng tranh giành các bộ phận không?)

TTL khá mạnh mẽ. Tôi không nghĩ rằng có nhiều cơ hội làm hỏng bất cứ điều gì.


Wow, sơ đồ tốt đẹp. Tôi nghĩ rằng tôi sẽ cố gắng kết nối trực tiếp chân ra của Arduino với D-4 vì nó sử dụng 5V. Dù sao thì cũng cám ơn bạn! :)
NagyI

@NagyI Nó nên hoạt động.
Adam Lawrence

Oh, tôi đã không chấp nhận câu trả lời này? Xấu hổ với tôi Dù sao tôi chỉ cần ra lệnh cho đầu nối băng để thử cái này và trạm hàn của tôi sẽ đến vào tuần tới. Vì vậy, hy vọng tôi có thể kiểm tra điều này sớm :)
NagyI

Bởi vì tôi không thể nhận được 2N7002 đồng nghiệp của tôi đã đề nghị cho tôi BS170 thay thế. Sense báo hiệu hoạt động hoàn hảo. Tuy nhiên phát hiện động cơ bị hỏng. Arduino luôn đọc logic thấp. Không thành vấn đề nếu tôi đặt Gate ở mức Thấp hoặc Cao, Arduino luôn đọc logic thấp. Đây có phải là vấn đề của BS170 hoặc một cái gì đó khác nhau? Tôi đã thử nó với một BS170 khác nhưng vấn đề vẫn còn. Dường như với tôi, BS170 chỉ có thể chuyển đổi GND chứ không thể chuyển đổi điện áp.
NagyI

2

Nghe có vẻ một dự án hay. Hồi ức của tôi là phần cứng của VIC-20 đưa các xung từ Datasette vào một mạch phát hiện cạnh (tôi quên rằng liệu nó có phát hiện các cạnh tăng hay giảm không); các thói quen tải băng từ C64 tương thích với các quy trình của VIC-20, vì vậy tôi không nghĩ rằng trình tải tiêu chuẩn có thể đã sử dụng bất kỳ thủ thuật nào mà VIC-20 không hỗ trợ, mặc dù các trình tải tùy chỉnh có thể. Tôi chưa bao giờ chơi xung quanh với các công cụ trở lại trong ngày đủ để xác định liệu Datasette có tự chuyển đổi cả hai cạnh tăng và giảm thành xung hay không (ví dụ: bằng cách đưa tín hiệu trễ và không trễ vào cổng XOR). Tôi đã đưa ra một thói quen để chuyển đổi dữ liệu thành độ rộng xung, nhưng không bao giờ tìm ra cách sử dụng bộ dò cạnh.

Liên quan đến việc chuyển dữ liệu từ PC sang C64, nếu bạn không muốn sử dụng thẻ âm thanh (một số thẻ âm thanh có xử lý hình ảnh âm thanh nổi và có thể phá hỏng giai đoạn của âm thanh đi) có thể đề xuất: (1) gửi dữ liệu khoảng thời gian xung từ PC đến Arduino và chỉ cần có các xung đi riêng lẻ theo thời gian của Arduino. Có lẽ mã hóa định dạng dữ liệu bằng hai xung trên mỗi byte, sử dụng cái gì đó giống như mã hóa sau:

0000-1100 - Xuất ra mức cao 20us sau đó là 24-60us thấp (tính bằng bội số của 3us)
1101 - Sản lượng 40us thấp
1110 - Sản lượng 80us thấp
1111 - Giá trị byte của $ FF sẽ bị bỏ qua
          - Có thể sử dụng các loại tạm biệt khác có một nybble bằng 1111 để mô phỏng
             băng nút động cơ hoặc chỉ ra một dấu hiệu "được tạm dừng ở đây".

Tôi không nghĩ rằng bất kỳ lược đồ tải nào sẽ cố gắng tạo xung theo thời gian với độ chính xác cao hơn 3us và lược đồ này sẽ cho phép dữ liệu được gửi qua UART vào lúc 115200. PC nên thêm các byte đệm 0xFF để tốc độ được gửi đến Arduino sẽ hợp lý rất phù hợp với tốc độ mà Arduino đang theo dõi nó. Bởi vì mỗi nybble sẽ mất từ ​​44 đến 80 micro giây để xử lý, Arduino sẽ chỉ phải thăm dò UART của nó giữa các nybble và có thể vô hiệu hóa các ngắt gần cuối mỗi xung. Nếu PC đệm dữ liệu của nó một cách hợp lý hiệu quả, thì người ta có thể (1) PC cố gắng gửi dữ liệu nhanh hơn một chút so với Arduino sẽ xuất ra và sử dụng bắt tay phần cứng hoặc phần mềm để làm chậm hoặc (2) có Arduino cạo một micro giây khỏi mỗi xung khi bộ đệm của nó gần đầy, hoặc thêm một micro giây cho mỗi xung khi bộ đệm của nó gần như trống rỗng. Để tránh bị trục trặc âm thanh do trục trặc máy tính tạm thời, người ta có thể yêu cầu Arduino tạm dừng xuất ra ở một byte "được phép tạm dừng ở đây" nếu bộ đệm của nó không gần đầy.


Cảm ơn bạn cho những ý tưởng. Trên thực tế tôi đang truyền dữ liệu tệp TAP trực tiếp đến Arduino. Nó chỉ định mỗi xung với một byte. (xem: c64tapes.org/dokuwiki/doku.php?id=analyzing_loaders ) Việc khắc phục các trục trặc của việc truyền dữ liệu tôi đang sử dụng bộ đệm tròn một kB trên Arduino đang được điền vào vòng lặp chính. Dữ liệu được sử dụng bởi chức năng ngắt được gắn vào sự kiện khớp của bộ tạo PWM. Điều này được gọi là hai lần một xung. Đó là nơi tôi đang thay đổi cấp độ PIN và khi chuyển đổi ở mức thấp, tôi đang viết giá trị thanh ghi khớp mới theo byte kế tiếp.
NagyI
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.