Forum: Mikrocontroller und Digitale Elektronik LPT an Mikrocontroller


von Thomas (Gast)


Lesenswert?

Hallo,

ich möchte den Druckerport meines PC mit einem Mikrocontroller 
(atmega32) verbinden.
Dabei möchte ich nur eine einziges Bit an Information von dem Computer 
an den Mikrocontroller weitergeben (1 und 0).

Ich möchte das so lösen, dass ich ein Pin des LPTs auf high, bzw. low 
schalte,
der Mikrocontroller soll das jeweils registrieren.


Ich habe mich ein wenig über Mikrocontroller und über LPT informiert und 
bin in der Lage einen Taster an den Mikrocontroller anzuschließen: Da 
wird ja im Prinzip zwischen einen Pin und GND ein Taster angeschlossen. 
So ähnlich stelle ich mir das auch vor, aber da der LPT ja zu einem 
anderen Stromkreis wie der Mikrocontroller gehört, kann ich das nicht 
genauso machen.


Wie kann ich den LPT mit möglichst wenig Aufwand mit dem Controller 
verbinden, so dass der PC quasi ein Bit zu dem Controller schicken kann.
Natürlich soll möglichst kein RIsiko bestehen, dass meine 
LPT-Schnittstelle kaputt geht.

Thomas

von Tobias P. (hubertus)


Lesenswert?

Den LPT halte ich dafür nicht für ideal.
Ich würde dazu lieber RS-232 nehmen, da du ja nur ein einziges Datenbit 
übertragen willst. Der RS-232 Port hat sogenannte Handshake-Leitungen 
(RTS, CTS, DSR und DTR). Zwei davon kann man per Software ein- und 
ausschalten (ist ein bisschen weniger aufwendig, dafür ne eigene 
Software zu basteln. Windoow stellt zum setzen des RTS- oder DSR-Signals 
die Funktion SetCommState()* zuer verfügung).
Allgemein musst du, wenn du Signale zwischen zwei verschiedenen 
Stromkreisen austauschen willst, die beiden Massen der Stromkreise 
verbinden. Wenn das nicht erwünscht ist, muss ein Optokoppler 
dazwischen.
Bei der RS-232 musst du übrigens aufpassen:
Logisch 1 wird durch -3..-25V und logisch 0 durch +3..+25V dargestellt. 
Du musst also noch eine Schutzschaltung für deinen Mikrocontroller 
basteln, damit der keine Spannung > 5V sieht (bzw. 3.3V halt, je nach 
Mikrocontroller).

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Ja, lieber ein wenig proggen und RS232 benutzen! LPT ist max. für 
Programmer was... od. sonstige Applikationen...

von holger (Gast)


Lesenswert?

Ich würde auch RS232 nehmen. Für LPT braucht man bei NT/XP
einen Porttreiber (giveio.sys z.B.). Bei Vista kanns mit LPT
evtl. richtig eklig werden.

von Tobias P. (hubertus)


Lesenswert?

Wenn man mit C++ programmiert, gibts ein hübsches Include-File, das eine 
Funktion zum beschreiben der Ports und lesen derselbigen anbietet. Wenn 
man dann noch die IO-Adresse vom LPT kennt, kann man damit locker ein 
baar Bits setzen und abfragen. Aber man muss halt C++ können.

Übrigens ist mir noch ein weiterer Vorteil eingefallen, den die RS-232 
bietet: RS-232 ist relativ robust; der Strom ist auf 20 mA begrenzt 
(jedenfalls sollte er das sein). Beim LPT gibts keine interne 
Schutzvorrichtung; der soll auch sonst sehr empfindlich sein. Also 
einmal was falsch angeschlossen und dein Port ist hin.... Darum: lieber 
RS-232, dort macht auch ein Kurzschluss nichts (ich rede aus Erfahrung 
;)).

von Thomas (Gast)


Lesenswert?

Danke für eure Antworten.
Ich wollte den LPT eigentlich mit Delphi programmieren (unter vista): 
Dazu habe ich das hier gefunden: 
http://www.tech-ecke.de/index_quereinstieg.htm?/delphi/inpout32_dll.htm

Aber wenn ihr denkt, dass es mit RS-232 leichter ist, dann werde ich das 
so lösen.
Ich möchte übrigens 2 Schrittmotoren und 2 Servos ansteuern. Deshalb 
wollte ich ich die Schrittmotoren mit einer einfachen Schaltung direkt 
an den LPT anschließen und den Mikrocontroller für die Servos 
benutzen(die Servos sollen nur 2 Positionen anfahren).

