Allgemeine Hardware Projekte

SRAM Speichertester

Mit dem SRAM Speichertester erspart man sich das mühselige Durchprobieren von alten Speicherchips, sollte ein Computer einen Speicherfehler aufweisen.

Viele der alten Speicherchips lassen sich in aktuellen USB-Programmer nicht mehr testen, weshalb ich eine eigene Lösung entwickelt habe, die auf einem Arduino Mega 2560 basiert.

Getestet werden können folgende Chips:

  • 1k x 1: 2102
  • 1k x 4: 2114, 2148, 2149, 5114, 6514, C214, U224
  • 1k x 4: 6550
  • 1k x 8: 4118, 4801
  • 2k x 8: 2016, 4016, 4802, 4812, 6116, 6512
  • 8k x 8: 2064, 2464, 6264, 2465
  • 32k x 8: 20256, 61256, 62256, 71256

Theoretisch sollten auch alle anderen SRAMs getestet werden können, die eine identische Pinbelegung besitzen.

Als Bonus kann über den Inhalt von EPROMs der Typen 2716, 2732, 2764, 27128, 27256 und 27512 eine CRC32 angezeigt werden. Diese kann mit einem vorliegenden ROM-Image verglichen werden, um zu sehen ob der ROM-Inhalt identisch ist.

Mehr dazu in diesem und diesem Bericht.


DRAM Speichertester

Mit dem SRAM Speichertester erspart man sich das mühselige Durchprobieren von alten Speicherchips, sollte ein Computer einen Speicherfehler aufweisen.

Viele der alten Speicherchips lassen sich in aktuellen USB-Programmer nicht mehr testen, weshalb ich eine eigene Lösung entwickelt habe, die auf einem Arduino Mega 2560 basiert.

Getestet werden können folgende Chips:

  • 16k x 1: 4116, 2117, 6116, 8116, 416, 2116, 3716, U256
  • 16k x 1: 2118, K565RU6
  • 16k x 4: 4416, 2620
  • 32k x 1: 3732H (4532-L4) und 3732L (4532-L3), 4532
  • 64k x 1: 4164, 2600, K565RU5, 8264, 3764
  • 64k x 4: 4464, 41464, 50464
  • 256k x 1: 41256, 53256, 81256, MT1259 883C
  • 256k x 4: 44256, 514256
  • 1024k x 1: 41024, 411000

Theoretisch sollten auch alle anderen DRAMs getestet werden können, die eine identische Pinbelegung besitzen. Damit auch 4116 Chips getestet werden können, besitzt das Shield eine Pfostenleiste für die Versorgungsspannungen +5V, +12V und -5V.


Z80 CPU-Tester

Vor einiger Zeit stolperte ich über Goran Devics Website. Goran beschriebt dort eine Möglichkeit mit einem Arduino eine Z80 CPU zu steuern. Die Idee fand ich so interessant, dass ich ein Arduino-Shield für den Mega 2560 entwarf, seine Software entsprechend anpasste und um einige Funktionen erweiterte, z.B. kann die Länge des Taktzyklus eingestellt werden und vorgegebene Testprogramme können geladen werden. Damit auch ein Betrieb ohne serielle Konsole möglich ist, kann zusätzlich ein LCD Display angeschlossen werden.

Wer den Z80 CPU NOP-Generator nachbauen möchte findet unten die Gerber-Daten und den Quellcode zum Download. Benötigt werden nur ein paar wenige Bauteile:

Ref Qnty Value Remark
C1 1 100uF
D1 1 LED 3mm
J1 1 1×16 Socket (*)
J2 1 40 Pin ZIF oder alternativ ein Präzisionssockel
P1,P2,P5,P6,P7 3 1×08 Header P3 nicht bestückt
P4 1 2×18 Header oder alternativ zwei 1×18 Header
Q1 1 BC548 oder alternativer NPN Transistor
R1 1 220 Ω (*)
R2 1 4.7 kΩ
R3,R4,R6-R9 6 10 kΩ
RV1 1 10 kΩ Potentiometer RM-065 (*)
SW1-SW3 3 Switch 6mm

(*) Derzeit nicht notwendig, da das Display nicht verwendet wird.

