สารบัญ:
- ขั้นตอนที่ 1: โปรแกรมสาธิต
- ขั้นตอนที่ 2: การเพิ่ม EEPROM
- ขั้นตอนที่ 3: การเขียนโปรแกรม EEPROM
- ขั้นตอนที่ 4: โปรแกรม EEPROM
- ขั้นตอนที่ 5: เรียกใช้ 6502 จาก EEPROM
- ขั้นตอนที่ 6: สัญญาณเวลาภายนอก
- ขั้นตอนที่ 7: บทสรุป
วีดีโอ: 6502 Minimal Computer (พร้อม Arduino MEGA) ตอนที่ 3: 7 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:04
ตอนนี้ฉันได้เพิ่ม Octal Latch, ไฟ LED รูปสี่เหลี่ยมผืนผ้า 8 ดวงและอาร์เรย์ตัวต้านทาน 220 โอห์มลงในกระดานหลัก นอกจากนี้ยังมีจัมเปอร์ระหว่างพินและกราวด์ทั่วไปของอาร์เรย์ เพื่อให้สามารถปิดไฟ LED ได้ เกท 74HC00 NAND ถูกแทนที่ด้วยเกท 78LS08 และการเดินสายไปยังเกทก็เปลี่ยนไปเช่นกัน ประตู AND หมายความว่า 6522 ตอนนี้อยู่ที่ $6000 แทนที่จะเป็น $E000
นอกจากนี้ยังมีพินสำหรับเชื่อมต่อนาฬิกาภายนอกเพื่อขับเคลื่อน 6502 ด้วยการเชื่อมต่อนี้ MEGA จึงไม่จำเป็นต้องให้สัญญาณนาฬิกา MEGA ยังคงตรวจสอบสิ่งที่เกิดขึ้นกับโปรเซสเซอร์เหมือนเมื่อก่อน
ฉันใช้สลัก 20 พิน 74HC373 เพราะฉันมีบางอย่าง สิ่งนี้ใช้ได้เมื่ออยู่บนเขียงหั่นขนม แต่ 74HC573 เข้ากันได้กับบัสและจะช่วยประหยัดการเดินสายได้มาก อาจพิจารณา UCN5801A ซึ่งเป็น IC 22 พินในวงจรด้วย แต่การเดินสายจะแตกต่างกันเล็กน้อย
ไฟ LED สีส้มเดี่ยวด้านบนเป็นไฟแสดงสถานะเปิด/ปิด และไฟสีแดงด้านล่างซ้ายจะระบุเวลาที่เขียน ส่วนหลังจะไม่มีนัยสำคัญหากบอร์ดทำงานด้วยความเร็วสูงกว่า
วงจรที่ดัดแปลงอยู่ด้านบน (ด้วย 74HC573)
ขั้นตอนที่ 1: โปรแกรมสาธิต
โปรแกรมสาธิตอย่างง่ายสองโปรแกรมรวมอยู่ในมอนิเตอร์ 6502 และโค้ดที่ถอดประกอบอยู่ที่นี่
โปรแกรมนี้โหลด 1 ลงในรีจิสเตอร์ 6502 A และเก็บไว้ในสลัก จากนั้นจะเพิ่ม 1 ลงในรีจิสเตอร์ A และเก็บไว้ในสลัก จากนั้นจะกระโดดกลับไปที่ $ 105 และกระบวนการนี้จะทำซ้ำตลอดไป
* = 1000
1000 A9 01 LDA #$01 1002 8D 00 41 STA $4100 1005 69 01 ADC #$01 1007 8D 00 41 STA $4100 100A 4C 05 10 JMP $1005 100D. END
โปรแกรมนี้ตั้งค่า DDR ของ 6522 พอร์ต B เป็นเอาต์พุตก่อน จากนั้นจะเก็บ $55 (B01010101) ไว้ในพอร์ตและสลัก จากนั้นรีจิสเตอร์ A จะหมุนไปทางขวา 1 ขั้น และตอนนี้ถือ $AA (B10101010) สิ่งนี้จะถูกเก็บไว้ในพอร์ต B และสลักอีกครั้ง โปรแกรมกระโดดกลับไปที่ $ 105 และดำเนินต่อไปตลอดกาล
* = 1000
1000 A9 FF LDA #$FF 1002 8D 02 60 STA $6002 1005 A9 55 LDA #$55 1007 38 SEC 1008 8D 00 60 STA $6000 100B 8D 00 41 STA $4100 100E 6A ROR A 100F 8D 00 60 STA $6000 1012 8D 00 41 STA $4100 1015 4C 05 10 JMP $1005 1018. END
สายตาที่เฉียบแหลมในหมู่คุณอาจสังเกตเห็นว่าไฟ LED สีแสดงรูปแบบที่แตกต่างจากสีเขียว เนื่องจากสายทั่วไปเชื่อมต่อกับ 5v บนสายสี และสายสามัญบนสายสีเขียวเชื่อมต่อกับกราวด์
เปลี่ยนรหัสบรรทัดนี้เป็น program2 หรือ program3
setDataPins(โปรแกรม3[ออฟเซ็ต]);
6502 Assembler and Disassembler เป็นเครื่องมือที่มีประโยชน์ในการช่วยเข้ารหัสโปรแกรมของคุณ
ขั้นตอนที่ 2: การเพิ่ม EEPROM
สำหรับบอร์ด EEPROM ฉันใช้บอร์ดแบบสตริปขนาด 950 x 650 มม. และหมุดส่วนหัวตัวผู้ 19 มม. เพื่อให้บอร์ดสามารถเคลียร์อันที่อยู่ข้างใต้ได้ บอร์ดนี้เสียบเข้ากับบอร์ด 6502 ด้านล่าง EEPROM คือ ATMEL 28C256 ซึ่งมี 28 พินและมีหน่วยความจำ 32k x 8 บิต ซึ่งเพียงพอสำหรับโปรแกรมขนาดเล็กที่ใช้อยู่ในปัจจุบัน
ฉันไม่ได้ทำแผนภาพวงจรสำหรับบอร์ดนี้ แต่มันค่อนข้างตรงไปตรงมาว่าเชื่อมต่อกับบอร์ด 6502 ด้านล่างอย่างไร ชิป EEPROM เหล่านี้ไม่เป็นมิตรกับบัส จึงต้องต่อเข้ากับหมุดแต่ละตัว ดังนั้น "สปาเก็ตตี้สีเขียวและสีขาว" ทั้งหมด ฉันได้แก้ไขปัญหาการเชื่อมโยงบนบอร์ดก่อนหน้านี้โดยการเดินสายข้อมูลเข้าด้วยกันที่ด้านล่างของบอร์ด
หมุดที่อยู่ 14 อันของ EEPROM เชื่อมต่อกับพินที่เหมาะสมทางด้านซ้าย (สายสีเขียว) และพิน I/O กับพินข้อมูลทางด้านขวา (สายสีขาว) พิน 27 (WE) เชื่อมต่อกับพิน 28 (5v), พิน 22 (OE) เชื่อมต่อกับกราวด์และพิน 20 (CE) เชื่อมต่อกับเกต NAND อินพุต 2 ของเกต NAND เชื่อมต่อกับ A15 บน กระดานหลัก ซึ่งหมายความว่าเมื่อพินนี้สูงขึ้น ประตู NAND จะให้สัญญาณต่ำไปยังพิน CE ของ EEPROM ซึ่งทำให้พินทำงาน ด้วยการตั้งค่านี้ หมายความว่า EEPROM สามารถอ่านได้โดย 6502 เท่านั้น
เนื่องจาก EEPROM อยู่ในอันดับสูงสุด 32k บนแผนที่หน่วยความจำ หมายความว่า $FFFC และ $FFFD สามารถเก็บที่อยู่เริ่มต้นสำหรับ 6502 ได้หลังจากที่รีเซ็ตแล้ว ด้วย 6522 ที่มีที่อยู่ระหว่าง $6000 ถึง $600F และสลักอยู่ที่ $4100 มันจึงหยุดความขัดแย้งของหน่วยความจำ
เวกเตอร์ NMI ($FFFA และ $FFFB) และเวกเตอร์ BRK / IRQ ($FFFE และ $FFFF) สามารถเขียนในลักษณะเดียวกันได้เช่นกัน
ขั้นตอนที่ 3: การเขียนโปรแกรม EEPROM
ในการจัดเก็บโปรแกรมบน EEPROM จำเป็นต้องมีโปรแกรมเมอร์ ฉันสร้างหนึ่งจากกระดานแถบ, Arduino Pro Mini, 74HC595 สองสามตัวและซ็อกเก็ต ZIF ในขั้นต้น โปรแกรมเมอร์ถูกสร้างขึ้นสำหรับ AT28C16 ซึ่งมีบรรทัดที่อยู่น้อยกว่า AT28C256 จึงต้องแก้ไข
แผนภาพวงจรแสดงวิธีการต่อสาย EEPROM ทั้งสองนี้ จากภาพไม่ชัดเจนว่าชิป 595 สองตัวคว่ำและไม่เป็นไปตามที่แสดงในแผนภาพ พิน 1 ถึง 7 จาก 595/1 เรียงตาม A1 ถึง A7 ของ EEPROM ไม่ว่าจะใช้อันไหน ประหยัด 7 สายเชื่อมต่อ ตอนนี้บอร์ดดูแน่นไปหน่อย และนั่นเป็นเพราะตอนแรกฉันใช้ซ็อกเก็ต DIL 24 พิน ซึ่งตอนนี้ถูกแทนที่ด้วยซ็อกเก็ต ZIF 28 พินที่ใหญ่กว่ามาก
รวมโปรแกรมที่ใช้งานได้กับบอร์ดของฉัน โปรแกรมจะทำงานร่วมกับ Arduino และ 595s ในวงจรดังที่แสดง ฉันเลือก 5v Pro Mini เพราะมันกะทัดรัดและราคาถูกพอที่จะทิ้งไว้ในการตั้งค่า
ขั้นตอนที่ 4: โปรแกรม EEPROM
มีสามโปรแกรมง่าย ๆ ในโปรแกรมเมอร์ EEPROM หากต้องการใช้ เพียงยกเลิกการใส่เครื่องหมายบรรทัดที่คุณต้องการใช้
// อ่านจากพอร์ต A ของ 6522
//ข้อมูลไบต์คงที่ = {0xA9, 0x00, 0x8D, 0x03, 0x60, 0xAD, 0x01, 0x60, 0x4C, 0x05, 0x90, 0x00};
โปรแกรมแสดงการถ่ายโอนข้อมูลหน่วยความจำเมื่อเสร็จสิ้น ส่วนหนึ่งของโปรแกรมด้านล่างช่วยให้คุณควบคุมสิ่งที่คุณต้องการเขียนหรือลบได้อย่างเต็มที่ ตั้งค่า $FFFC & $FFFD จากนั้นแสดงเนื้อหาของช่วงที่กำหนด เพียงยกเลิกการใส่ความคิดเห็นหรือแก้ไขพารามิเตอร์ตามที่คุณต้องการ ที่อยู่สามารถป้อนในรูปแบบทศนิยมได้
// ลบ EEPROM (422, 930, 0x41); // ใช้เพื่อลบ EEPROM ทั้งหมดหรือบางส่วน - start, end, byte
Serial.println ("การเขียนโปรแกรม EEPROM"); จำนวน = program_numeric_data(0x1000); เขียนEEPROM(0x7ffc, 0x00); // ตั้งค่า $FFFC สำหรับ 6502 writeEEPROM(0x7ffd, 0x90); // ตั้งค่า $FFFD สำหรับ 6502 //writeEEPROM(0x1000, 0xA9); // เขียนข้อมูล 1 ไบต์ Serial.println(" done"); โครงร่างสตริง = " เขียนแล้ว " + (สตริง) จำนวน + " ไบต์"; Serial.println (เค้าร่าง); Serial.println("กำลังอ่าน EEPROM"); เนื้อหาการพิมพ์ (0x0000, 0x112f); // ตั้งค่าช่วงเพื่อแสดง printContents(0x7ff0, 0x7fff); // อ่าน 16 ไบต์สุดท้ายบน EEPROM
ผลลัพธ์โดยย่อจากโปรแกรมอยู่ด้านบน
ขั้นตอนที่ 5: เรียกใช้ 6502 จาก EEPROM
ตอนนี้ EEPROM ที่ตั้งโปรแกรมไว้สามารถแทรกลงในบอร์ดของมันได้ และเจ้าหมูตัวนี้ก็กลับไปที่บอร์ด 6502 หลักซึ่ง piggy back อยู่บน MEGA ภาพถ่ายด้านข้างและด้านบนแสดงให้เห็นว่ามันเข้ากันได้อย่างไร
ตอนนี้ 6502 สามารถอ่านเวกเตอร์เริ่มต้นจาก $FFFC และ $FFFD (ซึ่งก็คือ $9000) แล้วข้ามไปที่โปรแกรมที่เก็บไว้ที่นั่น MEGA ยังคงให้สัญญาณนาฬิกาและจำเป็นต้องแก้ไขโปรแกรมเพื่อให้ส่งสัญญาณนาฬิกาและตรวจสอบ 6502 เท่านั้น โปรแกรมที่แก้ไขมีไว้เพื่อทำสิ่งนี้
รูปภาพที่กำลังทำงานแสดงว่าโปรแกรมนี้กำลังทำงานอยู่
9000 LDA #$00 A9 00
9002 STA $6003 8D 03 60 9005 LDA #$FF A9 FF 9007 STA $6002 8D 02 60 900A LDA $6001 AD 01 60 900D STA $6000 8D 00 60 9010 EOR #$FF 49 FF 9012 STA $4100 8D 00 41 9015 JMP $900A 4C 0A 90
สวิตช์ถูกเสียบเข้ากับพอร์ต A และโปรแกรมแสดงค่าที่อ่านอยู่บนพอร์ต B และ 74HC373 (ซึ่งถูกบดบังอยู่ในปัจจุบัน) สวิตช์เชื่อมต่อกับกราวด์และไฟ LED เชื่อมต่อกับ 5v EOR #$FF แก้ไขปัญหาของแลตช์และพอร์ต B ที่แสดงรูปแบบต่างๆ โดยการพลิกบิตก่อนที่จะเขียนไปยังแลตช์
ขั้นตอนที่ 6: สัญญาณเวลาภายนอก
หากใช้สัญญาณนาฬิกากับพินที่ด้านบนของบอร์ด ตอนนี้ 6502 สามารถทำงานแยกจาก MEGA ได้ แน่นอนว่ามันต้องการแหล่งพลังงานด้วย ฉันได้ทดลองกับนาฬิกาที่แตกต่างกันและเรียกใช้ 6502 ที่ 1MHz ด้วยคริสตัลออสซิลเลเตอร์ MEGA ไม่สามารถตามให้ทันด้วยความเร็วที่เร็วกว่า จึงต้องถอดออก
ฉันยังลองเอาท์พุตจากตัวจับเวลา 555 แต่ก็ใช้ไม่ได้ ฉันคิดว่ามันอาจจะเป็นเพราะมันไม่ใช่คลื่นสี่เหลี่ยม? เมื่อเชื่อมต่อกับเอาท์พุต CD4017 ตัวใดตัวหนึ่ง มันขับ 6502 ได้ ฉันติดตั้งหนึ่งในชุดอุปกรณ์ด้านบนเพื่อลองรับสัญญาณนาฬิกา
ฉันยังคงดูวิธีต่างๆ เพื่อรับสัญญาณนาฬิกา
ขั้นตอนที่ 7: บทสรุป
ฉันได้แสดงวิธีสร้างวงจรที่ซับซ้อน และรับ "คอมพิวเตอร์" ที่ง่ายมากเพื่อทำงานกับชิ้นส่วนจำนวนน้อยที่สุด จริงอยู่ คอมพิวเตอร์ไม่สามารถทำอะไรได้มากในปัจจุบันหรือมีแนวโน้มว่าจะทำเช่นนั้นในอนาคต
ย้อนกลับไปในช่วงต้นยุค 80 กับ VIC20 ของฉัน ฉันเคยสงสัยในเครื่องจักรที่ยอดเยี่ยมและไม่มีความคิดแรกว่าจะเริ่มต้นประกอบเข้าด้วยกันได้อย่างไร เวลาผ่านไปอย่างรวดเร็วและมีเทคโนโลยี แต่ก็ยังดีที่จะกลับไปสู่พื้นฐานและภาคภูมิใจในสิ่งที่คุณสร้างขึ้นตั้งแต่เริ่มต้น
เพื่อพัฒนาคอมพิวเตอร์เครื่องนี้ต่อไป ฉันตั้งใจที่จะใส่ SRAM 2k ที่ $0000 ถึง $2047 และเพิ่มออสซิลเลเตอร์ 1 MHz อาจจะเพิ่มบางอย่างเช่น CD4040 (12-Stage Binary Ripple Counter / Divider) เพื่อให้ฉันสามารถแตะความเร็วสัญญาณนาฬิกาที่แตกต่างกัน
อาจเพิ่มจอ LCD เพื่อให้แสดงผลข้อความมากกว่าแค่ไฟกะพริบ โปรแกรมเมอร์ EEPROM จะต้องได้รับการแก้ไขเพื่อจัดการกับโปรแกรมขนาดใหญ่ที่จำเป็นในการเรียกใช้จอ LCD
แม้ว่า MEGA จะไม่จำเป็นสำหรับการรัน 6502 แต่ก็ยังมีประโยชน์สำหรับการดีบักรหัสเครื่อง อย่างที่ใครๆ ก็รู้ รหัสเครื่องมีข้อบกพร่องอยู่เสมอ!
แนะนำ:
6502 & 6522 Minimal Computer (พร้อม Arduino MEGA) ตอนที่ 2: 4 ขั้นตอน
6502 & 6522 Minimal Computer (พร้อม Arduino MEGA) ส่วนที่ 2: ต่อจาก Instructable ก่อนหน้าของฉัน ตอนนี้ฉันได้ใส่ 6502 ลงบนบอร์ดสตริปและเพิ่ม 6522 Versatile Interface Adapter (VIA) อีกครั้ง ฉันกำลังใช้รุ่น WDC ของ 6522 เนื่องจากมันเข้ากันได้อย่างสมบูรณ์แบบกับ 6502 ของพวกเขา ไม่เพียงแต่ทำค
6502 คอมพิวเตอร์ขั้นต่ำ (พร้อม Arduino MEGA) ส่วนที่ 1: 7 ขั้นตอน
6502 Minimal Computer (พร้อม Arduino MEGA) ส่วนที่ 1: ไมโครโปรเซสเซอร์ 6502 ปรากฏตัวครั้งแรกในปี 1975 และได้รับการออกแบบโดยทีมเล็กๆ ที่นำโดย Chuck Peddle สำหรับ MOS Technology ย้อนกลับไปตอนนั้น มันถูกใช้ในคอนโซลวิดีโอและคอมพิวเตอร์ที่บ้าน รวมถึง Atari, Apple II, Nintendo Entertainment System, BBC Micr
Minimal Four X 12 Volt Rover Chassis พร้อม GoBILDA: 10 ขั้นตอน
Minimal Four X 12 Volt Rover Chassis กับ GoBILDA: ฉันจะแสดงให้คุณเห็นว่าฉันสร้าง RC หรือแชสซีโรเวอร์แบบอิสระโดยใช้ส่วนประกอบ goBILDA ได้อย่างไร ฉันควรเพิ่มที่นี่ว่าฉันไม่มีส่วนเกี่ยวข้องใด ๆ กับ goBILDA นอกเหนือจากในฐานะลูกค้าที่พึงพอใจเป็นส่วนใหญ่ ฉันได้รวมรายการชิ้นส่วนทั้งหมดภายใต้ Suppl
PWM พร้อม ESP32 - Dimming LED พร้อม PWM บน ESP 32 พร้อม Arduino IDE: 6 ขั้นตอน
PWM พร้อม ESP32 | Dimming LED พร้อม PWM บน ESP 32 พร้อม Arduino IDE: ในคำแนะนำนี้เราจะดูวิธีสร้างสัญญาณ PWM ด้วย ESP32 โดยใช้ Arduino IDE & โดยทั่วไปแล้ว PWM จะใช้เพื่อสร้างเอาต์พุตแอนะล็อกจาก MCU ใดๆ และเอาต์พุตแอนะล็อกนั้นอาจเป็นอะไรก็ได้ระหว่าง 0V ถึง 3.3V (ในกรณีของ esp32) & จาก
RC Raft Boat พร้อม Wifi ควบคุม ตอนที่ 1: 4 ขั้นตอน
RC Raft Boat พร้อม Wifi ควบคุม ตอนที่ 1: เรากำลังจะสร้างเรือแพที่วิ่งบนน้ำด้วยแอพ Android ที่ควบคุมด้วย WiFi เรือของเรามีมอเตอร์พร้อมใบพัดและไมโครคอนโทรลเลอร์ WiFi ที่ตั้งโปรแกรมไว้ซึ่งปล่อยให้มอเตอร์และนำไปสู่ ควบคุมผ่าน WiFi