Forum: Projekte & Code Low-Cost Parallelport-DA/AD-Wandler und Funktionsgenerator


von nobody0 (Gast)


Angehängte Dateien:

Lesenswert?

Bei der Entwicklung braucht man gelegentlich einen
Funktionsgenerator um ein einfaches (niederfrequentes digitales) Signal
wie
die TTL-Pulse einer Lichtschranke zu simulieren, weil die Hardware
nicht
immer vefügbar ist oder nicht in den Raum passt (z. B.
Schaufelradbagger).
Dafür braucht man nicht extra einen mehr oder minder teuren
Funktionsgenerator sondern nur einen Stecker für den Parallelport, 8
330 Ohm-Widerstände (+ irgendein Anschluß-Kabel und Lötzinn), also
um zwei Euro, und ein kleines Programm zum Ansteuern. Das spart nicht
nur Geld sondern auch Platz und Strom.
Die Widerstände werden einfach zwischen dem Ausgang und jeden Datenpin
gelötet. Damit hat man einen ganz einfachen 3-Bit-DA-Wandler, der
kurzschlußfest ist und nur rund 50 Ohm Ausgangswiderstand hat (41 Ohm
von
den Widerständen, um 10 Ohm vom Parallelport selbst).

Die Ansteuerung per Software (Programm parda.c) ist sehr einfach:
Nachdem der Parallelport in den Schreib-Modus versetzt wurde, werden
einfach Bytes über
die Daten-Pins ausgegeben. 0xff (=255) bedeutet 100 % (alles an), 0
bedeutet 0 (aus), 0x0f (=15) bedeutet 50 % usw..
Von parda.c werden einfache Rechteck-Pulse produziert, deren Amplitude
mit dem zweiten Parameter vorgegeben wird.

Wichtig ist dabei der erste Parameter; wenn der falsch ist, wird
irgendwo
anders (evtl. Bios oder IDE-Controller oder ...) hingeschrieben, so
dass man damit vorsichtig sein sollte. Der Wert 888 ist aber
problemlos, wenn man den onboard-Parallelport im Bios nicht verstellt
hat. Bei einer PCI-Karte muß man mit lspci -vvv die Basis-Adresse
raussuchen (oder die entsprechenden PCI-Funktionen in den Sourcecode
reinschreiben).

Man kann mit wenig Aufwand auch komplizierteres wie Sinus-Kurven
ausgeben und die Frequenz abhängig von der Tages-Zeit oder
komplizierterem machen oder über eine Web-Seite steuern und auch
mehrere Parallelports gleichzeitig, z. B. über Posix-Threads und
Parallelport-PCI-Karten, ansteuern.
Hier zwei Bilder von meinem 3-Bit-DA-Wandler, den ich mit großen
Lüsterklemmen, die auch Bananenstecker aufnehmen können, verwende;
einmal ohne und einmal mit Gehäuse:

http://random.linux-site.net/files/unsorted/par/par_0.jpg

http://random.linux-site.net/files/unsorted/par/par_1.jpg

Die Leitungen/Widerstände in dem metallisierten Gehäuse sind einfach
mit
Gewebe-Klebeband isoliert.
Durch die 1 %-Widerstände sollte das Signal halbwegs genau
DA-gewandelt
werden (relativ zu den 3 Bit Auflösung entsprechend 12,5 %
Genauigkeit),
aber weil ich bisher nur einen Kanal mit TTL-Pulse brauchte, habe ich
das
nicht überprüft.
Zudem hängt die Ausgangssignal-Amplitude vom konkreten Parallelport
und
dem Netzteil ab. D. h. ob der Parallelport in TTL oder CMOS realisiert
ist und welche Spannung auf der 5 V-Leitung des ATX-Netzteils ist.

Wenn man nur TTL-Pulse braucht, kann man statt nur einen Ausgang pro
Parallelport natürlich auch 8 verwenden und wenn man die Kontroll-Pins
hinzu
nimmt, kommt man auf 12 Ausgänge pro Parallelport.

Die andere Richtung, also das Einlesen (Programm parad.c) ist
einfacher, weil dort keine Spannungsteilung erfolgt. Dadurch hat man
aber auch nur 1-Bit-AD-Wandlung, also eigentlich nur einen digitalen
Eingang.
Nutzt man jeden Eingang, also auch die Status-Pins, und die auch
separat,
so kommt man auf 13 Eingänge pro Parallelport.

Die angehängten kleinen Beispiel-Programme (für PC + Linux) können
leicht auf andere Plattformen portiert werden.

von nobody0 (Gast)


Angehängte Dateien:

Lesenswert?

Anbei ein Treiber für den Kernel-Space (für Linux), der mit bis zu 500
kHz die Daten wahlweise ausgeben oder einlesen kann.

von nobody0 (Gast)


Lesenswert?

Nachtrag: Die Register und Pins des Parallelports findet man hier:
http://www.linux-magazin.de/Artikel/ausgabe/1999/10/IO/parport_b.gif

Übrigends gibt es auch harte Echtzeit-Anwendungen mit dem
Parallelport:
http://www.linux-magazin.de/Artikel/ausgabe/1998/11/Rtlinux/rtlinux2.html

von Benedikt (Gast)


Lesenswert?

Sowas nennst du harte Echzeit Anwendung ?
Ich habe mal ein Assembler Programm gesehen, das eine Telefonkarte über
den LPT simuliert. Lief allerdings nur unter DOS, da das Timing extrem
kritisch war.

Ich kenne mich mit Linux nicht aus, aber gibt es da keine Interrupts,
die einem das Signal versauen ?

von nobody0 (Gast)


Lesenswert?

Sieh' in den Artikel rein, dann sieht Du daß dort eine ISR verwendet
wird.
Das RT-Linux garantiert eine maximale Latenzzeit; d. h. der Interrupt
wird wirklich schnell abgearbeitet.

Ich habe sowas in meinen Programmen nicht drinn, da die nur mit ganz
billiger Hardware etwas mit den Pins wackeln oder lesen sollen und für
sowas wie Lichtschrankensignal-Simulation braucht man kein allzu
genaues Timing.

von Benedikt (Gast)


Lesenswert?

Was ich eigentich meinte, waren Interrupts und andere Programme.
Du sendest Daten mit 500kS/s an den LPT, aber woher weißt, du dass
nicht ein anderes Programm für einige 10ms dein Programm unterbricht
und so eine Lücke in den Daten entsteht ?

von nobody0 (Gast)


Lesenswert?

Da können Lücken entstehen; wer es lückenlos braucht, der muß eine
Timer-ISR nehmen. Beispielsweise kann man einen Oszillator an den
interruptfähigen Parallelport-Pin anschließen und seinen Code in die
entsprechende ISR packen. Zumindest 32,768 kHz sollte man damit
hinbekommen können.
Die Haupttimer-ISR hat unter Linux defaultmäßig 1 kHz, so dass man ohne
busy waiting bis 500 Hz erreichen kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.