Projektvorstellung: Arduino als EEPROM Programmer

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 :slight_smile:

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 Arduino Reference - Arduino Reference)
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)

Sehr gut @Mario,
bist nicht der Einzige der soetwas benutzt, benötigt. Ich habe ein ähnliches Projekt damals mit 80535 für die Programmierung eines 8051 - Programmspeichers mißhandelt. Damals benutzte ich sogar ein Static Ram, an dem Chip hatte ich den WE Pin über Jumper auf 5V legen können und den Chip on the Fly mit einer Spannungsversorgungslitze programmiert aus dem Sockel nehmen zu können. :smiley: Es war nicht gerade elegant, hat aber super funktioniert.

Deswegen finde ich diesen Beitrag von Dir überaus gut und brauchbar, da ich das selbe Problem mit dem 8 Bit Port sehe. Damals hatte ich einen binären Adresszähler (zwei kaskadierte 4040) und ein 8 Bit Latchbaustein im Einsatz. Die Idee dies mit dem Arduino zu verwirklichen ist klasse.

Danke für diesen wertvollen Beitrag. Und... Darfst gerne weiterführen !

thumbs up

Micha

Ich habe meine ursprüngliche Idee verworfen, einen einzelnen Atmega328 für das Projekt zu verwenden. Ein erster Testaufbau mit interner 8MHz clock und einer Übertragungsrate von 19200 baud funktioniert zwar, bringt aber nicht wirklich Vorteile. Wer immer dieses Projekt nachbauen möchte, braucht zusätzliche Hardware, um den Programmer-Sketch auf den Atmega zu bekommen und dann noch Hardware, um per PC auf die serielle Schnittstelle zugreifen zu können. Das das Projekt vorwiegend für die 6502 Gemeinde gedacht ist, kann man nicht davon ausgehen, das die Jungs (und Mädels) solche Hardware rumliegen haben.
Ein Arduino Nano Clone kostet zwischen 10 und 17 Euro und ist deutlich flexibler einsetzbar. Zumal ich in meinem ersten Prototypen den Nano nicht verlötet, sondern gesockelt habe.
Man bekommt die USB-Serial Schnittstelle geschenkt, kann einfach über die IDE die Firmware des Programmers updaten und der Schaltungsaufwand ist auch nochmal kleiner.

Hier ein Bild vom ersten zusammen gestümperten Prototyp:


Leider warte ich immer noch auf meine 28 Pin ZIF Sockel, daher musste ich meinen 40 Pin ZIF verbasteln. Aktuell sind erstmal nur die 15 Adressleitungen angeschlossen. Aber die werden zumindest schon mal, ohne das Nacharbeiten notwendig wären, richtig über die 74HC595 gesetzt, wie mir mein kleine BUS-Sniffer brav bestätigt :cold_sweat: (Nach einer langen Nacht mit wenig Schlaf ist das bei solchen Bastelarbeiten nicht selbstverständlich :* )

Für heute ist erstmal Schluss mit basteln, bei dem schönen Wetter muss einfach der Grill angeworfen werden. Ich denke im Laufe der Woche geht es weiter. Praktischerweise hat sich für dieses Projekt auch schon ein Mitstreiter gefunden, der den PC Teil der Software in Python schreibt.
Mario.

So, der Prototyp ist fertig verdrahtet. Schön sieht das Ding zwar nicht aus, aber es funktioniert.


Als nächstes werde ich versuchen die Schreibgeschwindigkeit zu erhöhen. Der EEPROM hat das noch das eine oder andere Feature das man nutzen kann.
Mario.

Deine Idee mit dem Selbstbaucomputer Projekt gefällt mir.

Vielleicht kannst Du diese in einem neuen Treath etwas genauer vorstellen.

Eventuell kannst Du das Hive Computerprojekt, auch wenn es auf einem P8X32A basiert, als Inspiration für dein eigenes Projekt gebrauchen:
http://hive-project.de/

Und wieder ein Stück weiter.
Seit heute gibt es einen einfachen Java-Client mit dem ich die Datenübertragung testen und an der Firmware arbeiten kann.


