pyParallel - Auslesen eines Registers

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
alfadas
User
Beiträge: 11
Registriert: Montag 3. März 2008, 13:18

pyParallel - Auslesen eines Registers

Beitragvon alfadas » Montag 17. März 2008, 13:51

Ich habe vor mit pyParallel zu arbeiten. Hierbei möchte ich nur ein Signal auslesen, welches von der parallelen Schnittstelle gesendet wird. Hierzu ist es also "nur" nötig ein bestimmtes Register auszulesen, doch da stellen sich mir als Neuling die Fragen:

Welche Register mit welcher Adresse?
Wie lese ich sie aus?



hat irgendjemand eine Idee?^^
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 18. März 2008, 11:30

Hast du dir die pyParallel-Doku und ggf. -Beispiele mal angesehen? Weißt du, auf welcher Leitung du das Signal erwartest? Dann kannst du entsprechend herausfinden, wie pyParallel dir den Zugriff darauf erlaubt (so sind z.B. die Attribute[?] anhand des Einsatzzweckes im Druckerbereich benannt, wenn ich mich recht erinnere).

Ich hatte bei meinem ersten und bisher letzten Projekt damit allerdings einige Probleme. Wie ich kürzlich herausfand oder mir wieder ins Gedächtnis rief, habe ich wohl ignoriert, dass bei einigen der Leitungen 0 und 1 in der Bedeutung vertauscht sind.
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Beitragvon Toni83 » Dienstag 18. März 2008, 12:44

Hier mal die Möglichkeiten von pyparallel Signale zu empfangen:

Code: Alles auswählen

    def getInError(self):
        """Error pin"""
        return _pyparallel.inp(self.statusRegAdr) & 0x08 and 1

    def getInSelected(self):
        """select pin"""
        return _pyparallel.inp(self.statusRegAdr) & 0x10 and 1

    def getInPaperOut(self):
        """paper out pin"""
        return _pyparallel.inp(self.statusRegAdr) & 0x20 and 1

    def getInAcknowledge(self):
        """Acknowledge pin"""
        return _pyparallel.inp(self.statusRegAdr) & 0x40 and 1

    def getInBusy(self):
        """input from busy pin"""
        return not (_pyparallel.inp(self.statusRegAdr) & 0x80)

Allerdings kann daraus nur maximal ein 5-bittiges Datenwort eingelesen werden, für höhere Genauigkeiten eignet sich dann pyserial.
Um das Shannon´sche Abtasttheorem bzw. Nyquist nicht zu verletzen und die Reaktionszeit der Anordnung zu erhöhen würde ich aber auf eine C-Implementation des Sachverhalts plädieren. Dieser Snippet kann dan einfach mit SWIG in dein bestehendes Python-Programm eingebunden werden.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 18. März 2008, 13:16

Toni83 hat geschrieben:Hier mal die Möglichkeiten von pyparallel Signale zu empfangen:

Code: Alles auswählen

    def getInError(self):
        """Error pin"""
        return _pyparallel.inp(self.statusRegAdr) & 0x08 and 1

    def getInSelected(self):
        """select pin"""
        return _pyparallel.inp(self.statusRegAdr) & 0x10 and 1

    def getInPaperOut(self):
        """paper out pin"""
        return _pyparallel.inp(self.statusRegAdr) & 0x20 and 1

    def getInAcknowledge(self):
        """Acknowledge pin"""
        return _pyparallel.inp(self.statusRegAdr) & 0x40 and 1

    def getInBusy(self):
        """input from busy pin"""
        return not (_pyparallel.inp(self.statusRegAdr) & 0x80)

Allerdings kann daraus nur maximal ein 5-bittiges Datenwort eingelesen werden, für höhere Genauigkeiten eignet sich dann pyserial.

Hallo Toni83!

???

Die Daten stehen im Datenregister das aus 8 Bit besteht. Diese oben aufgezeigten Signale stellen "nur" die Statussignale dar, die z.B. bei der Druckeransteuerung zur Synchronisierung der Datenübertragung und für Fehlersignale verwendet werden. Was mir bei pyParallel fehlt, ist die Möglickeit auf das Datenregister lesend zuzugreifen. Schreiben kann man ja.

Ich persönlich würde mich nicht lange mit pyParallel aufhalten und sofort nach "(ich weiß nicht mehr -- habe es in einem anderen Topic empfohlen)" umschwenken.

Und was hat pySeriell mit pyParallel zu tun? Damit kann man die Serielle Schnittstelle und nicht die Parallele Schnittstelle auslesen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Beitragvon Toni83 » Dienstag 18. März 2008, 13:43

Hallo Gerold,

Nachdem der Beitrag von alfadas sich bei dem Thread "Python und Sensoren" auf das empfangen von Sensordaten mit Hilfe von Python bezog und ich angenommen habe, dass er das selbe Problem in seinem eigenen Beitrag diskutieren wollte, habe ich ihm hier Möglichkeiten gezeigt, wie man Daten über das parallele Port empfangen kann. Dabei ging ich davon aus, das der Mikrocontroller direkt mit der Schnittstelle verbunden werden soll. Das hat dann rein gar nichts mit dem Drucker zu tun. Er kann ja über diese Leitungen Signale vom Mikrocontroller empfangen wie er grad lustich ist. Für Echtzeit würde ich aber sowieso auf andere Schnittstellen ausweichen.
Das mit pyserial war nur als ein alternativer Vorschlag zu pyparallel gedacht.[/quote]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 18. März 2008, 14:43

Toni83 hat geschrieben:Dabei ging ich davon aus, das der Mikrocontroller direkt mit der Schnittstelle verbunden werden soll. Das hat dann rein gar nichts mit dem Drucker zu tun.

Hallo Toni83!

Nichts für Ungut. Das kommt nur weil wir so wenig Informationen von alfadas erhalten. Jetzt verstehe ich dich. Du hast ihm eine Lösung präsentiert, mit der er zumindest fünf Pins des Parallelports auslesen kann und ich dachte immer, dass er alle acht Datenleitungen benötigt.
In einem seiner Beiträge schrieb er, dass er den Parallelport nehmen *müsse* und darauf keinen Einfluss hat. Also ging ich davon aus, dass der Mikrocontroller-Programmierer eine parallele (8 Bit) Schnittstelle zum Computer vorgibt. Anscheinend funktioniert bei alfadas der Treiber für den Zugriff auf den Parallelport. Jetzt braucht er nur noch eine Python-Schnittstelle, die nicht nur schreibend, sondern auch lesend auf das Datenregister zugreifen kann. pyParallel kann man sicher mit ein wenig mehr Wissen erweitern. Aber einfacher wäre es, wenn man gleich eine Python-Schnittstelle nimmt, die auch lesen kann. Ich habe mir den Quellcode von winioport.py angesehen und konnte dort Funktionen zum Auslesen des Datenregisters finden. Diese habe ich in einem anderen Topic bereits bekannt gegeben. Jetzt muss alfadas nur noch den alten Treiber deinstallieren, den neuen installieren und mit diesem arbeiten. -- Und uns am Laufenden halten.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 18. März 2008, 15:02

Durch die Umstellung des Druckerports auf ECP und/oder EPP stehen manche Leitungen dann auch für In und Out zur Verfügung. Da sollte für viele Anwendungen genug dabei sein.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]