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

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.

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.