Meine Versuche Daten per "page write" (der schnellsten Übertragungsmethode) zu Schreiben, waren leider bisher noch nicht von Erfolg gekrönt. Aber da ich das ShiftOut() und das setzen der Datenleitungen drastisch beschleunigen konnte, ist nun auch das Schreiben einzelner Bytes schnell genug. (das shiftOut() der IDE ist irgendwie recht langsam)
Inkl. des gesamten Overheads beim Übertragen der Daten von der Java GUI, brauche ich (abhängig von der Baudrate) zwischen 0.98 und 1.3 Sekunden, um 1024 Bytes auf den EEPROM zu schreiben.
Sobald die Firmware auf dem Nano einen sinnvollen Stand erreicht hat, werde ich das hier veröffentlichen, falls jemand Teile des Codes für andere Projekte gebrauchen kann.

@Megaionstorm: Das Hive-Projekt kannte ich bisher noch nicht. Insgesamt scheint der Propeller-Chip eine spannende Sache zu sein. Da meine Wurzeln aber in den 65XX CPUs der 80er Jahre liegen und ich zumindest noch einige Synapsen-Reste zu deren Assembler-Programmierung in meinen Hirnwindungen aufspüren konnte :astonished:, liegt mein Fokus ganz klar auf einem System mit eine 65C02 CPU und allem was zu einem kleinen System dazu gehört. Allerdings werden wohl später einige Atmels für die Peripherie zuständig sein.

Falls dein System auch eine Soundausgabe haben soll möchte ich in Bezug auf den P8X32A erwähnen das es dafür einen SID Emulator gibt.

Würde vielleicht zu deinem 65XX Projekt passen !

Hey, nicht schlecht. Allerdings ist Sound in den ersten Ausbaustufen nicht das womit ich meine Zeit verbringen werde. Ich glaube ich werde genug mit Bus-Timings, Chip-Select Logic und simplen IO Problemen zu kämpfen haben. Da ich noch einen C64 im Keller herum dümpeln habe, würde ich ggf. auch den plündern und dem den originalen SID und ggf. das eine oder andere Bauteil mopsen.
Aber das ist höchstend Plan C oder Plan D. Erstmal muss die erste Version aus 65C02 CPU, einem 6522 VIA, 32k SRAM und 8k EEPROM mit 1MHz laufen. Danach sehen wir weiter :slight_smile:

Warum der 65C02 und kein 6510 ?

Im 65C02 wurden einige Bugs gefixed, die der 6502 und auch dessen Nachfolger der 6510 hatte, außerdem ist er einfacher zu takten. Zudem hat der 65C02 einige spannende OpCodes und Adressierungsarten zusätzlich.
Siehe hier: 6502.org Tutorials: 65C02 Opcodes
Mit www.6502.org gibt es eine super Community mit Leuten die unheimlich viel Erfahrung mit diesen kleinen Käfern haben, quasi die Uwes der 6502 Szene :smiley: ( sorry den konnte ich mir nicht verkneifen).
Falls ich Gefallen an der Sache finde, wird ja evtl. irgendwann mal ein 6510 basierter SBC das Licht der Welt erblicken.

Mario.

Schritt "1" ist geschafft, Hardware, Arduino-Software und JAVA GUI machen was sie sollen. Ich kann EEPROMS schreiben, lesen, löschen und den Inhalt mit einem ROM-Image vergleichen. Ein 8k EERPOM kann in 8 Sekunden beschrieben werden, was für mich völlig ausreichend ist.

Bilder von der Version 1.0 der Java GUI gibt's hier im englischen Vorstellungs-Thread: http://arduino.cc/forum/index.php/topic,163682.0.html

Die Software muss auf der Arduino-Seite noch ein wenig aufgeräumt werden, dann kann ich es denke ich veröffentlichen, ohne das es zu peinlich wird :slight_smile:

Mario.

Der EEPROMMER hat nun eine eigene kleine Seite bekommen.

Dort ist der aktuelle Stand der Entwicklung dokumentiert, inkl. Arduino Sketch und Java-Client. Da ich die nächsten 4 Wochen im Urlaub bin, wird sich bis Juni aber am Projekt nichts mehr ändern.
Mario.