Autor |
Vorhandenes(?) neu erfinden? LPT-Port Steuerung |
|
|
|
|
BID = 168870
rt1970 Gelegenheitsposter
Beiträge: 56
|
|
Hallo!
Habe folgendes Problem:
Ich möchte 8 Relais über den LPT-Port steuern.
Das wäre kein Problem.
Aber:
Diese Relais sollen auch per Schalter gesteuert werden!
Und: der Zustand des Schalters soll im Programm angezeigt werden.
Da fangen die Probleme an! Also Daten zwischenspeichern - umschalten auf Input und Abfrage des Schalters.
Hat jemand evtl. eine Schaltung parat???
Vielen Dank im voraus! |
|
BID = 168999
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Zitat :
| Hat jemand evtl. eine Schaltung parat??? |
Nö, oder denkst du, jeder hat hier eine Schaltung, die du gerade haben willst?
---
Ein Ansatz: Der LPT-Port ist ja bidirektional. Du kannst also per AND-Gatter entweder per Port oder per Schalter die Relais schalten, in deinem Programm auf das Offset deines LPTs 3 Werte hochzählen und dann das Byte, das du dann bekommst, in deine 8 Relais-Zustände umrechnen. Du bräuchtest bloß eine geeignete Logik (Tristate), die abwechselnd die Zustände der Relais/Schalteran den Computer sendet und die Relais schaltet. (sollte Programmgesteuert sein). Mit welcher Sprache wolltest du dein Programm schreiben und kennst du dich mit Bytes & Co. aus?
Latches brauchst du auf jeden Fall. (Jedenfalls bin ich darauf gekommen, nachdem ich nicht so viel darüber nachgedacht hatte.)
Es gibt sicherlich andere Möglichkeiten.
Vielleicht fällt dir ja noch was ein.
Der Port hat 4 Steuerausgänge, 5 Steuereingänge und 8 bidirektionale Datenleitungen. Damit lässt sich schon einiges anfangen.
_________________
|
|
BID = 169123
rt1970 Gelegenheitsposter
Beiträge: 56
|
Warum so ruppig?
Hab doch nur gefragt!
Ok. Deine Idee ist mir schon klar.
Programmiert wird mit VB.
Mein Problem ist im Moment
1. einen Schaltkreis zu finden, der die 8-bit Daten für die Zeit der Abfrage der Zustände der Relais zwischenspeichert und
2. einen Schaltkreis zu finden, der 8 Tristate Ausgänge besitzt zum senden der Daten an den PC
DonComi: Danke für Deine Bemühungen!
|
BID = 169132
Her Masters Voice Inventar
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5308 Wohnort: irgendwo südlich von Berlin
|
guck dir mal den 74ls573 an, vielleicht macht der ja schon was du willst. 8-fach Latch mit Tri-State Ausgängen.
_________________
Tschüüüüüüüs
Her Masters Voice
aka
Frank
***********************************
Der optimale Arbeitspunkt stellt sich bei minimaler Rauchentwicklung ein...
***********************************
|
BID = 169815
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
[quote]Warum so ruppig?
Hab doch nur gefragt!
[quote]
War nicht so gemeint.
---
Ja, der 74xx573 dürfe das richtige sein.
Da du offensichtlich den bidirektionalen Weg nimmst, und ich das auch so gemacht hätte, musst du zur Steuerung dann dein Steuerbus benutzen.
Zum Beispiel: (Programm)
1. Senden der Werte für die Relais
2. Der Steuerausgang "1" geht auf HIGH und latcht somit die Daten (ist folglich am Clockeingang des Latches)
3. Der geht wieder auf LOW, die Daten sind gespeichert und schalten dann (über Transistoren) die Relais.
4. Jetzt setzt du einen anderen Steuerpin "2" auf HIGH und die Daten der Schalter / Relais werden an den Computer gesendet. Dazu liegen sie einfach an einem Tristate-Bustreiber an. (74xxx244). Diese Daten kommen zwar auch an die Dateneingänge des D-Latches, aber er speicher nicht, weil er am Takteingang auf LOW ist.
Diese ganze Prozedur wiederholen.
Wenn du mit VB schreibst, dürftest du Zeiteinbüßungen in Kauf nehmen. Denn es geht alles permanent. (Geht aber gut mit einem Timercontrol, dessen Intervall auf 10ms gesetzt ist)
Ich habe da auch mal ein Programm in VB geschrieben, mit dem man explizit jeden Pin setzen/löschen kann (für die Ausgänge) und jeden Eingang einlesen kann. (Auch permanent = Polling) Es ist aber leider auf eine von mir gebastelte Hardware abgestimmt und deswegen nicht pin-genau (also nicht in der richtigen Reihenfolge). Ich habe aber auch noch eine DLL geschrieben, die in der richtigen Reihenfolge ist. Beides unterstützt bidirektional.
Wenn du willst lade ich es mal hoch.
Ich mal auch noch mal einen ungefähren Schaltplan, damit du siehst, was ich meinte...
_________________
|
BID = 169824
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
So, ich habe mal gemalt. So oder ähnlich kann man das machen. Die Puffer mit Tristate gehören zum 244er.
Man kann es bestimmt auch noch anders machen, aber das ist eine Möglichkeit. Die beiden Steuerpins (14 und 16) sind jetzt so gewählt, du kannst aber auch Pin#1 oder Pin#17 nehmen.
_________________
|
BID = 170168
rt1970 Gelegenheitsposter
Beiträge: 56
|
Wow! Danke für die schnelle und umfangreiche Hilfe!
Der 573er hats gebracht!
Meine Schaltung sieht nun so aus:
Hoffe es kommt an...
Ansprechen kann ich die Relais prima in VB aber auslesen nicht. Muß ich nicht irgendein Bit setzen, um den Port zum lesen zu bewegen?
|
BID = 170253
Dracos-Carazza Gesprächig
Beiträge: 185
|
um vom lpt datenregister zu lesen, muss im status register (standart 890) das 5 bit gesetzt sein. in basic hieß das früher dann OUT (890),32
greetz Carazza
_________________
Es ist nicht deine Schuld, dass die Welt ist wie sie ist, es ist nur deine Schuld wenn sie so bleibt !
Wer seinen Trieb verleugnet, verleugnet das was ihm zum Menschen macht !
|
BID = 170259
rt1970 Gelegenheitsposter
Beiträge: 56
|
vielleicht sollte ich noch erwähnen, daß ich die INPOUT32.DLL benutze.
Dracos-Carazza: Ist hex 37a, richtig? Bringt auch nichts.
Kann den Port abfragen und der liefert mir den letzten Status den ich über out gegeben habe.
|
BID = 170313
Dracos-Carazza Gesprächig
Beiträge: 185
|
ja 37A ist richtig, ich habe jetzt die daten für den 74SN573 im kopf, aber wie gehts du da auf den port drauf ?? denn einfach nen hi signal auf den pin legen geht nicht, du muss ihn mit ground kurzschließen um ihn als eingang zu nutzen.
man setzt den port auf 255, wenn man nun das erste bit kurzschließt, und dann den status abfragt bekommt man asl ausgabe 255-2^0=254. so geht das beim datenregister des lpt, und nicht anders. zum kurzscließen hab ich immer ne transe genommen, nen treiber mit O.C. sollte aber auch funzen.
greetz Carazza
_________________
Es ist nicht deine Schuld, dass die Welt ist wie sie ist, es ist nur deine Schuld wenn sie so bleibt !
Wer seinen Trieb verleugnet, verleugnet das was ihm zum Menschen macht !
|
BID = 170322
rt1970 Gelegenheitsposter
Beiträge: 56
|
Der LPT muß erst auf 255 gesetzt werden??
Wozu dann Register 5 bei LPT-Adr+2?
Angeblich wird doch bei 1 der Ausgang hochohmig geschaltet und der Zustand gespeichert?
Ich versuchs mal.
Den 2. 573er für die Ansteuerung des LPT werd ich besser ersetzen.
Hast recht, brauch dafür kein Tri-State. OC wäre besser. Hast Du einen IC im Kopf, der 8 bit mit Open Collector und Chip Select?
Hab es grad getestet: den LPT-D0 über 100 Ohm nach Masse Bit 5 gesetzt und abgefragt:
Out &H37A, 32
Out &H378, 255
Text9.Text = Inp(&H378)
= 255 = Kein Erfolg!
Traue mich nicht, den Port direkt ohne R nach Masse zu schalten.
Achja, mein LPT1 ist auf ECP gestellt und läuft unter Windows XP.
[ Diese Nachricht wurde geändert von: rt1970 am 6 Mär 2005 15:51 ]
[ Diese Nachricht wurde geändert von: rt1970 am 6 Mär 2005 16:04 ]
|
BID = 170360
Dracos-Carazza Gesprächig
Beiträge: 185
|
Zitat :
| Traue mich nicht, den Port direkt ohne R nach Masse zu schalten. |
gerade DAS musst du aber machen, wenn du die status pins des LPT (akk etc) nimmst geht das auch über nen widerstand (glaube bis max 6k). beim daten register muss es aber direkt auf masse gehen. keine panik, der lpt nimmt keinen schaden, da der durch eine strombegrenzung gesichert ist. ich hatte meinen lpt damals glaub ich auf EPP 1.7 eingestellt, bin mir aber echt nicht sicher, eventuell einfach mal verschiedene einstellungen testen.
greetz Carazza
_________________
Es ist nicht deine Schuld, dass die Welt ist wie sie ist, es ist nur deine Schuld wenn sie so bleibt !
Wer seinen Trieb verleugnet, verleugnet das was ihm zum Menschen macht !
|
BID = 170450
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Es wird überhaupt nix funktionieren, wenn du im BIOS nicht EPC/EPX oder so ähnlich einstellst. Es müssen diese beiden sein, sonst ist der Port nicht bidirektional. Es muss auch kein 5. Bit gesetzt werden, dass ist so weit ich weiß nur Interrupt EIN/AUS.
Wie ich sagte, auf's Offset einfach mal 3-4 Werte draufzählen, vorher das Byte 255 senden und dann mal aus Freude am Leben einen Pin mit Masse verbinden. Wenn du deinen Port +3 permanent (z.B. mit Timer, interval=10) im mer ausfragt und das Byte immer in ein Labelcontrol schreibst, dann wirst du sehen, wie es sich verändert. Wenn du jetzt das Byte in 8 Bits zerlegts, kannst du ganz einfach jeden Relais/Schalter-Zustand auslesen.
Nachtrag: Bespiel
Private Sub tmr_Timer() 'Timerevent
lblBytevalue.Caption = Inp(888 + 3) 'Basisadresse +3 (oder auch 4,5,6)
End Sub
oder
Private Sub tmr_Timer()
lbldecimalvalue.Caption = cBits(Inp(offset + 3)) 'Binär anzeigen, benötigt Funktion cBits
End Sub
_________________
[ Diese Nachricht wurde geändert von: DonComi am 6 Mär 2005 20:26 ]
|
BID = 170474
Dracos-Carazza Gesprächig
Beiträge: 185
|
so ich hab nochmal die seitet raus gesucht mit der ich damals meine probleme gelöst habe.
http://www.beyondlogic.org/spp/parallel.htm
funktioniert bei mir ohne probleme.
greetz Carazza
_________________
Es ist nicht deine Schuld, dass die Welt ist wie sie ist, es ist nur deine Schuld wenn sie so bleibt !
Wer seinen Trieb verleugnet, verleugnet das was ihm zum Menschen macht !
|
BID = 178033
rt1970 Gelegenheitsposter
Beiträge: 56
|
Danke Euch allen!
Also: jetziger Stand:
Es funktioniert einwandfrei, wenn ich den Parallelport auf Bidirektional stelle.
Setze dann addr+2 Bit 5 und ich kann auslesen.
Aber wenn ich ECP oder EPP nehme kann ich keine Daten auslesen...
Werde jetzt noch mal den Interrupt ein/aus testen.
Liegt es evtl. an Windows XP?
|