mikrocontroller.net

Forum: PC-Programmierung Display über Parallelport ansteuern mit C (unter Linux)


Autor: wurstbonbon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: wurstbonbon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;)
..
#define LPT 0x378  /* standardadresse 0x378 (LPT1). fuer lpt2: 0x278, fuer lpt3: 0x3bc */

int load=0, data=0, sdclk=0, rst=0, out=0;

/*
pdata7,6,5,4 = 0
pdata3 (pin5) = rst = 0
pdata2 (pin4) = data
pdata1 (pin3) = sdclk
pdata0 (pin2) = load
*/

void control_reg(int helligkeit)  //halbe helligkeit: 1, volle helligkeit: leer
{
  int  data_temp, i=0;
  if (helligkeit==0) data=0xC0; /*11000000;*/ else data=0xC2; /*11000010:*/ 

   
  out=0; printf("1. %X\n", out); //  outb(0x0,LPT);  

  for (i=0;i<=7;i++)
  {
    //sdclock bit auf 0 setzen
    out=out&0xD;     printf("2. %X\n", out);  //outb(out,LPT);
    
  
    //neues äußerstes zeichen bilden, schreiben
    data_temp=data>>i;
    data_temp=data_temp&0x1; 
    data_temp=data_temp<<2;  //data ist 3. bit
    if (data_temp==0x4) out=out|data_temp; else out=out&0xb;
    printf("3. %X\n", out);  //outb(out,LPT);


    // wait - sdclock bit 1 setzen - wait  
    out=out|0x2;     printf("4. %X\n", out); //outb(out,LPT);
  
  }
}


void reg_voll()
{
  //outb(0x1,LPT);
  out=0x1; printf("0. %X\n", out);

  //wait time  
}




int main(int argc, char *argv[])
{
  reg_voll();
  control_reg(1);  //halbe helligkeit

}

viele grüße

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: wurstbonbon (Gast)
Datum:
Angehängte Dateien:
  • preview image for 1.JPG
    1.JPG
    213 KB, 587 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Hallo
inzwischen funktioniert die Ansteuerung ganz gut, siehe Bild.

Mein userspace-programm kam übrigens mit outb() zurecht, allerdings 
benötigte es die anweisung
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

Autor: Andreas K. (Firma: keine) (knuppel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin.

Mich würde der Code interessieren.

mfg knuppel

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.