⏪ | Zurück zur Hauptseite |
Im Vorwege sei vermerkt, dass das ein "gewachsenes" Projekt ist. Die Struktur des Projekt und die Verteilung der Aufgaben in die Klassen ist nicht optimal. Außerdem gibt es eine Reihe von Verbesserungsideen für eine nächste Version.
Arduino-IC-Tester: Code für das Arduino-Programm Grafiken: Bilder der erfassten ICs IC-DB: Klassen für IC-Stammdaten IC-Tester: Hauptprogramm IC-Tester-Controls: Steuerelemente IC-Tester-Help: Verzeichnis für Sandcastle Help File Builder UrsComPortExtension: Klassen für den Zugriff auf Com-Ports Arduino-IC-Tester.sln: Solution für das Arduino-Programm IC-Tester.exe - Verknüpfung: Zum einfachen Aufruf des kompilierten Programms IC-Tester.ico: Icon für das PC-Programm IC-Tester.sln: Solution für das PC-Programm |
Das Gesamtprojekt teilt sich in zwei Solutions auf, eine für den Arduino-Code (Arduino-IC-Tester) und eine für den PC (IC-Tester).
Das Arduino-Programm übersetzt die Aufträge, die vom PC kommen in Schaltanweisungen für die MCP23017 bzw. in Transferpakete für die I²C-Schnittstelle und sendet die Testergebnisse zurück zum PC.
Das Hauptprogramm Arduino-IC-Tester.ino analysiert die eingehenden Auftragspakete und leitet sie an die entsprechenden Klassen weiter.
Aufwändig ist die Übersetzung der Pin-Nummer des zu testenden IC in die des ZIF-Sockels und die Bits der MCP23017-GPIO-Bänke. Die Methode TestIcClass::getZifPin berechnet aus der IC-Pin-Nummer die ZIF-Pin-Nummer.
Berechnung des ZIF-Pins [1..28] aus IC-Pin [1..NumberOfPins] (Werte mit ‚#‘ am Ende: 1-basiert, sonst 0-basiert; Beispiel anhand eines 14-poligen IC)
Untere Pin-Leiste:
Variable | Berechnung | Beispiel |
---|---|---|
IC-Pin# | - | [1...7] |
Index | IC-Pin# - 1 | [0..6 = 0... (NumberOfPins / 2) - 1] |
ZIF-Pin# | IC-Pin# | [1...7] |
ZIF-Pin | Index | [0...6] |
Obere Pin-Leiste
Variable | Berechnung | Beispiel |
---|---|---|
IC-Pin# | - | [8...14 = (NumberOfPins / 2) + 1 ... NumberOfPins] |
Index | IC-Pin# - 1 | [7...13 = (NumberOfPins / 2) ... NumberOfPins -1] |
ZIF-Pin# | 28 - NumberOfPins + IC-Pin# | [22...28 = 28 - NumberOfPins/2 + 1 ... 28] |
ZIF-Pin | 28 - NumberOfPins + Index | [21...27 = 28 - NumberOfPins/2 ... 27] |
Aus dem ZIF-Pin muss das passende Bit in der passenden GPIO-Bank beim passenden MCP23017 ermittelt werden.
ZIF-Pin# | ZIF-Pin | #MCP | Pin | Maske | ZIF-Pin# | ZIF-Pin | #MCP | Pin | Maske | |
---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 1 | GPA7 | 0x80 | 15 | 14 | 2 | GPB5 | 0x20 | |
2 | 1 | 1 | GPA6 | 0x40 | 16 | 15 | 2 | GPB4 | 0x10 | |
3 | 2 | 1 | GPA5 | 0x20 | 17 | 16 | 2 | GPB3 | 0x08 | |
4 | 3 | 1 | GPA4 | 0x10 | 18 | 17 | 2 | GPB2 | 0x04 | |
5 | 4 | 1 | GPA3 | 0x08 | 19 | 18 | 2 | GPB1 | 0x02 | |
6 | 5 | 1 | GPA2 | 0x04 | 20 | 19 | 2 | GPB0 | 0x01 | |
7 | 6 | 1 | GPA1 | 0x02 | 21 | 20 | 1 | GPB7 | 0x80 | |
8 | 7 | 1 | GPA0 | 0x01 | 22 | 21 | 1 | GPB6 | 0x40 | |
9 | 8 | 2 | GPA7 | 0x80 | 23 | 22 | 1 | GPB5 | 0x20 | |
10 | 9 | 2 | GPA6 | 0x40 | 24 | 23 | 1 | GPB4 | 0x10 | |
11 | 10 | 2 | GPA5 | 0x20 | 25 | 34 | 1 | GPB3 | 0x08 | |
12 | 11 | 2 | GPA4 | 0x10 | 26 | 25 | 1 | GPB2 | 0x04 | |
13 | 12 | 2 | GPA3 | 0x08 | 27 | 26 | 1 | GPB1 | 0x02 | |
14 | 13 | 2 | GPA2 | 0x04 | 28 | 27 | 1 | GPB0 | 0x01 |
Zur besseren Übersicht ist das PC-Programm in vier Namensräume / Projekte aufgeteilt. Hinzu kommt das Projekt für den Sandcastle Help File Builder:
Nahezu alle Felder und Methoden sind mit einer Code-Dokumentation versehen. Eine fertig erstellte Hilfedatei (IC-Tester-Help.chm) findet man im Verzeichnis IC-Tester-Help/Help.
Das folgende Diagramm zeigt die wesentliche Klassen für Stammdatenverwaltung der ICs.
Die Klasse IcDefs verwaltet eine Liste von IC-Definitionen (IcDefinition). Neben den üblichen Listenfunktionen stehen Methoden zur Serialisierung (SaveToFile) und Deserialisierung (ReadFromFile) in und aus einer Datei zur Verfügung. Die Serialisierung erfolgt über einen DataContractSerializer in Form einer XML-Datei.
Die Kenndaten eines einzelnes ICs werden in der Klasse IcDefinition zusammengefasst. Wesentlich sind die Pin-Definition (PinDefinition), die im Feld Pins hinterlegt ist. Für die einzelnen Pin-Typen (Type) gibt die Enumeration PinType die Werte vor. Die Bedeutung der Werte ist in der Anleitung erklärt. Sie außerdem sind mit Attributen versehen:
Die durchzuführen Testschritte werden in der Liste TestSet verwaltet. Beim Testschritt wird festgelegt, welche Werte an die Input-Pins der Testfassung angelegt werden sollen und was die Erwartungswerte bei den Output-Pins sind. Außerdem können I²C-Testdaten hinterlegt werden (Felder I2cXmitData und I2cXmitString). Die Kommunikation dazu mit dem Arduino ist Kapitel Datenaustausch erläutert.
Um das Hauptprogramm etwas übersichtlicher zu gestalten, wurden viel Oberflächenelemente als Controls ausgeführt. Dazu gibt es eine Reihe von Enumerationen und Event-Handlern. Z.T. wurden Standardsteuerelemente erweitert. Die Details dazu findet man ausführlich in der Hilfe-Datei.
Das Projekt IC-Tester ist das Start-Projekt, Main das Startfenster. Es dient zur Verwaltung der IC-Definitionen. Das Form IcTesterForm führt den Test des ICs durch. Der Testprozess erfolgt im Hintergrund über einen BackgroundWorker (TestWorker), damit die Oberfläche reaktiv bleibt. TestWorker meldet den Testfortschritt über Ereignisse, die dann im IcTesterForm angezeigt werden.
IcTesterForm öffnet außerdem ein Fenster (TestEditor in IC-Tester-Controls), indem die einzelnen Testschrittdefinitionen angezeigt werden. Es ist an die Lebensdauer des IcTesterForm gebunden, d.h. es wird automatisch geöffnet und geschlossen. Eingaben können in dieses Fenster nicht gemacht werden.