uC News Programmer Apps & More Downloads Info & Shop Contact Forum


Analoginput am parallelen Port

Diese Seite ist speziell für diejenigen Einsteiger gedacht, die mit Analog-Digital-Convertern (ADC) bzw. Digital-Analog-Convertern (DAC) erst einmal am "großen" PC spielen wollen bevor sie das Programmieren einen PICs oder AVRs erlernen.

Der Standard-Drucker-Port des PCs ist dafür ausgelegt, drei Signalgruppen zu verwalten: Die 8-Datenausgangsbits (Portadressenoffset 0), fünf Statusleitungen zum Abfragen des Druckerstatus (Portadressenoffset 1) und weitere vier Ausgangsbits zur Steuerung des Datenflusses (Portadressenoffset 2).

Modernere Varianten können die Datenausgabebits auch als Eingang verwenden, dies ist jedoch gerade für den Einsteiger nicht einfach zu durchschauen und wird auch nicht von allen Rechnern geboten.Aus diesem Grund und um den Aufwand gering zu halten sowie um auf Microcontroller (uCs) übertragbare Erfahrungen zu erlangen, werden hier daher nur Bausteine mit einem seriellen Datenbus behandelt. Bei einer seriellen Übertragung werden die Datenbits nicht gleichzeitig über jeweils eine eigene Leitung transportiert, sondern eines nach dem anderen über eine einzige Leitung. Wie beim Drucker werden
auch hier noch zusätzliche Leitungen zur Steuerung des Datenflusses benutzt (synchrone Übertragung), im Gegensatz zur seriellen Schnittstelle des PC die mit einer einzigen Leitung zur Datenübertragung auskommt (asynchrone Übertragung). Letztere ist aber nur in Verbindung mit einem uC zu erreichen weshalb wir auf dieser Seite asyncrone Bausteine verwenden. Diese haben i.d.R. 2 Steuerleitungen (Eingänge) und einen Datenein- bzw. ausgang. Manche Bausteine haben auch beides zur Einstellung von Arbeitsparametern.


Ein einfacher ADC

Nun zur Praxis. Wir wollen nun einen analogen Wert am Parallel-Port erfassen. Zur Wandlung verwenden wir den TLC 549 von Texas Instruments (Link auf Datenblatt). Dieser Baustein liefert den gemessenen Analog-Wert in einer Auflösung von 8 Bit über ein serielles Interface. Außerdem ist dieser Baustein sehr klein (DIP-8-Gehäuse), sehr preiswert, leicht zu beschaffen und er kommt mit extrem wenigen externen Bauelementen aus.

Der TLC 549 (= IC 1) wird direkt an den Parallel-Port angeschlossen: CS (Pin 5) an D0 (PP-Pin 2), CLK (Pin 7) an D1 (PP-Pin 3) und der Ausgang Dout (Pin 6) an Busy (PP-Pin 12).Die beiden Eingänge für die Referenzspannung liegen auf Masse

(GND) für die untere (Pin 3) und Vcc für die obere (Pin 1) Grenze. Damit wird der Messbereich auf 0..5 Volt festgelegt - er darf nie größer sein als die Versorgungsspannung.
Zwischen GND (Pin 4) und Vcc (Pin 8) liegt noch ein kleiner Kondensator (=C 1) mit 100 nF - dieser soll Störungen bei IC 1 vermindern.
Das analoge Signal wird mittels eines Spannungsteilers bestehend aus zwei Widerständen erzeugt. Der erste Widerstand (= R 1) ist fest auf etwa 1 K-Ohm, der zweite (= R m) ist der Sensor, also beispielsweise ein LDR (= lichtabhängiger Widerstand) oder ein NTC bzw. PTC (= temperaturabhängiger Widerstand) oder einfach ein Poti. Ändert sich dieser Widerstand, so ändert sich auch die analoge Spannung welche an Pin 2 vom

Schaltplan: TLC 549 am Parallel-Port


ADC gemessen und als Digital-Signal zur Verfügung gestellt wird.

Die +5 Volt (= Vcc) bekommt man entweder von Joystick- ,Tastatur- oder USB-Port oder von einem externen Netzteil. Bei letztem ist zu beachten, daß GND des Netzteils ebenfalls mit den übrigen Massepunkten verbunden werden muss!


Nun zur Software; diese Funktion liefert den konvertierten Wert zurück:

unsigned int TLC549(void)
              {
              unsigned int bit,analog,lpt;
              
               lpt    = 0x378;				// Adresse vom 1. Parallelport
               analog = 0;				// Rueckgabewert loeschen 
               outp(lpt,inp(lpt)&0xfe);			// CS-Signal aktivieren
               delay(2);					// und Setup-Time abwarten   
               for (bit=0;bit<8;bit++)			// Jetzt die 8 Bits abholen
                {
                 analog=analog<<1;			// Alte Bits weiterschieben 
                 if ((inp(lpt+0x01)&0x20)!=0) analog|=0x01;	// und neues Bit ggf. setzen 
                 outp(lpt,inp(lpt)|0x02);			// Clock auf '1'   
                 delay(1);					// etwas warten 
                 outp(lpt,inp(lpt)&0xfd);			// Clock wieder auf '0' 
                 delay(1);
                }
               outp(lpt,inp(lpt)|0x01);			// CS wieder deaktivieren  
               delay(18);					// und sicherstellen, dass  
               return(analog);				// Wandlung ausgefuehrt wird
              }
             

Was bei dem kleinen C-Programm noch zu beachten ist: Es liefert immer den Wert der vorhergehenden Wandlung zurück (siehe Datenblatt). Will man also den aktuellen Wert ermitteln, so muss man die Routine 2 mal hintereinander aufrufen und den ersten Wert verwerfen.

Die Delay-Routine könnte man noch optimieren: Sie wartet jetzt Millisekunden, nötig wären aber nur Microsekunden - wer größtmögliche Geschwindigkeit braucht, hat hier also noch etwas zu tun!

Der TLC 1549 ist die 10-bit-Variante.

Er läßt sich genauso verwenden wie der TLC 549, nur dass er 10 statt 8 Ergebnisbits zurückliefert.


 Stand: 15.05.2003
© 1998-2003 by G.Müller 
 


Diese Seite darf nicht von diesem Server kopiert werden, weder auf ein anderes elektronisches Medium noch auf irgend eine andere Weise. Einzige Ausnahme stellt ein Ausdruck zum Zwecke des Nachbaus dar. Dieser darf nur für rein private Hobbyzwecke erfolgen, jedlicher kommerzieller Einsatz ist untersagt. Der Autor und die Betreiber dieses Servers übernehmen keinerlei Haftung für die Folgen von Bau und Einsatz des oben beschriebenen Geräts. Alle eventuell erwähnten Markennamen gehören ihren jeweiligen Eigentümern. Für Hinweise auf Fehler und Mißbrauch ist der Autor dankbar.