Wenn es einfacher ist das ganze mit RS-232 und der seriellen 
Schnittstelle unter vista mit delphi zu machen, werde ich die Motoren 
alle an den Controller  anschließen und den Controller an die serielle 
Schnittstelle.


Kennt jemand den Code mit dem ich mit Delphi den Mikrocontroller über 
RS-232 (über die serielle Schnittstelle) ansteuern kann?

Danke,
Thomas


PS: Noch eine Frage: Spricht was dagegen eine serielle Schnittstelle 
durch einen USB-Adapter zu "erschaffen"?

von Tobias P. (hubertus)


Lesenswert?

Die Frage ist jetzt halt was du genau tun willst.
Wenn du  wie gesagt nur ein einziges Bit übertragen willst - also eine 
Leitung programmgesteuert entweder auf 1 oder 0 setzt, dann würde ich 
persönlich dafür eine der Handshake-Leitungen nehmen (siehe oben). Du 
kannst aber gleich Nägel mit Köpfen machen und den Mikrocontroller mit 
der Datenleitung der RS-232 verbinden. Da kannst du dann mit einem 
einfachen Terminalprogramme Dateien oder Tastatureingaben simpel mittels 
3 Drähten an den Mikrocontroller übermitteln, und der kann dann sogar 
eine Antwort darauf zurückgeben.
Delphi ist kein Problem, dort ist sowas auch machbar.

Übrigens: USB zu seriell Adapter würde ich nicht verwenden. 
Unzuverlässig, hält sich oft nicht an die Standards... es ist einfach 
ein gebastel. Besser du nimmst eine richtige, saubere RS-232.

von Thomas (Gast)


Lesenswert?

Da ich beide Motorarten an einer Schnittstelle haben will, bleibt mir ja 
eigentlich fast nichts anderes übrig als den Mikrocontroller mit der 
Datenleitung des RS-232 zu verbinden.

Wie kann man ein Terminalprogramm mit Delphi programmieren? Gibt es 
ddazu in Internet irgendwelche Anleitungen/Tutorials?


Danke,
Thomas

von Tobias P. (hubertus)


Lesenswert?

Du brauchst keines zu programmieren. Windoof stellt dir HyperTerminal 
zur Verfügung, welches zwar ein bisschen popelig daherkommt, aber für 
den Anfang durchaus ausreichend ist. Wenn du allerdings ein anständiges 
Terminalprogramm ohne viel schnickschnack willst, kannst du TeraTerm Pro 
verwenden oder ein beliebiges anderes Terminalprogramm deiner Wahl (hier 
im Forum hat jemand mal was selber gemachtes Namens hTerm gepostet).

von Thomas (Gast)


Lesenswert?

Aber ich möchte eigentlich ein Programm schreiben, dass in der Lage ist 
die Motoren zu steuern. Wenn ich ein fertiges Terminal benutze, müsste 
ich ja alle Sachen selber eingeben und das möchte ich vermeiden.

Es muss doch eine einfache Möglichkeit geben, mit dem Computer 
Programmgesteuert Servos und Schrittmotoren anzusteuern.

Danke nocheinmal,
Thomas

von Tobias P. (hubertus)


Lesenswert?

ja gibt es.
Die Windows-Shell stellt 3 funktionen dazu zur Verfügung:

CreateFile, ReadFile und WriteFile.

Um ganz simpel mal ein paar Bytes zu senden, machst du folgendes:

Mittels CreateFile öffnest du eine imaginäre Datei mit dem Namen 
"\\.\COM1". Die Funktion liefert ein Handle zurück, das auf den Com-Port 
zeigt (Handle = Zeiger). Nun kannst du mittels WriteFile und diesem 
Handle deine Bytes ausgeben. Eingelesen wird mit ReadFile.
Und nun siehst du auch schon das Problem: Du kannst nicht immer wissen, 
wann deine Daten reinkommen, sprich wann du ReadFile aufrufen musst. Das 
mit einem Interrupt so zu autmatisieren, dass ankommende Bytes nicht 
verloren gehen, ist relativ kompliziert. Ich selber hab es nur halbwegs 
geschafft (auch nur halbherzig versucht), dann habe ich mir eine fertige 
Lib gesucht, die sowas kann. Evtl findest du auf Codeproject.com ein 
bisschen Hilfe (ist allerdings für C++).

von Thomas (Gast)


Lesenswert?

Mh, aber wenn ich mit diesem Programm nur senden möchte, dann müsste das 
doch einfach sein, oder?

