Forum: Mikrocontroller und Digitale Elektronik Busy-Flag wird nicht richtig ausgewertet


von Florian D. (floriand)


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

von Spess53 .. (hardygroeger)


Lesenswert?

Hi

Vergleiche mal die Einstellungen der LPT im BIOS. Es gibt für LPT
verschiedene Modi.

MfG HG

von Florian D. (floriand)


Lesenswert?

Hab an beiden PCs ECP 3 in BIOS aktiviert.
Beim einen ists jetzt EPP weil es mir ECP nicht funktioniert hatte.
Mit EPP jetzt allerdings auch nicht.

BIOS-Einstellungen bezüglich dem LPT sind (waren) identisch.

von Dietmar (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.