Velleman PCS500 Oszi-Plugin

Funktionsprinzip.

Eine der vielen Ausleseroutinen in PCS500.exe sieht so aus.

Sicherlich ist ein Velleman PCS64i so ähnlich gestrickt. Dafür gibt es QtDSO für Linux. Für sigrok liegen keine Plugins vor.

Für den Betrieb der Originalsoftware (PCS500.exe) unter 64-Bit-Windows mit echten Parallelport wird ein 64-Bit-Treiber benötigt. Dass es überhaupt möglich ist, einen solchen zu implementieren, habe ich am 9. April 2015 herausgefunden. Besser spät als nie: Noch nie hat irgendwer weltweit dokumentiert, dass es auch unter 64-Bit-Windows die gleiche IOPM gibt wie unter 32-Bit-Windows. Damit sind auch hier Portzugriffe vom User-Mode aus möglich. Was für die Originalsoftware unbedingt erforderlich ist; das Umlenken von Exceptions in den Kernel-Mode für jeden einzelnen Portzugriff mittels meiner inpout32.dll erwies sich als zu langsam.

USB-Adapter

Der USB-Adapter muss Eigenintelligenz aufweisen und erfordert spezielle Auslesesoftware, etwa o.g. Oszi.exe mit geeignetem Plugin. Dieser generische USB-Parallel-Konverter wäre unerträglich langsam.

Eine PIC16F1454 ist dafür geradezu maßgeschneidert, mit den folgenden Vorteilen gegenüber jeder anderen mir bekannten Lösung:

Nachteil: Der Anschluss des Funktionsgenerators PCG10 oder K8016 ist damit nicht möglich! Dazu bräuchte man doch ein paar mehr Pins. Die Lösung ist ein größerer PIC16F1459, siehe unten.

Durchsteck-Bauteile

Veraltet

Der Schaltplan ist ziemlich simpel. Das Fußvolk besteht aus gerade mal 3 Stützkondensatoren.

 
Schaltplan und Layout. Der um 5° gedrehte DIL-Schaltkreis ermöglicht große Leiterzugbreiten und -abstände
Entflechten mit folgender Pinzuordnung:
USB-PinSubD-PinLPT-SignalPCS500-SignalPIC-PortPIC-PinPIC-PinPIC-PortPCS500-SignalLPT-SignalSubD-PinUSB-Pin
1 (rot)6-9,14 D4-D7Strom für OptokopplerUCC114GNDGNDGND18-25 4 (schwarz)
5D3StrobeBA5 (Ausgang)213D+3 (grün)
4D2StrobeAA4 (Ausgang)312D-2 (weiß)
11 BUSY-MCLR / UPP411UUSBKondensator 1 µF nach GND
3D1SCLKC5 (Ausgang)510C0 (Eingang)A = Nibble-Bit 0ERR15
2D0SDATAC4 (Ausgang)69C1 (Eingang)B = Nibble-Bit 1ONL13
10ACKD = Nibble-Bit 3C3 (Eingang)78C2 (Eingang)C = Nibble-Bit 2PE12
(In der Mitte der Tabelle kann man sich die PIC vorstellen.)

Die Pinzuordnung der Nibble-Bits ist so gestaltet, dass die PIC-Software das Nibble direkt verarbeiten kann und nicht mit Einzelbits herumhantieren muss. Denn hier ist Geschwindigkeit erforderlich, um das 4-KByte-Datenpaket zügig zum USB zu senden.

Obwohl DIL-Mikrocontroller am liebsten in einer Fassung sitzen, passen Fassung und Controller nicht mehr ins Gehäuse, sind zu hoch. Die passende Lösung hierfür sind Einzelbuchsen, die zum eingelöteten Chip nur etwa 1 mm addieren. Dazu schlachtet man eine IC-Fassung (bricht aus einer Fassung mit gedrehten Kontakten die Einzelkontakte heraus) und lötet diese in entsprechend große, idealerweise durchkontaktierte Löcher.

