Ich bin zur Zeit in der Planungsphase für einen eigenen 65C02 basierten 8Bit-Computer. Also CPU, RAM, ROM, IO-Bausteine und die ganze Adress- und Datenbus-Logik inkl. eigenem Mini OS. Wie weit ich damit komme, weiss ich noch nicht, aber für fast 30 Jahre alte Kindheitsträume muss man sich einfach mal aufraffen
Die Atmel µC und speziell der Arduino wird mich dabei aber weiterhin begleiten, z.B. als Tastatur-Controller oder auch als EEPROM Programmer. Solange der Computer nicht fertig ist und noch keine Software da ist, die er ausführen kann, muss die erste Software auf einem externen System geschrieben und in binäre Form gegossen werden. Üblicherweise packt man das OS oder zumindest den initialen Code (vergleichbar mit dem PC BIOS) den die CPU nach dem Start ausführen soll in einen ROM. Somit müssen also die binären Daten die aus dem ganzen Assembler-Code generiert werden erstmal auf den ROM (in diesem Fall ein EEPROM AT28C64 64kbit=8KB von Atmel natürlich :D) geschrieben werden. Dazu braucht man einen Programmer. Da die gängigen Modelle aber recht teuer sind und von mir vermutlich nie mit allen Features genutzt werden würden, baue ich mir selber so ein Teil auf Basis des Arduino, bzw. später eines standalone ATmega328.
Die von mir verwendeten EEPROMs haben 12, bzw 14 Addressleitungen (je nach Speichergröße), 8 Datenleitungen und 3 Steuerleitungen. Dazu kommt, das die Kommunikation zum Programmer über eine serielle Schnittstelle erfolgen soll. Also nochmal 2 Leitungen für RX und TX. Damit komme ich auf maximal 27 Leitungen, die der Arduino, respektive der Atmega328, aber nicht hat. Da die Adressleitungen aber reine Output-Leitungen sind, können die über zwei 74HC595 Schieberegister abgebildet werden (siehe auch http://www.arduino.cc/en/Tutorial/ShiftOut). Damit brauche ich für die Adressleitungen nur noch 3 IOs vom Arduino. Für die Datenleitungen geht das nicht, denn die müssen ja sowohl gelesen als auch geschrieben werden.
Auf dem Breadboard verkabelt sieht das Ganze dann so aus:
Um sicher zu gehen, das beim shiftOut() die Daten auch in der richtigen Reihenfolge ausgegeben werden, habe ich mir einen kleinen "Bus-Sniffer" gebaut, der über 2 ULN2803 16 LEDs ansteuert. Obwohl die 16 LEDs nur je 5mA brauchen (low current LEDs mit 1k Vorwiderstand), habe ich die Darlington Treiber verwendet, um dem überwachten Bus möglichst wenig Strom abzufordern.
Meine erste Idee für die Datenleitung war, einen kompletten Port für das Datenbyte zu verwenden. (siehe http://www.arduino.cc/en/Reference/PortManipulation)
Leider ist der PORTD der einzige, bei dem 8 Pins genutzt werden können, bei den anderen 3 Ports sind Bit 6 und 7 jeweils nicht nutzbar (zumindest auf dem Arduino). Leider gehören zu den 8 Pins des PORTD auch die beiden RX und TX Pins der seriellen Schnittstelle, die ich für die Kommunikation nach "Draußen" brauche. Also fällt das auch aus. Bleibt also nur, die Daten als einzelne Bits auf die Datenleitungen zu schreiben, bzw. davon zu lesen.
Das Ergebnis sieht dann so aus:
start writing
finished writing
time elapsed : 2653ms
start reading:0 : 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
20 : 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
40 : 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
60 : 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
80 : 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
A0 : A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
C0 : C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
E0 : E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
Im Auslieferungszustand sind alle Speicherzellen des EEPROM mit 0xFF beschrieben. Das konnte ich auch gut mit meinen ersten Tests prüfen. Um zu sehen, das meine Schreibfunktion richtig arbeitet, habe ich in einer Schleife die Werte 0x00 bis 0xff in die ersten 256 Speicherzellen des EEPROMs geschrieben und danach den Block wieder ausgelesen.
Auch wenn dieses Projekt ein wenig "esotherisch" wirkt, kann der eine oder andere doch etwas von meinem Code gebrauchen. Gerade wenn es darum geht Bytes in einzelne Bits zu zerlegen und wieder zusammen zu setzen. Den Sketch habe ich an diesen Post angehängt.
Als nächstes soll das Ganze vom Breadboard auf eine Prototype Platine mit ZIF-Sockel wandern und der Arduino durch einen Atmega328 mit internen 8MHz ersetzt werden. Parallel soll ein sinnvolles serielles Protokoll entstehen über das man EEPROMs komfortabel lesen und schreiben kann.
Falls Interesse besteht, kann ich hier gern weiter darüber berichten.
Mario. (heute ausgestattet mit einer gewissen Schreiblaune :%)
EEPROMprogrammer.zip (2.19 KB)