En fristående 8-bitarsdator baserad på mikroprocessorn W65C02S. Arduino Mega 2560 används för att simulera minne och klockcykler i det första utvecklingsskedet.
Detta är en hembyggd 8-bitarsdator där en klassisk W65C02S-mikroprocessor får liv utan att en enda rad maskinkod behöver brännas in i ett EEPROM. Istället agerar en Arduino Mega 2560 som datorns minne och klocka – den läser processorns adressbuss, serverar instruktioner från sitt interna RAM, och fångar upp allt som CPU:n skriver.
Eftersom W65C02S är en CMOS-krets med helt statisk kärna kan klockan stoppas helt utan att processorn glömmer sitt tillstånd. Detta utnyttjas fullt ut: två fysiska knappar låter dig stega igenom programmet – antingen en enskild klockcykel i taget eller en hel instruktion åt gången. En lysdiod pulserar i takt med klockan och en LCD-display visar adressbuss och instruktion i realtid – perfekt för att förstå vad som faktiskt händer inuti en 8-bitars CPU.
Nedan hittar du ett komplett kopplingsschema, detaljerade kopplingstabeller och en stegvis byggplan som tar dig från strömmatning till en fullt interaktiv testbänk.
Komplett kopplingsschema i 5 blad — ritat i ren ingenjörsstil med nätetiketter, titelruta och korrekta komponentsymboler. Inspirerat av Ben Eaters klassiska datorbyggen.
📐 Öppna kopplingsschema (5 blad)Blad 1: Översikt · Blad 2: Adressbuss A0–A15 · Blad 3: Databuss D0–D7 · Blad 4: Kontroll & Ström · Blad 5: I/O-enheter
| Antal | Komponent |
|---|---|
| 1 | W65C02S (DIP-40 mikroprocessor) |
| 1 | Arduino Mega 2560 (Plus eller standard) |
| 1 | LCD1602 med I2C/IIC-backpack |
| 1 | Lysdiod (röd eller gul för klockindikering) |
| 1 | 220 Ω eller 330 Ω motstånd (strömbegränsning för klock-LED) |
| 5 | 3,3 kΩ eller 10 kΩ motstånd (pull-up för CPU-kontrollpinnar) |
| 8 | 100 Ω motstånd (seriemotstånd på databussen) |
| 8 | Lysdioder (röda, för visuell avläsning av databussen D0–D7) |
| 8 | 220 Ω motstånd (strömbegränsning för databuss-LED:arna) |
| 1 | 104 (100 nF) keramisk kondensator (avkoppling för CPU) |
| 1 | 10 µF eller 47 µF elektrolytisk kondensator (strömstabilisering) |
| 2 | Taktila tryckknappar (för stegning av klocka och instruktioner) |
| – | Kopplingsdäck (breadboards) och solid kopplingstråd |
| W65C02 (Pin) | Signal | Kopplas till | Kommentar |
|---|---|---|---|
| Pin 8 | VDD | Arduino 5V | Strömmatning |
| Pin 21 | GND | Arduino GND | Gemensam jord |
| Pin 36 | PHI2 | Arduino D2 | Klockinmatning (genereras av Arduinon) |
| Pin 34 | R/W | Arduino D3 | Read/Write (Hög = Läs, Låg = Skriv) |
| Pin 40 | /RESET | Arduino D4 | Styrs av Arduinon för kontrollerad omstart |
| Pin 7 | SYNC | Arduino D7 | Opcode fetch-indikering (hög vid instruktionshämtning) |
Följande pinnar på W65C02 måste dras till 5V via ett 3,3 kΩ eller 10 kΩ motstånd:
| W65C02 (Pin) | Adress | Arduino Mega | Hårdvaruport |
|---|---|---|---|
| Pin 9–16 | A0 – A7 | A8 till A15 | PORTK (låga adressblocket) |
| Pin 17–20 & 22–25 | A8 – A15 | A0 till A7 | PORTF (höga adressblocket) |
Varning – busskollision! När CPU:n skriver data (R/W låg) måste Arduinons PORTA-pinnar vara satta som INPUT (högimpedans) innan PHI2 går hög. Seriemotstånden (100 Ω) begränsar strömmen vid en oavsiktlig kollision.
| W65C02 (Pin) | Data | Arduino Mega | Hårdvaruport |
|---|---|---|---|
| Pin 33 | D0 | Digital 22 + 100 Ω | PORTA Bit 0 |
| Pin 32 | D1 | Digital 23 + 100 Ω | PORTA Bit 1 |
| Pin 31 | D2 | Digital 24 + 100 Ω | PORTA Bit 2 |
| Pin 30 | D3 | Digital 25 + 100 Ω | PORTA Bit 3 |
| Pin 29 | D4 | Digital 26 + 100 Ω | PORTA Bit 4 |
| Pin 28 | D5 | Digital 27 + 100 Ω | PORTA Bit 5 |
| Pin 27 | D6 | Digital 28 + 100 Ω | PORTA Bit 6 |
| Pin 26 | D7 | Digital 29 + 100 Ω | PORTA Bit 7 |
Åtta lysdioder (med 220 Ω motstånd) kopplas mellan varje datalinje och GND, på CPU-sidan av 100 Ω-seriemotstånden. När en bit är hög (logisk 1) tänds motsvarande LED. Du kan läsa av hela databussens 8-bitarsvärde binärt i realtid.
| Datalinje | LED + motstånd | Anslutning |
|---|---|---|
| D0 | LED0 + 220 Ω | Mellan D0 (CPU pin 33) och GND |
| D1 | LED1 + 220 Ω | Mellan D1 (CPU pin 32) och GND |
| D2 | LED2 + 220 Ω | Mellan D2 (CPU pin 31) och GND |
| D3 | LED3 + 220 Ω | Mellan D3 (CPU pin 30) och GND |
| D4 | LED4 + 220 Ω | Mellan D4 (CPU pin 29) och GND |
| D5 | LED5 + 220 Ω | Mellan D5 (CPU pin 28) och GND |
| D6 | LED6 + 220 Ω | Mellan D6 (CPU pin 27) och GND |
| D7 | LED7 + 220 Ω | Mellan D7 (CPU pin 26) och GND |
Klocklinje (Arduino D2 / CPU Pin 36)
│
└───[ 220 Ω eller 330 Ω motstånd ]───►│ (Lysdiod) ───┐
│
Arduino GND
De flesta LCD1602 I2C-backpackar använder adress 0x27 eller 0x3F. Kör en I2C-skanner på Arduinon för att verifiera adressen.
| LCD1602 I2C Pin | Kopplas till | Kommentar |
|---|---|---|
| GND | Arduino GND | Jord |
| VCC | Arduino 5V | Strömmatning (+5V) |
| SDA | Arduino Pin 20 (SDA) | Dataöverföring |
| SCL | Arduino Pin 21 (SCL) | Klocksynkronisering för I2C |
Knapparna använder Arduinons interna pull-up-motstånd och kopplas direkt mellan pinne och jord.
Arduino D5 (Klocksteg) -------[ Knapp ]------- Arduino GND
Arduino D6 (Instruktionssteg) -[ Knapp ]------- Arduino GND
Avstudsning (debounce): Mekaniska knappar studsar vid tryck. Avstudsning måste hanteras i mjukvaran (t.ex. 50 ms spärrtid).
$FFFC och $FFFD (reset-vektorn).$8000) på $FFFC/$FFFD. Lägg en NOP-instruktion ($EA) eller en loop på $8000.PORTA som utgångar vid läsning (R/W hög) och som ingångar vid skrivning (R/W låg).$8000 och exekverar.