In-System-Programmieranschlüsse, erfordert nur SubD-Adapter, dadurch Verzicht auf gesonderten Programmieranschluss. Am PCS500 ist der Anschluss für MCLR = Pin 11 der SubD-Buchse unbeschaltet.

Oberflächenmontage

Einfaches Entflechten nach dem Motto: Software vereinfacht Hardware: ul-pic2. Hier wurde ein 10-µF-Keramikkondensator vorgesehen, um komplett bei SMD zu bleiben, daher kein Elko. Die minimalen Leiterzugbreiten und -abstände wurden mit riesigen 0,5 mm festgelegt. Auch hier wird ausgenutzt, dass das Pin 11 der SubD-Buchse des PCS500 unbeschaltet ist. Damit erfolgt die Steuerung von MCLR ausschließlich durch einen Programmieradapter, und man kann mit Low-Voltage-ICSP™ zugreifen. Ein interner MCLR-Pullup sorgt für stabile Potenzialverhältnisse.
 
Schaltplan und Layout. Der einseitige Entwurf benötigt gerade mal 3 Stück Draht

Die Bits sind in der Firmware einzeln einzulesen, in etwa so:

readbyte:
	clrf	tmp
	call	readnibble	;High-Nibble einlesen
	swapf	tmp,f
readnibble:			;Low-Nibble einlesen
	btfss	PORTC,2
	 bsf	tmp,0		;gleich invertieren
	btfss	PORTA,5
	 bsf	tmp,1
	btfss	PORTA,4
	 bsf	tmp,2
	btfss	PORTC,5
	 bsf	tmp,3
	bcf	PORTC,1		;auf Low-Nibble umschalten
	return			;Takte zum Warten auf
				;Optokoppler 6N136: ≥1 µs
readall:
	movlwf	0x20,cnthi
	clrf	cntlo
readloop:
	call	readbyte
	movfwf	tmp,usb_pipe
	bsf	PORTC,1
	btfsc	PORTC,0
	 goto	ch2
	bcf	PORTC,0
	goto	ch1
ch2:	bcf	PORTC,3		;Zähler-Takt
	bsf	PORTC,0
	bsf	PORTC,3
ch1:	wait_until_usb_is_ready
	decfsz	cntlo
	 goto	readloop
	decfsz	cnthi
	 goto	readloop
	return

Die SMD-Lösung erspart das Bohren von Löchern. Mit Löchern sieht's nur schöner aus. Dazu eine simple Ätzmaske als gespiegelte 600-dpi-Bitmap. Zur Kontrolle die Platinenmaße: 35 × 28 mm².

Die USB-Lötanschlüsse sind in „chaotischer“ Reihenfolge. Bei farblich genormten Anschlusskabeln ist die Farbreihenfolge von oben nach unten weiß – grün – schwarz – rot.

Unterstützung des Funktionsgenerators

Der Nachteil der beiden o.a. Lösungen mit PIC16F1454 ist, dass daran kein Velleman-Funktionsgenerator PCG10 oder K8016 angeschlossen werden kann. Der Entwurf mit PIC16F1459 (ca. 2 €) hat diesen Nachteil nicht. Erkauft wird diese Erweiterung mit engeren und schmaleren Leiterzügen, jeweils 0,4 mm.

 
Schaltplan und Layout. Der einseitige Entwurf benötigt 5-6 Stück Draht

Dazu wieder simple Ätzmasken als gespiegelte 600-dpi-Bitmap. Zur Kontrolle die Platinenmaße: 35 × 28 mm². Normalerweise wird nur die Oberseite benötigt; der Luxus einer doppelseitigen Platine erfordert immerhin 7 Durchkontaktierungen und damit 7 Stück Draht.

