สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ต่อจากคำสั่งสอนก่อนหน้าของฉัน ตอนนี้ฉันได้ใส่ 6502 ลงบนบอร์ดสตริปและเพิ่ม 6522 Versatile Interface Adapter (VIA) อีกครั้ง ฉันใช้รุ่น WDC ของ 6522 เนื่องจากมันเข้ากันได้อย่างสมบูรณ์แบบกับ 6502 ของพวกเขา ชิปใหม่เหล่านี้ไม่เพียงแต่ใช้พลังงานน้อยกว่ารุ่น MOS ดั้งเดิมมากเท่านั้น แต่ยังสามารถทำงานได้ด้วยความเร็วที่ช้าลงหรือแม้กระทั่งก้าวผ่าน โปรแกรมที่ไม่มีปัญหาใดๆ
เดิมโปรแกรม Arduino นั้นเขียนขึ้นโดย Ben Eater (ซึ่งมีวิดีโอมากมายบน YouTube) และฉันได้รับการแก้ไขเพื่อให้ได้ผลลัพธ์นี้
เสบียง
1 x WDC W65C02 โปรเซสเซอร์
1 x WDC W65C22 อะแดปเตอร์อินเทอร์เฟซอเนกประสงค์
1 x 74HC00N IC (เกท NAND แบบ Quad 2-input) หรือใกล้เคียง
แผ่นกระดานกว้าง 1 x 10 ซม. (35 เส้น)
ซ็อกเก็ต DIL 2 x 40 พิน
ซ็อกเก็ต DIL 1 x 14 พิน
หมุดหัว PCB 2.54mm
ซ็อกเก็ตส่วนหัว PCB 2.54mm
1 x 12mm Momentary Tactile Push Button Switch PCB Mounted SPST หรือใกล้เคียง
ตัวต้านทาน 1 x 1K
ตัวต้านทาน 1 x 3K3
ตัวเก็บประจุเซรามิก 2 x 0.1 uF
1 x 8 Way Water Light Marquee 5mm สีแดง LED
ลวดเชื่อมหลากสี
สายต่อตัวผู้-ตัวผู้ 8 เส้น
ขั้นตอนที่ 1: แผงวงจร
แผงวงจรมีขนาดค่อนข้างเล็กและเสียบปลั๊กด้านล่างเข้ากับ Arduino MEGA ได้โดยตรง เพื่อให้บรรลุสิ่งนี้ หมุดจะถูกผลักเข้าไปในที่ยึดพลาสติกให้ไกลที่สุดก่อนที่จะบัดกรีไปที่ด้านล่างของบอร์ด สามารถใช้พินที่ยาวกว่านี้ได้ แต่พินมาตรฐานหมายความว่าบอร์ดวางอย่างแน่นหนาบน MEGA
ฉันได้จัดเรียงไอซี 6502 และ 6522 เพื่อให้พวกเขาใช้แทร็กบอร์ดแถบเพื่อเชื่อมต่อกับ MEGA นอกจากนี้ยังมีการเชื่อมต่อบางอย่างสำหรับ 6502 ที่ซ่อนอยู่ภายใต้ไอซี เมื่อสร้างบอร์ด สิ่งแรกที่ต้องทำคือตัด 16 แถบที่จะเชื่อมต่อกับซ็อกเก็ตสองแถวของ Arduino ไม่จำเป็นต้องตัด 2 ด้านนอกเนื่องจาก 5v และ Gnd อยู่ทั้งสองด้าน ถัดไปประสานใน 2 แถว 18 พินที่ด้านล่างและ 2 แถว 18 ซ็อกเก็ตที่ด้านบน
หลังจากนั้นซ็อกเก็ต DIL ถูกบัดกรีเข้าที่และแทร็กที่ตัดระหว่างพวกเขา ฉันสามารถบันทึกการเชื่อมต่อโดยวางพิน 14 ของ 74HC00 บนแทร็กเดียวกันกับ 5v ฉันตัดรางเฉพาะเมื่อแน่ใจว่าจะต้องเป็นในขณะที่ฉันกำลังบัดกรีสายไฟที่เชื่อมต่ออยู่ อย่างไรก็ตาม สิ่งต่าง ๆ ไม่ได้เป็นไปตามแผนเสมอไป เดิมทีฉันออกแบบแผงแถบจากบอร์ดขนมปังรุ่นก่อนโดยใช้หมุด 2, 3 และ 7 ของ Arduino แต่สิ่งเหล่านี้ไม่สอดคล้องกับรูในกระดานแถบจึงต้องใช้ หมุด 18, 31 และ 37 ดังนั้น ลิงก์บนกระดานของฉันในวันที่ 31 และ 37 คุณอาจสงสัยว่าทำไมฉันถึงไม่ใช้หมุดที่ไม่ได้ใช้อันใดอันหนึ่ง (23, 24 ฯลฯ) สำหรับนาฬิกา นั่นเป็นเพราะพวกเขาไม่รองรับ ขัดจังหวะจึงต้องใช้พิน 18, 19, 20 หรือ 21 ซึ่งทำ โชคดีที่หมุดทั้ง 4 ตัวนี้อยู่ในแนวเดียวกับรูในกระดานสตริปและทำให้ทุกอย่างกะทัดรัด พิน 18 อยู่ห่างจากสายอื่นๆ ทั้งหมดเช่นกัน
คุณอาจสังเกตเห็นว่าบอร์ดที่เสร็จสมบูรณ์ของฉันไม่เหมือนกับไดอะแกรมของฉันทุกประการ นั่นเป็นเพราะฉันทำตามไดอะแกรมของคนอื่น ดังนั้นการเชื่อมต่อกับ 74HC00 ฉันได้เพิ่มไฟ LED และซ็อกเก็ตเพิ่มเติม 2 แถวสำหรับ Gnd และ 5v รวมถึงตัวเก็บประจุอีกสองสามตัว
ฉันสามารถเชื่อมต่อซ็อกเก็ตข้อมูล 2 อันได้ แต่นี่จะหมายถึงสายไฟที่ข้ามกระดานมากขึ้น ฉันเลือกใช้สายลิงค์ 8 สายเพื่อทำสิ่งนี้เป็นมาตรการชั่วคราว
พอร์ต 6522 A และ B มีซ็อกเก็ตที่บัดกรีเข้ากับรางเพื่อให้สามารถใส่ LED marque ได้อย่างง่ายดาย
ขณะนี้มีสายไฟน้อยกว่าในรุ่น breadboard
ขั้นตอนที่ 2: ทฤษฎีการเขียนโปรแกรม
6522 มีพอร์ต I/O สองพอร์ต รวมถึงคุณสมบัติอื่นๆ มากมาย แต่พอร์ต A และ B สามารถเข้าถึงได้ง่าย ในการเอาท์พุตข้อมูลบนพอร์ต จำเป็นต้องตั้งค่า Data Direction Register (DDR) และข้อมูลที่ส่งไปยังพอร์ตนั้นเอง
ด้วยการตั้งค่าข้างต้น 6522 จะอยู่ที่ $E000
ในการส่งออกข้อมูลบนพอร์ต B DDR ที่ $E002 ถูกตั้งค่าเป็น $FF (255 - เอาต์พุตทั้งหมด) และข้อมูลจะถูกส่งไปยัง $E000
ในการส่งออกข้อมูลบนพอร์ต A DDR ที่ $E003 ถูกตั้งค่าเป็น $FF (255 - เอาต์พุตทั้งหมด) และข้อมูลจะถูกส่งไปยัง $E001
รหัสด้านล่างโหลด $FF ลงในการลงทะเบียน 6502 A และเขียนไปยัง DDR B ที่ $E002 จากนั้นโหลด $55 และเขียนไปยัง ORB รหัสถูกหมุน (ให้ $AA) และเขียนไปยัง ORB โปรแกรมจะกระโดดกลับ tp $1005 และเล่นซ้ำไม่รู้จบ หมายเหตุ: ต้องเริ่มต้น DDR เพียงครั้งเดียว
ที่อยู่ Hexdump Dissassembly
$1000 a9 ff LDA #$ff $1002 8d 02 e0 STA $e002 $1005 a9 55 LDA #$55 $1007 8d 00 e0 STA $e000 $100a 6a ROR A $100b 8d 00 e0 STA $e000 $100e 4c 05 10 JMP $1005
$55 ในรูปแบบไบนารีคือ 010101010 และ $AA คือ 10101010 ซึ่งทำให้ไฟ LED สลับเป็น 4 เปิด 4 ปิด
การแก้ไขที่รวดเร็วและสกปรก:
แทนที่ 74HC00 (Quad 2 input NAND Gate) ด้วย 74HC08 (Quad 2 input AND Gate) และตอนนี้ 6522 อยู่ที่ $6000 แทนที่จะเป็น $E000 สิ่งนี้จะย้ายจาก 32K บนเป็น 32K ที่ต่ำกว่าของหน่วยความจำแอดเดรสได้ของ 6502
ขั้นตอนที่ 3: โปรแกรม Arduino และเอาต์พุต
เนื่องจาก 6502 ไม่มี RAM ให้อ่าน Arduino จึงจัดหาโปรแกรมสำหรับอ่าน เมื่อตรวจพบพัลส์นาฬิกาบนพิน 18 Arduino จะวางข้อมูลโปรแกรมไว้ที่บัสข้อมูล (พิน Arduino 39, 41, 43, 45, 47, 49, 51 และ 53) 6502 สร้างที่อยู่ของตัวเองซึ่ง Arduino จะตรวจสอบเฉพาะบนพินที่มีเลขคู่ 22 ถึง 52 เท่านั้น Arduino ยังส่งพัลส์นาฬิกาบนพิน 37 สาย R/W ของ 6502 จะถูกตรวจสอบที่พิน 31
เนื่องจาก Arduino กำลังจัดหาข้อมูล จนถึงตอนนี้ก็ยังไม่สามารถรับ 6502 เพื่อป้อนข้อมูลจาก VIA ได้ (เว้นแต่คุณจะรู้ดีกว่า)
โปรแกรม Arduino อยู่ด้านล่างและตัวอย่างเอาต์พุตจาก Serial Monitor อยู่ด้านบน
ขั้นตอนที่ 4: บทสรุป
ฉันได้ลองแสดงวิธีตั้งค่า "คอมพิวเตอร์ 6502" ขั้นต่ำอีกครั้ง
ในขั้นตอนนี้ 6502 ยังคงอาศัย Arduino เพื่อจัดหาโปรแกรมและพัลส์นาฬิกาเพื่อให้สามารถทำงานได้
มันเป็นขั้นตอนที่ไกลกว่าตอนที่ฉันตั้งไว้บนกระดานขนมปัง
ฉันไม่ได้ใช้ 74HC373 ในครั้งนี้ แต่ 6522 ที่ซับซ้อนกว่าเพื่อล็อคเอาท์พุตข้อมูล 6522 ยังมีพอร์ต I/O สองพอร์ต
ฉันตั้งใจที่จะทำโครงการนี้ต่อไปโดยติดตั้ง SRAM หรือ EEPROM บางตัว