Wenn ich einfach mit writefile den text "Servo1bewegen" schicke, dem 
Mikrocontroller bekannt ist, was er bei Eingang von diesem Text machen 
soll, müsste das doch schon reichen, um einen einz9gen Servo 
anzusteuern, oder?

Vielen, vielen Dank,
Thomas

von Tobias P. (hubertus)


Lesenswert?

Ja wenn du nur Text senden willst ist das total simpel. Dazu reichen 10 
Zeilen Code. Naja, wenns ne GUI-Anwendung sein soll vielleicht eine, 
zwei Zeilen mehr ;)

von Thomas (Gast)


Lesenswert?

Ja,
nur Text sollte doch ausreichen. Man programmiert in den Mikrocontroller 
dann einfach eine Schleife rein, in der ständig abgefragt wird: Wenn 
ankommender Text=Servo1bewegen, dann bewege den Servo
oder so ähnlich :=), oder?

Thomas

von Tobias P. (hubertus)


Lesenswert?

Genau so wird das gemacht.

Du musst halt dann einfach noch einen Mikrocontroller haben, der einen 
UART besitzt (siehe z.B. AVR-Tutorial). Und einen Pegelconverter 
brauchts auch noch. Der soll aus den +3..25V eine logische 0 und aus 
-3..-25V eine logische 1 machen. Umgekehrt soll er am Ausgang natürlich 
die enstprechenden Pegel haben, wenn der Mikcotontroller was senden 
will.
Zum verdrahten brauchst du dann nur noch RxD, TxD und GND. ACHTUNG: TxD 
vom PC geht natürlich auf RxD vom Controller! Was der PC sendet soll der 
Controller ja empfangen ;) Und umgekehrt - TxD vom Controller an RxD vom 
PC.
Aber das war dir klar, schätze ich.

von Thomas (Gast)


Lesenswert?

Äh, entschuldigung, dass ich nochmal nachfrage:

Ich wollte mir das eigentlich ganz einfach machen, einen atmega32 über 
den IC Max232 direkt mit dem UART verbinden. So wie hier beschrieben 
ist:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART

Wenn ich das so mache, wofür brauche ich dann einen Pegelconverter?

Thomas

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Thomas wrote:

> Wenn ich das so mache, wofür brauche ich dann einen Pegelconverter?

Der Max232 ist der Pegelkonverter und dafür da, damit aus den 0/5V (TTL) 
die genormten +/- 10V (RS232) entstehen!

von Tobias P. (hubertus)


Lesenswert?

@thomas:
lies nochmal meinen letzten post.

von Thomas (Gast)


Lesenswert?

Oh. Tut mir Leid, dass das alles so lange gedauert hat.
Aber das scheint also alles zu sein:


Ich muss einfach diese Schaltung aus diesem Tutorial nach bauen, und 
kann dann mit einem einfachen Delphicode Text zu dem Controller 
schicken.

Und das ist alles! Habe ich das alles so richtig verstanden?


Vielen Dank, für eure ganzen Mühen,

Thomas

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Thomas wrote:

> Ich muss einfach diese Schaltung aus diesem Tutorial nach bauen, und
> kann dann mit einem einfachen Delphicode Text zu dem Controller
> schicken.
>
> Und das ist alles! Habe ich das alles so richtig verstanden?


Kommt drauf an welchen Controller du benützen willst... bei AVR's geht 
das nicht so einfach über UART die Programme runterzuspielen...

EDIT: Sorry... µC überlesen... Mega32... da brauchst du eine eigene 
Schaltung zum Programmieren...

von Tobias P. (hubertus)


Lesenswert?

@Jürgen:
Er will ja keine Programme laden, sondern nur mit dem Controller 
kommunizieren. Das geht, soviel ich weiss, auch mit dem popeligsten 
AVR-UART. Oder?
Ich weiss halt nicht, ich verwende keine AVRs ;)

von Thomas (Gast)


Lesenswert?

Ich meine natürlich, dass auf dem Controller schon ein Programm ist, das 
ständig einen ankommenden Text von dem UART erwartet und dann 
abgleicht...

Dann sollte das doch funktionieren mit Delphi den Text an die 
Schaltung(vgl. Tutorial) zu schicken, so dass die dem Mikrocontoller 
auch erreicht.

So ist jetzt alles richtig?

von Tobias P. (hubertus)


Lesenswert?

Jap, alles richtig.
Frohes Coden ;)

von Thomas (Gast)


Lesenswert?

Danke!!

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.