Busy-Flag wird nicht richtig ausgewertet

OP #339834
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
@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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.