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.
Anbei ein Treiber für den Kernel-Space (für Linux), der mit bis zu 500 kHz die Daten wahlweise ausgeben oder einlesen kann.
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
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 ?
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.
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 ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.