Im Gegensatz zum vorherigen Entwurf sind die USB-Lötanschlüsse in „genormter“ Reihenfolge, wie beim USB-Stecker. Bei farblich genormten Anschlusskabeln ist die Farbreihenfolge von oben nach unten rot – weiß – grün – schwarz.

Aufbau

Die Leiterplatten-Layouts sind mit Bedacht gestaltet:

Ein externer DC/DC-Wandler 5 V → 12 V kann den PCS500 außerdem noch mit potenzialgetrenntem Strom versorgen; dann ist's jedoch nicht mehr USB-konform, was den Stromverbrauch angeht. Besser wäre es, die interne Stromversorgung auf potenzialgetrennte 5 V umzurüsten (d.h. einen Transverter einzubauen) und auf die Energie verbratenden Längsregler zu verzichten. (Diese können eingebaut bleiben und ermöglichen die wahlweise Speisung.) Der Transverter speist sich dabei vom Pin 6. Für ein feldmäßiges Notebook-Oszi die einzige Chance ohne Strom auszukommen. Genial dabei ist die dennoch wirksame Potenzialtrennung zum Messobjekt.

Der Adapter ist so gebaut, dass das Programmieren mittels Low-Voltage-ICSP™ über den Parallelportstecker „von hinten“ möglich ist, ein gesonderter ISP-Stecker (auf der Leiterplatte) bleibt so erspart. Für die Massenfertigung braucht man nur einen Adapter mit 25-pol. SubD-Stecker wie folgt:

Anschluss ans Parallelport zum Programmieren, für PICPgm

Zur Inbetriebnahme der Firmware ist (wie bei mir so üblich) der LPT-Tester nützlich, den man einfach solo oder zwischen dem Adapter und dem PCS500 gesteckt betreiben kann.

Firmware

Die Mikrocontroller-Firmware benutzt die im Bastelbereich kaum oder nie verwendete USB-Geräteklasse USB-TMC, Klasse 0xFE, Unterklasse 0x03, Protokoll 0x00. Windows hält dafür keinen Standardtreiber vor, aber es kann der Agilent USB-TMC-Treiber installiert werden, der ausbtmc.sys heißt.

Genauso wie bei USB-CDC dienen zwei schnelle Bulk-Pipes zum bidirektionalen Datenaustausch. Von Vorteil ist, dass man keine COM-Portnummer einstellen muss, die Firmware etwas einfacher ist und sich auch unter Windows 98/2k mit HID als zweites Interface kombinieren lässt. (Da gab es Probleme, USB-CDC mit anderen USB-Funktionen zu kombinieren.) HID allein ist für den Sampledatentransfer zu knapp, begrenzt die Datenrate auf 64 KByte/s, das wären 8 Bilder/s bei kompletter Sampledatenübertragung.

Die USB-VID+PID wurde bei Microchip „geordert“, für dieses Projekt wurde USB\VID_04D8&PID_EFDA zugewiesen. Sie wird auch dann benötigt, wenn wie hier Standard-Treiber verwendet werden.

Interessant: Steckt man den Adapter mit der halbfertigen Firmware an einen PC mit installiertem LabVIEW 2010, gibt es nach der erfolgreichen Treiberinstallation einen Bluescreen, verursacht von ausbtmc.sys. Egal ob Protokoll 0x00 (USBTMC) oder 0x01 (USB488). Stülpt man die Treibersoftware von Keysight (oben) als Update darüber, läuft alles glatt; mehr noch, es startet NI SignalExpress. Da jedoch die Firmware noch keinen SCPI-Befehl verarbeitet, geht es vermutlich nicht weiter.

Derzeit, seit 2019, läuft die Entwicklung in eine ganz andere Richtung: Mit WebUSB kann ein Browser die Oszilloskopfunktion übernehmen, sogar ein Smartfon. Javascript ist mittlerweile schnell genug zur Quasi-Echtzeit-Darstellung, und man kann sich das Original-Windowsprogramm sonstwohin stecken.

TODO-Liste