 |
 
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
|
 |

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.
|
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.
|
 |