Das Display wird aktuell noch nicht verwendet. Anstelle eines teuren ZIF-Sockels kann auch ein Präzisionssockel verwendet werden. Die Bauteilkosten liegen jeweils bei ca. 5-6 EUR zzgl. Platine.

Die ursprüngliche Software wurde bisher um folgende Features erweitert:

  • Die Länge eines Taktzyklus lässt sich über die Variable 13 festlegen (in msec jeweils gültig für H-Pegel und L-Pegel).
  • Mit „l #num“ lässt sich ein Programm in den RAM laden (aktuell sind zwei Beispielprogramme vorhanden).

Der Sketch funktioniert nicht mehr mit dem im Original beschriebenen Aufbau!

Mehr dazu in diesem Bericht.


Z80 NOP-Generator

In einem Z80 NOP-Generator eingesetzt führt eine Z80 CPU nur NOP-Kommandos (No Operation) aus. Mit Hilfe von acht LEDs können die Adressleitungen beobachtet werden. Führt die CPU die NOPs aus, sollten die Adressen permanent hochgezählt werden. Damit ist zwar kein vollständiger Test der CPU Möglich, aber zumindest ein Quick-n-Dirty-Check.

Der hier vorgestellte NOP-Generator funktioniert nur mit Z80 CPUs. Da die CPU sehr langsam getaktet wird, weit außerhalb der Spezifikation, ist es durchaus möglich, dass auch eine eigentlich funktionsfähige CPU nicht mit dem NOP-Generator funktioniert. Die Funktionsweise ist sehr einfach: Die Datenleitungen werden durch Pull-Down-Widerstände auf Masse gezogen, so dass die CPU bei einem lesenden Speicherzugriff ein NOP (Opcode 0x00) liest. Nach einem Reset fängt die CPU an diese Kommandos ab Adresse 0 auszuführen.

Wer den Z80 CPU NOP-Generator nachbauen möchte findet unten die Gerber-Daten zum Download. Benötigt werden nur ein paar wenige Bauteile:

Ref Qnty Value Remark
C1 1 1uF
C2 1 10nF
C3 1 10uF
D1-D8 8 LED 5mm
J1 1 USB_B_Micro 2pol. USB Stecker
R1-R5 5 10K
R6 1 1K
R7 1 3.3K
RN1 1 4,7K SIP 9 oder SIP 10 (letzter Widerstand wird nicht benötigt)
RN2 1 470 SIP 9 oder SIP 10 (letzter Widerstand wird nicht benötigt)
RV1 1 10K Potentiometer RM-065
SW1 1 RESET 6mm Push Button
U1 1 Sockel DIP40 ZIF oder Präzisionssockel
U2 1 NE555

Anstelle eines teuren ZIF-Sockels kann auch ein Präzisionssockel verwendet werden. Die Bauteilkosten liegen jeweils bei ca. 5-6 EUR zzgl. Platine.


6502 NOP-Generator

In einem 6502 NOP-Generator eingesetzt führt eine 6502 CPU nur NOP-Kommandos (No Operation) aus. Mit Hilfe von acht LEDs können die Adressleitungen beobachtet werden. Führt die CPU die NOPs aus, sollten die Adressen permanent hochgezählt werden. Damit ist zwar kein vollständiger Test der CPU Möglich, aber zumindest ein Quick-n-Dirty-Check.

Der 6502 NOP Generator liefert den Opcode 0xEA, welches einem NOP beim 6502 entspricht. Nach einem Reset beginnt der 6502 NOP-Generator ab Adresse 0xEAEA zu zählen (nach einem Reset liest die CPU aus den Adressen 0xFFFC-0xFFFD die reale Startadresse ab und da diese immer 0xEA liest, ist dieses die 0xEAEA). Die LEDs sollten somit bei 11101010‬ beginnen zu zählen.

Wer den 6502 CPU NOP-Generator nachbauen möchte findet am Ende des Beitrags die Gerber-Daten zum Download. Benötigt werden nur ein paar wenige Bauteile:

Ref Qnty Value Remark
C1 1 10nF
C2 1 10uF
C3 1 1uF
D1-D8 8 LED 5mm
J1 1 USB_B_Micro 2pol. USB Stecker
R1 1 1K
R2 1 3.3K
R3-R15 5 10K
RN1 1 470 SIP 9 oder SIP 10 (letzter Widerstand wird nicht benötigt)
RV1 1 10K Potentiometer RM-065
SW1 1 RESET 6mm Push Button
U1 1 NE555
U2 1 Sockel DIP40 ZIF oder Präzisionssockel

