Hallo!
ich würde gerne interessehalber ein SDA5708-Display über den PC (linux)
ansteuern.
Das Display nimmt seriell Daten entgegen, während Load und reset low
sind. Bei jeder steigenden Flanke von sdclk wird der aktuelle zustand,
der am dateneingang liegt in ein register gespeichert, solange bis 8bit
voll sind, dann wird load auf 1 geschaltet und der displaycontroller
wertet die 8-bit, die nun parallel in den registern liegen, aus.
Dafür würde sich die Parallele Schnittstelle am besten eignen, oder?
Jedoch habe ich noch ein verständnisproblem mit der schnittstelle:
Die Parallele Schnittstelle hätte 8 Datenleitungen, dann könnte man ja
eine für load, eine für reset, eine für sdclock und eine für daten
verwenden, oder?
allerdings habe ich dann noch das problem, dass die daten seriell ins
displaycontrollerregister geschrieben werden sollen, jedoch die
parallelschnittstelle beispielsweise eine zahl 101 nur gleichzeitig auf
3 datenausgängen sendet. Es ist also nicht möglich jeden einzelnen
datenausgang der parallelen schnittstelle seriell anzusteuern (also dass
die 101 hintereinander auf nur einen datenausgang anliegen, während die
anderne ausgänge andere sachen senden können), richtig?
Also müsste ich jeden sendezyklus einzeln beschreiben? Wenn man pro
datenbit 2 sendezyklen annimmt, also quasi 16 zeilen
outb(xxxxxxxx,BASEPORT);
wobei beispielsweise das 1.x load darstellen soll, das 2.x sdclk usw?
Nachdem aber Load low-aktiv ist, könnte man nicht einfach anstatt den
datenausgang einen hardwareinvertierten ausgang (z.b. strobe-ausgang)
verwenden?
auf die anderen parallelen-leitungen (busy, strobe, etc) muss ich keine
rücksicht nehmen, weil ich nur in eine richtung (vom pc zum display)
senden will, oder?
Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt, kenne
mich noch nicht so richtig aus ;-)
Viele Grüße
Michael
wurstbonbon schrieb:
> Jedoch habe ich noch ein verständnisproblem mit der schnittstelle:> Die Parallele Schnittstelle hätte 8 Datenleitungen, dann könnte man ja> eine für load, eine für reset, eine für sdclock und eine für daten> verwenden, oder?
Yep.
> allerdings habe ich dann noch das problem, dass die daten seriell ins> displaycontrollerregister geschrieben werden sollen, jedoch die> parallelschnittstelle beispielsweise eine zahl 101 nur gleichzeitig auf> 3 datenausgängen sendet.
Dazu hast du deine load und sdclock Leitungen.
Es ist dann dein Bier ein Byte durch wackel an den ensprechenden Pins in
das Display zu shiften.
> Es ist also nicht möglich jeden einzelnen> datenausgang der parallelen schnittstelle seriell anzusteuern (also dass> die 101 hintereinander auf nur einen datenausgang anliegen, während die> anderne ausgänge andere sachen senden können), richtig?
Richtig.
Aber du kannst ja jedes Datenbit auf der Schnittstelle einzeln
ansteuern. Und wenn du das in der richtigen Reihenfolge machst, dann
werden da dann doch die Bits 'seriell' rausgeshiftet.
> Also müsste ich jeden sendezyklus einzeln beschreiben? Wenn man pro> datenbit 2 sendezyklen annimmt, also quasi 16 zeilen> outb(xxxxxxxx,BASEPORT);> wobei beispielsweise das 1.x load darstellen soll, das 2.x sdclk usw?
Ich versteh jetzt nicht, was du uns hier sagen willst.
> Nachdem aber Load low-aktiv ist, könnte man nicht einfach anstatt den> datenausgang einen hardwareinvertierten ausgang (z.b. strobe-ausgang)> verwenden?
Oder ganz einfach die entsprechende Leitung auf 0 setzen wenn sie 0 sein
soll und auf 1 setzen, wenn sie 1 sein soll.
> auf die anderen parallelen-leitungen (busy, strobe, etc) muss ich keine> rücksicht nehmen, weil ich nur in eine richtung (vom pc zum display)> senden will, oder?
Die interessieren dich nicht mehr die Bohne.
Die parallele Schnittstelle ist dann keine parallele Schnittstelle im
eigentlichen Sinne mehr, sondern für dein Programm eine Möglichkeit, wie
dein Programm gezielt mit ein paar Leitungen Nullen und Einsen auf jeder
der Leitungen erzeugen kann. Was diese Nullen und Einsen bedeuten und in
welcher Reihenfolge sie geschaltet werden, obliegt einzig und alleine
deinem Programm. Da mischt sich dann niemand mehr rein.
Danke! Das hat mir sehr stark geholfen! Ein wenig habe ich nun schon
rumexperimentiert, dabei ist folgender C-Code herausgekommen, welcher im
Prinzip funktionstüchtig sein müsste.
Leider habe ich im Moment das Display nicht zur Hand und habe deshalb
die Ausgabe nicht auf den parallelport geschrieben, sondern als
textausgabe, quasi zum händischen debuggen. die printfs werden später
durch outb() ersetzt.
Hier mal quasi nur der teil, der den control-register ansteuert (die
anderen teile für adress-register und zeilen-register wären ähnlich).
ohne dass ihr jetzt groß in die thematik einsteigt, ist das guter code?
wie könnte man ihn grob verbessern?
übrigens, die wait-befehle fehlen noch an diversen stellen ;)
Hi
mit outb() wirst du unter Linux nicht viel Erfolg haben. Direkte
Hardwarezugriffe sind unter ernst gemeinten PC-Betriebssystemen nicht
möglich. Schau dich mal nach /dev/parport* um. Damit sollte es gehen.
Matthias
Hallo
inzwischen funktioniert die Ansteuerung ganz gut, siehe Bild.
Mein userspace-programm kam übrigens mit outb() zurecht, allerdings
benötigte es die anweisung
1
ioperm();
sonst gabs einen seg fault
Falls jdm interesse am code hat kann ich ihn hochladen, noch ist er aber
nicht perfekt.
viele Grüße
wurstbonbon schrieb:> Mein userspace-programm kam übrigens mit outb() zurecht, allerdings> benötigte es die anweisung> ioperm();
Besser wäre aber, statt dem ioperm-Gefrickel gleich das parport-Device
zu verwenden.