Programmieren eines VFD Display's

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.
Antworten
brainstorm
User
Beiträge: 5
Registriert: Samstag 9. September 2006, 13:03

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.
Denken ist ein komplexer Vorgang, welcher nicht jeder sein Eigen nennen kann.
BlackJack

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.
brainstorm
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.
Denken ist ein komplexer Vorgang, welcher nicht jeder sein Eigen nennen kann.
BlackJack

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.
brainstorm
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.
brainstorm
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 - 8) ü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.
BlackJack

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.
Es würde helfen wenn Du auch verrätst welche Fehlermeldung da kommt.
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.
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:

Code: Alles auswählen

echo 'Hallo' > /dev/lp0
Gegebenenfalls die Gerätedatei anpassen. Wenn Du so den Text auf das Display bekommst, dann kannst Du auch von Python aus einfach Daten an das Display schicken.

Code: Alles auswählen

display = open('/dev/lp0', 'wb')
display.write('Hallo')
display.write('\x1fX\x04')  # Mittlere Helligkeit
display.close()
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)
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.
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??
Nur um mal das offensichtliche auszuschliessen: Du hast natürlich schon versucht die drei Bytes nacheinander einfach auszugeben!?
brainstorm
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.
Denken ist ein komplexer Vorgang, welcher nicht jeder sein Eigen nennen kann.
Antworten