Anstelle eines teuren ZIF-Sockels kann auch ein Präzisionssockel verwendet werden. Die Bauteilkosten liegen jeweils bei ca. 5-6 EUR zzgl. Platine.


ATmega328P Development Board

Für kleinere Basteleien habe ich ein eigenes günstiges ATmega328P Board entwickelt. Es werden nur wenige Komponenten benötigt, so dass das Board nur ein paar Euro kostet.

Die Pin-Leisten sind zwar kompatibel zum Arduino Uno, da aber kein USB-auf-Seriell Chip vorhanden ist, muss der ATmega per ISP programmiert werden und benötigt daher auch keinen Bootloader, der i.d.R. ein paar KByte Speicher benötigt. Es gibt zahlreiche günstige ISP Programmierer zu kaufen, die von der Arduino IDE unterstützt werden (anstelle von „Hochladen“ wird „Hochladen mir Programmer“ verwendet).

Ref Qnty Value Remark
C1,C5 2 100 nF
C2,C3 2 22 pF
C4 1 10 uF
D1 1 LED gelb 3mm
D2 1 LED rot 3mm
J7 1 Barrel Jack 2.1mm
R1 1 10K
R2-R5 4 1K
SW1 1 Switch 6mm
U1 1 ATmega328P
U2 1 7805
Y1 1 16 MHz

ESP-Programmier-Zwischenadapter

Der ESP-Programmier-Zwischenadapter entstand aus Bequemlichkeit: Mein verwendeter USB-Programmieradapter (Link zu Amazon) erlaubte es nur durch zusätzliches Anlegen einer Brücke einen ESP8266 (ESP-01) zu programmieren und zum Ausführen musste diese wieder umständlich entfernt werden.

Der Zwischenadapter wird auf den USB-Programmieradapter gesetzt, das ESP-01 dann auf den Adapter. Mit einem Schalter wird GPIO0 auf Masse gezogen (erlaubt das Programmieren durch den USB-Adapter). Nach dem Programmieren kann der Schalter dann umgelegt werden und durch Druck auf die RESET-Taste das Programm gestartet werden.


Netzteil für 12V, 5V und -5V

Auf GitHub bin ich auf eine günstige Möglichkeit gestoßen aus einer Spannung >14V die drei Spannungen 12V, 5V und -5V zu erzeugen (theoretisch auch weitere, wenn man mehr Linearregler verwenden möchte). Leider ist das ganze schlecht dokumentiert, so dass ich diese Schaltung als Grundlage für einen eigenes Platinendesign verwendete.

Ref Qnty Value Remark
C1,C3,
C6-C8
5 100 uF min. 35V
C4,C5 2 47 uF min. 35V
D1-D3 3 1N4002 alternativ: 1N400x, bei geringer Last auch 1N4148 möglich
Q1 1 BC 547 alternativ: universal NPN
Q2 1 BD 132 alternativ: BD134, BD136, BD138, BD140 PNP
R1,R2 2 4,7 K
R3 1 24 K
R4 1 56 K
R5 1 220
R6 1 10 K
U1 1 7812
U2 1 NE555
U3,U4 2 7805
U5 1 7905
U6 1 PC817

J1: Die Spannungsversorgung erfolgt über Vin mit mindestens 14V (bis 30V) oder – wenn verfügbar – über Vin12V mit konstanten 12V (dann können U1, D1 und C1 entfallen).

J2: An Vcc liegen 5V konstant an. Mit Vswitch werden die Versorgungsspannungen an J3 geschaltet. PWR_good zieht einen Arduino-Eingang mit 10 K Pullup auf Masse, wenn -5V zur Verfügung stehen.

J3: Hier liegen alle Versorgungsspannungen geschaltet an. Vdd_switched (12V), Vcc_switched (5V) und Vbb_switched (-5V), wenn Vswitched auf High (Vcc) gelegt wird (kann mit einem Jumper erfolgen). An Vcc liegen 5V konstant an.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.