Hallo zusammen,
also ich habe folgendes Problem, ich will über den Parallelport ein VFD (Vacuum Flourescence Display) betreiben. Was das Ausgeben einzelner Zeichen angeht, habe ich keine Probleme damit. Schlechter sieht es aus, wenn ich versuche das Display zu konfigurieren. Das klappt einfach nicht. Ich verwende als Betriebssystem Linux. bei python benutze ich das modul ioport für die low-level-Programmierung.
Ich denke mal das Problem liegt darin, dass ich irgendwas beim Adressieren des Displaykontrollers falsch mache.
z.b. um das Zeichen "p" auszugeben setze ich das write bit mit outb(0x2,basisadresse+2)
auf 0 und übergebe dann dem Kontroller mittels outb(113,basisadresse) den Code für das Zeichen "p", anschliessend setze ich das write bit wieder auf 1 mit outb(0,basisadresse+2)
das klappt wunderbar. Es funktioniert auch,wie oben bescgrieben mit einem byte grossem Steuerbefehl problemlos. Anderst sieht es aus wenn ich versuche die Display-helligkeit zu verändern.
Dazu wird in der Dokumentation der Code 1FH 58H n (n steht für die Helligkeitsstufe 1-8) angegeben
wie kann ich dem Kontroller einen solchen Befehl übergeben. Hat irgend jemand eine Ahnung.
Ich habe schon das ganze Web abgesucht, aber leider nirgends etwas entsprechendes gefunden.
Programmieren eines VFD Display's
-
- User
- Beiträge: 5
- Registriert: Samstag 9. September 2006, 13:03
Denken ist ein komplexer Vorgang, welcher nicht jeder sein Eigen nennen kann.
Hast Du es schon einmal auf einer "höheren Ebene" versucht, also einfach die Daten an `/dev/irgendwas` ausgeben, wobei `irgendwas` wahrscheinlich `lp0` oder `lp1` sein wird?
Und für den Parallelport gibt's auch noch pyparallel.
Und für den Parallelport gibt's auch noch pyparallel.
-
- User
- Beiträge: 5
- Registriert: Samstag 9. September 2006, 13:03
Ein problem des Python moduls ist es eher nicht, da die ein byte grossen Befehle ja funktionieren. Es ist eher ein Problem des Ablaufes, wie adressier ich was zuerst, beziehungsweise wie realisiere ich das Source mässig in python.
Ueber die Linux Schnittstelle /dev/lp0 habe ich es bis jetzt noch nicht probiert, werde ich noch nachholen. Pyparallel bringe ich bei meinem System nicht zum laufen, da Distutils auch nicht funktioniert. Aber trozdem danke für den Tip.
Ueber die Linux Schnittstelle /dev/lp0 habe ich es bis jetzt noch nicht probiert, werde ich noch nachholen. Pyparallel bringe ich bei meinem System nicht zum laufen, da Distutils auch nicht funktioniert. Aber trozdem danke für den Tip.
Denken ist ein komplexer Vorgang, welcher nicht jeder sein Eigen nennen kann.
Was heisst `distutils` funktioniert nicht? Die meisten Distributoren packen das in ein eigenes Paket `python-dev` oder `python-devel`. Und bei `pyparallel` könnte es sein, das man einen C Compiler installiert haben muss.
Wenn Du direkt über die Ports gehst, dann programmierst Du letztendlich einen Treiber nach, den es beim Betriebssystem schon geben sollte.
Wenn Du direkt über die Ports gehst, dann programmierst Du letztendlich einen Treiber nach, den es beim Betriebssystem schon geben sollte.
-
- User
- Beiträge: 5
- Registriert: Samstag 9. September 2006, 13:03
Soviel ich weiss wird Pyparallel mittels Python Skript installiert, welches ein Zusatzprogramm namens Distutils aufruft und bei welchem ich eine Fehlermeldung bekomme. Darum kann ich dieses modul nicht verwenden. Aber jetzt ne andere Frage, was soll bei programmierung eines Harwareportes im höheren Level einfacher sein als in low level, ich muss genau die gleichen befehle aufrufen wie bei der low level variante. Ich kann auch bei pyparallel nicht einfach meine Command code 1FH 58H n eingeben, das würde zum genau gleichen Ergebnis führen wie jetzt, nähmlich keinem. Aber um sicher zu sein versuche ich pyparallel nochmals bei mir zu installieren.
Denken ist ein komplexer Vorgang, welcher nicht jeder sein Eigen nennen kann.
-
- User
- Beiträge: 5
- Registriert: Samstag 9. September 2006, 13:03
Ich habe mir mal das how to von pyparallel angesehen dort werden daten mittels
>>> p = parallel.Parallel() #open LPT1
>>> p.setData(0x55)
ausgegeben
das ist das selbe wie
bei ioport
>>> ioport.ioperm(schnittstelleadress, 3,1)
>>> outb(0x55, schnittstellenport)
Aber eben soweit funktionierts ja, das Problem ist wie gebe ich einen Command Code wie 1FH 58H n wobei (n= 1 - über diesen Ausgabebefehl outb() oder auch zur Vollständigkeit mittels p.setData() bei pyparallel aus??
>>> p = parallel.Parallel() #open LPT1
>>> p.setData(0x55)
ausgegeben
das ist das selbe wie
bei ioport
>>> ioport.ioperm(schnittstelleadress, 3,1)
>>> outb(0x55, schnittstellenport)
Aber eben soweit funktionierts ja, das Problem ist wie gebe ich einen Command Code wie 1FH 58H n wobei (n= 1 - über diesen Ausgabebefehl outb() oder auch zur Vollständigkeit mittels p.setData() bei pyparallel aus??
Denken ist ein komplexer Vorgang, welcher nicht jeder sein Eigen nennen kann.
Es würde helfen wenn Du auch verrätst welche Fehlermeldung da kommt.brainstorm hat geschrieben:Soviel ich weiss wird Pyparallel mittels Python Skript installiert, welches ein Zusatzprogramm namens Distutils aufruft und bei welchem ich eine Fehlermeldung bekomme.
Nein natürlich musst Du nicht die gleichen Befehle aufrufen. Sonst wäre es ja nicht auf einer höheren Ebene. Über den Schnittstellentreiber solltest Du einfach die Bytes rausschreiben können. Probier mal auf einer Konsole folgendes:Aber jetzt ne andere Frage, was soll bei programmierung eines Harwareportes im höheren Level einfacher sein als in low level, ich muss genau die gleichen befehle aufrufen wie bei der low level variante.
Code: Alles auswählen
echo 'Hallo' > /dev/lp0
Code: Alles auswählen
display = open('/dev/lp0', 'wb')
display.write('Hallo')
display.write('\x1fX\x04') # Mittlere Helligkeit
display.close()
Das ist nicht das selbe. Bei `pyparallel` werden die Daten über den ppdev Treiber vom Kernel ausgegeben, bei `ioport` sprichst Du den Port direkt selbst an.Ich habe mir mal das how to von pyparallel angesehen dort werden daten mittels
>>> p = parallel.Parallel() #open LPT1
>>> p.setData(0x55)
ausgegeben
das ist das selbe wie
bei ioport
>>> ioport.ioperm(schnittstelleadress, 3,1)
>>> outb(0x55, schnittstellenport)
Nur um mal das offensichtliche auszuschliessen: Du hast natürlich schon versucht die drei Bytes nacheinander einfach auszugeben!?Aber eben soweit funktionierts ja, das Problem ist wie gebe ich einen Command Code wie 1FH 58H n wobei (n= 1 - Cool über diesen Ausgabebefehl outb() oder auch zur Vollständigkeit mittels p.setData() bei pyparallel aus??
-
- User
- Beiträge: 5
- Registriert: Samstag 9. September 2006, 13:03
Ich habe das Problem gelöst. Ich muss um einen mehr byte grossen Code auszugeben folgendermasen vorgehen:
(ioport)
1. ioport.ioperm(Basisadresse,3,1) Schnittstelle benutzbar machen
2. ioport.outb(0,Basisadresse) Datenregister auf Null
3. ioport.outb(0x2, Basisadresse+2) Write auf low (Steuerregister)
4. ioport.outp(0x1F,Basisadresse) erstes Byte des Befehls auf Datenregister
5. ioport.outb(0,Basisadresse+2) Write auf high
6. ioport.outb(0, Basisadresse) Datenregister auf low
Schritt 3 bis 6 für jedes byte wiederholen.
Der Fehler lag darin, dass ich nach dem write auf high legen das Datenregister nicht auf Null zurückstellte. Tja da kann ich nur sagen aus Fehler lernt man.
Vielen Dank für deine Hilfe.
(ioport)
1. ioport.ioperm(Basisadresse,3,1) Schnittstelle benutzbar machen
2. ioport.outb(0,Basisadresse) Datenregister auf Null
3. ioport.outb(0x2, Basisadresse+2) Write auf low (Steuerregister)
4. ioport.outp(0x1F,Basisadresse) erstes Byte des Befehls auf Datenregister
5. ioport.outb(0,Basisadresse+2) Write auf high
6. ioport.outb(0, Basisadresse) Datenregister auf low
Schritt 3 bis 6 für jedes byte wiederholen.
Der Fehler lag darin, dass ich nach dem write auf high legen das Datenregister nicht auf Null zurückstellte. Tja da kann ich nur sagen aus Fehler lernt man.
Vielen Dank für deine Hilfe.
Denken ist ein komplexer Vorgang, welcher nicht jeder sein Eigen nennen kann.