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
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).
Ja, lieber ein wenig proggen und RS232 benutzen! LPT ist max. für Programmer was... od. sonstige Applikationen...
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.
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 ;)).
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"?
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.
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
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).
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
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++).
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
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 ;)
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
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.
Ä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
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!
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
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...
@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 ;)
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?
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.