Forum: Mikrocontroller und Digitale Elektronik LCD 4x20 LCDtools.c etwas zu langsam warum


von Matthias H. (maethes26)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

die Texte auf dem Display erscheinen zu langsam. Ich kann mit dem Auge 
noch erkennen, dass Textzeile für Textzeile erscheint.

Die Delayroutine arbeitet in der LCDtools datei richtig. Habe zur 
Kontrolle eine while(1) Schleife mit delay toggeln über _DElay(0.5) 
0.5ms eingebaut und das Oszi mißt auch 0.5ms.

Von daher arbeitet delay.

Habt ihr noch eine Idee warum es so langsam sein könnte?

Viele Grüße,

Matthias.

von Hubert G. (hubertg)


Lesenswert?

Du kannst die delay verkürzen, ist nur auszutesten ab wann es nicht mehr 
funktioniert. Die optimalere Lösung ist R/W benutzen mit Busy Abfrage.

von Karl H. (kbuchegg)


Lesenswert?

Matthias H. schrieb:
> Hallo zusammen,
>
> die Texte auf dem Display erscheinen zu langsam. Ich kann mit dem Auge
> noch erkennen, dass Textzeile für Textzeile erscheint.

Löscht du vorher das Display?
Dann ist klar, dass du das erkennen wirst, weil das LCD träge ist.
Clear Screen nur dann verwenden, wenn sich der komplette AUfbau der 
Ausgabe ändert. Ansonsten mit Überschreiben arbeiten! Dann flimmert auch 
nichts mehr.

> Die Delayroutine arbeitet in der LCDtools datei richtig. Habe zur
> Kontrolle eine while(1) Schleife mit delay toggeln über _DElay(0.5)
> 0.5ms eingebaut und das Oszi mißt auch 0.5ms.

Wo hast du das eingebaut? In der Hauptschleife in main()? Deshalb muss 
delay_ms in lcd.c noch lange nicht richtig funktionieren. Wo ist bei dir 
F_CPU definiert? In den Project-Options, so wie es sein soll?


> Habt ihr noch eine Idee warum es so langsam sein könnte?

kürz mal deine delays in der lcd_falsh_e radikal zusammen. Du wartest du 
fast 1 Millisekunde ehe du den Enable Puls beginnst und dann wieder, bis 
du ihn zurück nimmst. Das braucht das LCD gar nicht. Das bischen 
Verzögerung, das durch die Programmausführung automatisch entsteht, 
reicht meistens schon aus. Den ersten __delay_ms kannst du meistens 
überhaupt weglassen und den zweiten kannst du probehalber auch mal 
weglassen. Wenn sich rausstellt, dass zwischen Setzen und Löschen des 
E-Pins eine kleine Verzögerung notwendig ist, dann reden wir da über 3 
bis 4 Prozessortakte! Das sind ein paar µs, aber nichts im Bereich von 
Millisekunden.

von Peter D. (peda)


Lesenswert?

Matthias H. schrieb:
> Habt ihr noch eine Idee warum es so langsam sein könnte?

Das HD44780 Datenblatt mal lesen.
Deine Timings entsprechen überhaupt nicht den angegebenen.
1,5ms Enable ist 1500-fach zu lang.
1µs reicht dicke und dann nach jedem Byte noch 50µs warten.
Nur einige Kommandos (die man eh nicht braucht) dauern 1,5ms.


Peter

von Matthias H. (maethes26)


Lesenswert?

Hallo zusammen,

vielen Dank, das ihr mir geholfen habt.
ich habe das Display jetzt deutlich schneller einstellen können.


void lcd_flash_e(void)
{
  LCD_Port = LCD_Port| ( 1<<5 ) ;    // Enable = HIGH
  _delay_ms(0.015);                  // kurz warten, damit Flanke 
entsteht
  LCD_Port= LCD_Port& ~( 1<<5 ) ;    // Enable = LOW
  _delay_ms(0.01);              // Warten, bis der durch Enable 
angelegte Befehl hoffentlich verarbeitet wurde
}

15us oben und
10 us unten Wartezeit waren nötig.
gehe ich bei einem schon eine us tiefer geht es nicht mehr.




> Löscht du vorher das Display?
nein, das mahce ich nicht, aber danke für den Tipp.

> Dann ist klar, dass du das erkennen wirst, weil das LCD träge ist.
> Clear Screen nur dann verwenden, wenn sich der komplette AUfbau der
> Ausgabe ändert. Ansonsten mit Überschreiben arbeiten! Dann flimmert auch
> nichts mehr.
>

> Wo hast du das eingebaut? In der Hauptschleife in main()? Deshalb muss
> delay_ms in lcd.c noch lange nicht richtig funktionieren. Wo ist bei dir
> F_CPU definiert? In den Project-Options, so wie es sein soll?

ja, unter Project Options

viele Grüße und noch einen schönen Tag wünscht Matthias.

von Peter D. (peda)


Lesenswert?

Matthias H. schrieb:
> 15us oben und
> 10 us unten Wartezeit waren nötig.
> gehe ich bei einem schon eine us tiefer geht es nicht mehr.

Könnte sein, daß dann eine Rechenungenauigkeit des Macros zuschlägt.
Schau mal ins Assemblerlisting.

Für kleine Delays ist eigentlich _delay_us() vorgesehen.


Peter

von Matthias H. (maethes26)


Lesenswert?

Hallo Peter,

vielen Dank für Deinen Tipp, wußte ich nicht mit dem _delay_us.

Habe ich eingesetzt, jetzt käuft das Display auhc stabiler, vorher 
initialisierte es nicht bei jedem Start richtig.

Viele Grüße,

Matthias.

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.