Motivation
In meiner Bastelkiste liegen viele Integrierte Schaltungen (IC) herum. Neue unbenutzte, schon
einmal in einem Projekt benutzt, ausgelötet, … Aber funktionieren die noch?
Die meisten sind Logik-ICs. Die sollte man doch mit einem μC einfach testen können.
Übersicht
Mit dem IC-Tester können überprüft werden:
- 5V Logik-IC, wie die aus der SN74xx-Reihe
- Chips mit bis zu 28 Pins (eine entsprechende ZIF-Fassung (Zero
Insertion Force, Nullkraftsockel ) hatte ich noch in
der Bastelkiste)
- Integrierte Schaltungen mit einer I²C-Schnittstelle
- Optokoppler
- ...
Ein Windows-PC dient zur Erfassung der IC-Daten, der Testvorschriften und der Testdurchführung.
Er steuert über die serielle Schnittstelle einen μC an, der für die Einstellung der logischen Pegel
am zu überprüfenden IC sorgt, diese auch wieder ausliest und zurück an den PC sendet. Die eingelesen
Werte werden vom PC mit den Erwartungswerten verglichen.
Einen μC mit genügend I/O-Pins zur Ansteuerung der 28-Pins der ZIF-Fassung habe ich nicht gefunden.
Aber es gibt I/O-Expander, die sich zur Port-Erweiterung nutzen lassen. Mit einem MCP23017 habe ich
schon einmal gearbeitet. Der stellt 16 GPIO zur Verfügung, die per I²C angesteuert werden. Zwei Stück
dieses Typs werden von einem Arduino Nano angesteuert (aber ... s. Verbesserungsideen).
Die Details zu diesem Projekt sind recht umfangreich. Darum habe ich sie auf mehrere Seiten aufgeteilt:
Anleitung
Programmbedienung
I²C-Testsequenzen
Hardware
Schaltung
Implementierung
Datenaustausch zwischen PC und Arduino
Projektstruktur
Download
Die Projekt-Sourcen zum Download (VS 2022, Net 6.0).
Verbesserungsideen / Fehler
Software
- Testschritt-Editor: Bei den Testschritten wäre es sinnvoll, wenn man sie verschieben könnte.
- Die Erkennung, ob Daten geändert wurden, erfolgt nicht immer korrekt.
- Der Speicherort und Name für die Datenbank sind fest codiert, sollten aber eingestellt werden
können, z.B. per Kommandozeilen-Parameter.
- Die Parameter ComPortNameFilter und
ComPortSerialNo sind fest codiert, sollten aber eingestellt
werden können.
- Über die Built-In-LED des Arduino könnte der Betriebszustand angezeigt werden.
- Die IC-Test-Definitionen werden als XML-Datei abgelegt. Dies geschieht mit Hilfe eines
DataContractSerializer. Die XML-Datei benötigt viel Speicherplatz. Vielleicht ist es
sinnvoller einen binäre Speicherform zu wählen. Andererseits ist Speicherplatz von einigen MB
auf modernen Systemen kein wirkliches Problem. Man verliert aber die Möglichkeit die Datenbank
in Augenschein zu nehmen.
Der DataContractSerializer hat
die unangenehme Eigenschaft, dass in der XML-Datei die einzelnen Felder in einer bestimmten Reihenfolge
stehen müssen. Diese ändert sich, wenn die Felder umbenannt werden. Es reicht also nicht, die
Felder in der XML-Datei umzubenennen um sie wieder lesbar zu machen.
- Die Listen besitzen die Länge NumberOfPins. Das bedeutet
immer eine Umrechnung auf die 28 Pins der Testfassung. Dies führt auch zu Problemen, wenn die
Anzahl Pins nachträglich geändert werden muss. Vielleicht ist es einfacher mit einem festen Feld
zu arbeiten.
Hardware
- Der Logik-Pegel HIGH liegt bei 5 V. Die MCP23017 können auch mit 3,3 V betrieben
werden. Den Arduino Nano, (d.h. der ATmega328p als auch der CH340) laufen ebenfalls mit 3,3 V.
Den Arduino umzubauen wird wahrscheinlich etwas zu aufwändig. Da es aber nur fünf Datenleitungen
und die Versorgungsspannung gibt, sollte man über Pegelwandler nachdenken.
- Der MCP23017 ist recht empfindlich was die I²C-Frequenz angeht. Deshalb wurde die I²C-Schnittstelle
für das zu testende IC separat über Software-I²C-Schnittstelle bedient. Die wiederum ist nicht
so exakt wie die Hardware-Schnittstelle. Wahrscheinlich wäre es besser gewesen die SPI-Variante
MSP21S17 zu wählen.
- Der MCP23017 ändert seinen Output für eine Bank direkt nach Empfang des zugehörigen Bytes
über die I²C-Schnitstelle. Daraus folgt, dass die 28 Pins des Testsockels nicht gleichzeitig,
sondern nacheinander in vier Blöcken gesetzt werden ([1..8], [21..28], [9..14], [15..20]). Bei
statischen ICs, wie z.B. einem NAND-Gatter, ist das kein Problem. Bei dynamischen ICs, wie z.B.
einem Flip-Flop, muss darauf geachtet werden, dass das Takt-Signal erst dann erfolgt, wenn die
Datenleitungen den korrekten Wert besitzen. Besser wäre wohl ein I/O-Expander wie den
PCA9698 o.ä.
zu verwenden. Der hat zum einem 40 I/O-Pins und man kann einstellen, dass die Pins erst nach vollständiger
Übertragung aller Bits gesetzt werden. Solch ein Chip (TSSOP56, Raster 0,5 mm) lässt sich
natürlich schwer löten. Bestückte Breakout-Board gibt es. Aber es gibt viele ZIF-Adapter für das
TSSOP56-Format.
- Die Arduino-Pins als auch die Pins des ZIF-Sockels sind mit einer Buchsenleiste
versehen. Dazu gibt es je eine Buchsenleiste für +5V und GND. Das ist nicht gut gelöst. Es ist
nicht möglich, einen z.B. einen Widerstand vom ZIF-Sockel direkt an +5V oder GND zu schalten.
Besser wäre es gewesen, auf jeder Seite des ZIF-Sockels je eine Leiste für beide Potentiale anzubringen.
Dabei sollten gefärbte Buchsenleisten verwendet werden. Also etwa so:
- Die Software-I²C-Schnittstelle ist nur über Pins A0 und
A1 auf der 15-poligen Buchsenleiste neben dem Arduino erreichbar.
Da kann man schnell einmal in das falsche Loch stecken. Besser wäre es, wenn diese Pins separat
von den anderen abgesetzt zur Verfügung ständen und entsprechend gekennzeichnet wären.
Erweiterungen
LED-Test
Funktionieren sie noch, welche Farbe?
Multimeter liefern meist entweder nicht genügend Strom oder eine zu geringe Spannung. Außerdem
erwischt man immer zuerst die falsche Polung.
Mit
Multi-Bauelemente-Testern kann man dies gut machen, hat aber den Nachteil, dass jedes Bauteil nur
einzeln getestet werden kann: Bauteil einspannen, Knopf drücken, warten ...
Mit einem Arduino kann man zwei Pins wechselseitig umpolen. Eine funktionierende LED leuchtet
somit unabhängig von der Polung. Die AVRs haben eine interne Strombegrenzung auf 25 mA, so dass
man noch nicht einmal einen Vorwiderstand benötigt.
Der einfache (standalone) Code:
/*
Name: LED-Test.ino
Created: 21.12.20227
Author: Ulli
*/
bool toggle = false;
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
void loop() {
toggle = !toggle;
digitalWrite(2, toggle);
digitalWrite(3, !toggle);
delay(10);
}