PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Immernoch Parallelport



08-10-2000, 23:57
Also ich hab es jetzt geschafft mein Display das am Parallelport hängt anzusteuern.
Ich hab ein Programm für Win gefunden, dass ich für Linux umgeschrieben habe. Mein Problem ist aber, dass das Programm für Linux viel langsamer ist als das für Win.
Das ganze dürfte eigentlich nur an der Funktion liegen wo auf die Hardware zugegriffen wird.
Das ganze sieht unter Linux dann so auf:
void LCD_WriteData(unsigned char data)
{
outb(0x07,LPT_CONTROL); // RS=1, R/W=0, E=0
outb(data,LPT_DATA);
outb(0x06,LPT_CONTROL); // RS=1, R/W=0, E=1
outb(0x07,LPT_CONTROL); // RS=1, R/W=0, E=0
outb(0x05,LPT_CONTROL); // RS=1, R/W=1, E=0
usleep(1);
}

und unter Win:
static void LCD_WriteData (unsigned char data)
{
outport(LCD_CONTROL_ADDRESS,0x07); // RS=1, R/W=0, E=0
outport(LCD_DATA_ADDRESS,data);
outport(LCD_CONTROL_ADDRESS,0x06); // RS=1, R/W=0, E=1
outport(LCD_CONTROL_ADDRESS,0x07); // RS=1, R/W=0, E=0
outport(LCD_CONTROL_ADDRESS,0x05); // RS=1, R/W=1, E=0
delay(1); // 1ms delay
}

wobei jedesmal folgendes gilt:
#define LCD_DATA_ADDRESS 0x0378
#define LCD_CONTROL_ADDRESS LPT_DATA + 2

vorher ab ich unter Linux aber noch die Ports geöffnet:
if (ioperm(LPT_DATA, 3, 1))
{
fprintf(stderr, "Can't talk to I/O port!\n");
exit(-2);
}
ioperm(LPT_DATA, 1, 1);
if (ioperm(LPT_CONTROL, 3, 1))
{
fprintf(stderr, "Can't talk to I/O port!\n");
exit(-2);
}
ioperm(LPT_CONTROL, 1, 1);

tja, im Grunde sind die Programm fast gleich.
Allerdings hab ich in unter Linux usleep(1) verwendet und unter Win heißt es delay(1). Aber eigentlich ist doch usleep(1) viel kürzer. Wenn ich usleep weglasse ist der Abstand nicht groß genug und es werden nicht Zeichen ausgegeben.

Wenn jemand einen Tip hat bitte melden.

Besten Dank

09-10-2000, 18:45
Ich weiß jetzt woran es liegt.
Und zwar an usleep(1);
und zwar ist es zuungenau. Ich weiß aber nicht wie ich das ändern kann.

10-10-2000, 17:36
<BLOCKQUOTE><font size="1" face="Arial,Helvetica,Geneva">Zitat:</font><HR>Original erstellt von WWG2000:
Ich weiß jetzt woran es liegt.
Und zwar an usleep(1);
und zwar ist es zuungenau. Ich weiß aber nicht wie ich das ändern kann.[/quote]

Wir und unser usleep ;-)
im Windows-Quelltext steht:
delay(1); // 1ms delay
Also (angeblich) eine MILLIsekunde Verzögerung, usleep(1) macht aber eine MIKROsekunde! (Sonst müßte es ja auch msleep() heißen. Ja ich weiß, manche manpages sagen da was anderes....selbst schon drauf reingefallen...)
Also: delay(1) == usleep(1000)

hope it helps ;-)

Sion

10-10-2000, 17:44
>delay(1) == usleep(1000)
Das weiß ich wohl. Aber ich habe irgendwo gelesen, dass usleep 10ms genau ist (bei Intel-chips). Und bei meinem Programm ist usleep(1) auf jedenfall mehr als 1 micros und auch mehr als 1ms.

Also brauch ich jetzt einen Ersatz für delay.

10-10-2000, 21:30
<BLOCKQUOTE><font size="1" face="Arial,Helvetica,Geneva">Zitat:</font><HR>Original erstellt von WWG2000:
>delay(1) == usleep(1000)
Das weiß ich wohl. [...]
Also brauch ich jetzt einen Ersatz für delay.[/quote]

Wollte dich ja nicht als Nixwisser hinstellen, hätte ja sein können, daß du's nicht weißt. War nicht böse gemeint.

Für den Ersatz: Ich habe gestern Abend eine interessante Seite gelesen, weiß jetzt natürlich die URL nicht mehr, aber vielleicht hilft es auch so:

Um sehr genau sehr kurze Wartezeiten einzulegen (wobei dies leider MINDEST-Zeiten darstellt, kann also dank Multitasking auch länger werden) kannst Du Berechnungen ausführen.
Die hatten da eine Tabelle welcher Assembler-Befehl wieviele Takte braucht, so kannst Du sehr kleine Zeiten überbrücken. Ist aber natürlich nicht sonderlich sinnvoll, um 10ms oder so zu überbrücken, vor allem bei einem 1GHz Prozzi ;-)
Aber vielleicht kannst du das ja ausmessen, wie lange irgendeine for-Schleife braucht, und so Deine "Pause" einlegen!
Vielleicht hilft es auch, daß neuere Kernel eine "nanosleep"-Funktion kennen....? Die soll ja auch recht "kurze" Zeiten schaffen. Soweit ich weiß ist die usleep()-Fkt. sogar über nanosleep() definiert. Sei aber gewarnt, sie ist lange nicht so einfach zu benutzen wie z.B. usleep()!!!

Sion

[Dieser Beitrag wurde von Sion am 10. Oktober 2000 editiert.]

11-10-2000, 21:24
<BLOCKQUOTE><font size="1" face="Arial,Helvetica,Geneva">Zitat:</font><HR>Original erstellt von sumilan:
wie sieht denn das komplette programm für linux aus? (als quellcode C)

danke
sumilan@web.de[/quote]

Hab ich dir das nicht gestern schon geschickt??

Ich hab aber eine Rückmail von WEB.de bekommen, und zwar das du zur Zeit nicht erreichbar bist.

12-10-2000, 00:19
wie sieht denn das komplette programm für linux aus? (als quellcode C)

danke
sumilan@web.de