Busy-Flag wird nicht richtig ausgewertet

OP #339834
Lesenswert?

Hi,

ich habe ein Problem mit der Software, die bei meinem Display
(HD44780), das vom Pollin
(http://www.pollin.de/shop/shop.php?cf=detail.php&pg=NQ==&a=NzY3OTc4OTk=)
stammt dabei war.
Das Programm ist in Delphi beschrieben.

Das Programm funktioniert auf meinem neuen PC ausgezeichnet doch auf
meinen beiden älteren PCs (jeder etwa 6 Jahre alt) fuktioniert (hängt
sich auf; 100% Prozessorauslastung) es nur, wenn ich in den
Programmeinstellungen als Modus NICHT bidirektional auswähle. Dieser
Modus ist aber indiskutabel, weil man viel zu lange warten muss, bis
die Daten auf dem Display erscheinen (ich muss schnell Daten auf das
Display übertragen). Ich habe allerdings in BIOS ECP ausgewählt.Dieser
Modus ist doch bidirektional oder?

Weiter habe ich herausgefunden als ich mir den Programmcode dieses
Delphi-Programms anschaute, dass das Programm den beiden älteren PCs am
abfragen des Busy-Flags scheitert/hängt.

Außerdem habe ich herausgefunden, dass in der tmp-Variablen nach dem
lesen nicht die RAM-Adresse zurückgegeben wird sondern das zulezt
geschriebene Zeichen.


Hier ist der "kritische" Programmteil (das komplette Programm um das
es sich handelt git es unter
http://www.pollin.de/shop/downloads_suchergebnis.php?fp=OA==&pg=NQ==&a=NzY3OTc4OTk=):

****************************************************************
procedure TForm1.WaitDispRdy;
// Warten, bis das Display bereit ist
var tmp: byte;
    t: TDateTime;
begin
  if BiDirLPT THEN begin
    // LPT im ECP-Control-Register auf PS/2-Mode setzen
    // nötig, falls es ein ECP-Port ist
    tmp:=PortReadB(printerport+$402);
    tmp:=tmp AND $1F;
    tmp:=tmp OR $20; // Bidirektionaler Modus = PS/2
    PortWriteB(printerport+$402,tmp);
    t:=now+(5/86400);  // Begrenzt auf 5 Sekunden
    repeat
      // Auf Eingang schalten und abfragen
      PortWriteB(printerport+2,$20+8+4+2+1); //In, E2=0 R/W=1 RS=0
E1=0
      case ctrl of
        0: PortWriteB(printerport+2,$20+8+4+2+0); //In, E2=0 R/W=1 RS=0
E1=1
        1: PortWriteB(printerport+2,$20+0+4+2+1); //In, E2=1 R/W=1 RS=0
E1=0
      end;
      tmp:=PortReadB(printerport);
      PortWriteB(printerport+2,$20+8+4+2+1); //In, E2=0 R/W=1 RS=0
E1=0
    until ((tmp AND 128)=0) OR (now>t); // Maximal 5 Sekunden warten
    PortWriteB(printerport+2,8+0+2+1);//Out, E2=0 R/W=0 RS=0 E1=0
  end else
    Delay(3); // Ohne bidirektionalen Parallelport ist Handshaking
nicht möglich
end;
************************************************************

1. Kann mir jemand sagen wieso das Abfragen des Busy-Flags nicht auf
meinen älteren PCs funktioniert?

2. Ist in dieser Source etwas nicht beauchtet worden, so dass das
"Handshaking" nicht möglich ist.

3. Wieso enthält die tmp-Variable auf meinen älteren PCs nicht die
Ram-Adressse sondern das zulezt geschriebene Zeichen?


Würde mich sehr über Hilfe freuen.

Gruß
FlorianD
Gast #339837
Lesenswert?

@Florian:

Displays mit HD44780 verwende ich seit Jahren, aber direkt an einem
µC-Port. Die sind in Literatur und Source Code Beispielen auch bis zum
Erbrechen beschrieben. In meiner Anwendung wird ebenfalls das Busy-Flag
abgefragt, und es gab nie Probleme.

Am Display selbst muß es nicht liegen, wenn man es nach Anleitung aus
dem Datenblatt richtig initialisiert hat.

Gruß

Dietmar

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren