Hallo Zusammen,
mit LCDs kenne ich mich leider nicht aus, jetzt habe ich eine
Testplatine
mit einem "DotMatrixDisplay" erhalten.
Das LCD Diplay ist super langsam, in Zeitlupentempo baut ich Anzeige auf
und stoppt die ganz Applikation. Sensorwerte (Gyro) können demnach
nicht vernünftig aufsummiert werden. (wenn ich ein paar hunderstel
fehlen,
habe ich eine Problem, stimmen die werte nicht mehr.)
Sind "DotMatrixDisplay" grundstätzlich für zeitkritische Anwendungen
geeignet?
Ich kenne nur vom einem PIC32 Demoboard ein LCD Display was super
schnell ist.
Jetzt ist die Frage, lohnt es sich in die "DotMatrixDisplay" Funktionen
mit Befehlssätzen und Timing-Chart einzusteigen, oder ist der
der LCD Typ einfach ungeeignet und muß getauscht werden.
Hilfe wär, stecke wirklich in der Klemme.
Viele Grüße
ABSimon
>"DotMatrixDisplay"
Ja, welches denn? Alphanumerisch? Grafisch?
>in Zeitlupentempo baut ich Anzeige auf und stoppt die ganz Applikation.
Dann ist es schlichtweg falsch programmiert, wenn die Anzeigefunktion
die restliche Programmausführung blockiert oder umgekehrt. Hat nichts
mit der Anzeige selbst zu tun.
Hallo,
vielen Dank.
DOTMATRIXDISPLAYS 2x40
Elektonic Assembly GmbH
LOCHHAMER SCHLAG 17 · D-82166 GRÄFELFING
TECHNISCHE DATEN
* INTEGRIERTER KONTROLLER HD44780 ODER KOMPATIBEL
* EINGANG 4- ODER 8-BIT DATENBUS, 3 STEUERLEITUNGEN (R/W, E, RS)
* ASCII-ZEICHENSATZ UND SONDERZEICHEN IM CHARACTER-ROM
* BIS ZU 8 ZEICHEN (ASCII-CODE 0..7) KÖNNEN FREI DEFINIERT WERDEN
* VERSCHIEDENE FUNKTIONEN MIT EINEM BEFEHL PROGRAMMIERBAR:
- CLEAR DISPLAY, CURSOR HOME, CURSOR ON/OFF, BLINKING CURSOR
- SHIFT DISPLAY, SHIFT CURSOR, READ/WRITE DISPLAY DATA, ETC.
* EINFACHE SPANNUNGSVERSORGUNG (+5V). AUSNAHME: EINIGE TYPEN
WIE z.B. DISPLAYS MIT ERW. TEMPERATURBEREICH
* GERINGER STROMVERBRAUCH (1..4 mA)
* BETRIEBSTEMPERATUR 0..+50°C
OPTIONEN
* ERWEITERTER TEMPERATURBEREICH -20..+70 °C
* KYRILLISCH/ENGLISCHER ZEICHENSATZ
* 6°° ODER 12°° BLICKRICHTUNG
* INTERFACEBOARD MIT RS-232 SCHNITTSTELLE ODER
* RS-422 SCHNITTSTELLE
* INTERFACEBOARD MIT 64 PROGRAMMIERBAREN TEXTEN IM EEPROM
LCD DOTMATRIXDISPLAYS
Genau kenne ich mich hier leider nicht aus.
Gibts hier nicht vielleicht schon fertige Bibliotheken/Funktionen,
die das besser machen?
Wäre klasse, würde mir wohl X Stunden Arbeit ersparen.
Vielen Dank & Viele Grüße
ABSimon
Ist definitiv schlecht programmiert wenn es so langsam ist.
Für HD44780 kompatible Controller wie bei diesem Display gibt es
haufenweise implementationen im Internet. Im Zweifelsfalle ist die
Ansteuerung aber auch selbst in nicht allzu langer Zeit programmierbar,
sofern man Datenblätter lesen kann und sich mit der
Firmwareprogrammierung in C auskennt.
Als "Quick-Hack" könntest Du im Sourcecode mal nachschauen, ob die
benötigten Verzögerungszeiten mit festen "Delays" programmiert sind oder
ob das Busy-Flag des Displays abgefragt wird. Falls es mit Delays
gemacht ist, dann sind diese vielleicht viel zu lang gewählt. Auf jeden
Fall könnte es dann so umprogrammiert werden, dass die Delays mit
Abfragen des Busy-Flags ersetzt werden.
ABSimon wrote:
> Das LCD Diplay ist super langsam, in Zeitlupentempo baut ich Anzeige auf> und stoppt die ganz Applikation.
Ja, es gibt Programmierer, die unbedingt im 100µs Timerinterrupt das
komplette Display ausgeben müssen. Und natürlich auch alles float-Werte
mit sprintf(), daß die CPU nur so qualmt.
Bloß kann kein Mensch in 100µs ein Display ablesen.
Nichtmal ne Fliege kann das und die ist 200-mal schneller.
Etwa 200ms ... 500ms Ausgaberate sind ergomonisch.
Entweder per Timer gesteuert alle 200ms in der Mainloop auf das Display
ausgeben oder in nem Timerinterrupt alle 1..10ms immer nur 1 Zeichen.
Peter
Hallo,
vielen Dank, ich werde mal auf die Suche gehen.
ich versuche mein bestes,
@Johnny ja sind sind feste delay funktionen
Hier der Code - (wer ggf. einen Zeitlupen Quelltext brauch :-))
Sieht aus wie als würde eine Schreibmaschine schreiben,
Zeichen für Zeichen. Für 2 Zeilen braucht man so ca.
4-5 Sekunden.
1
/**************** myLCDInit ****************/
2
unsignedcharmyLCDInit(void){
3
4
setLCDPort(0x00,0);
5
__delay_cycles(_100_ms);// delay after lcd powerup
Hallo,
trau ich mich garnicht zu posten :-)
Aufgerufen wird das ganze so
z.B. Anzeigen von VSource
1
//VSOURCE
2
adc_0=Basic_ADC(0x07);
3
4
adc_0=(adc_0*34)/k;//this factor is due to voltage divider
5
adc_0=adc_0/10;
6
a=adc_0/100;
7
b=(adc_0-100*a)/10;
8
c=adc_0-100*a-b*10;
9
10
//overload in Basic_ADC is 0xFF -> 6V in display
11
12
writeLCDString("Spannung VSOURCE =",18);//write string to display
13
writeLCDNumb(a);
14
writeLCDNumb(b);
15
writeLCDChar('.');
16
writeLCDNumb(c);
17
writeLCDChar('V');
18
writeLCDChar(' ');
Ich hab schon versucht hier nur den Wert (int) adc_0 anzuzeigen aber
die Funktion writeLCDNumb() gibt nur eine Ziffer her.
Abgesehen davon das man für mehrere Werte viel Geduld braucht.
Als am beste komplett auf eine andere Bibliothek umsatteln?
Danke & Viele Grüße
ABSimon
40ms? Wenn das so stimmt, dann wundert mich nichts mehr. Ich habe an
einem KW-Empfänger ein HD44780-Display als Bargraph dran als
Feldstärkeanzeige. Das Ding wird 30 mal pro Sekunde komplett neu
geschrieben, um so ein analoges Verhalten zu erreichen. 100 mal pro
Sekunde für 16 Zeichen geht auch noch ohne Probleme. Soviel zu der mit
solchen Displays erreichbaren Update-Rate.
a = adc_0 / 100;
b = (adc_0 - 100 * a) / 10;
c = adc_0 - 100*a-b*10;
Hier wird der Wert in adc_0 auf die 3 Stellen aufgesplittet,
writeLCDNumb(a); //Zehner
writeLCDNumb(b); //Einer
writeLCDChar('.'); //Komma
writeLCDNumb(c); //1 Nachkommastelle
schreibt die einzelnen Teile dann ins Display.
writeLCDNumb(); kann offensichtlich nur 1 Zeichen auf einmal ausgeben.
> Als am beste komplett auf eine andere Bibliothek umsatteln?
Würde ich mal sagen. Wenn du WinAVR benutzt, dann schau dir dieses
Tutorial mal an:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Gruß
Jadeclaw.
>Als am beste komplett auf eine andere Bibliothek umsatteln?
Wenn sie läuft nein.
Du kannst einiges an Zeiten verkürzen.
Als erstes der Tip von Peter mit dem Enable Puls.
1us langt.
1
unsignedcharwriteLCDChar(unsignedcharsymbol){
2
setLCDPort(lookUpSymbol(symbol),1);// second part of symbol
3
__delay_cycles(_20_ms);
4
5
return0;
6
}
Da reicht ein Delay von 100us dicke.
Änder das einfach mal und du wirst sehen das dein Display
schon um einiges schneller wird.
Um die Feinheiten kümmern wir uns später ;)
Die Delays in setLCDPort() würde ich auch mal um den Faktor 10 bis 100
verkürzen, dann wird es mit dem vorangegangenen Vorschlag wahrscheinlich
schon genügend schnell laufen.
Hallo,
vielen Dank für die Tipps, aktuelle habe nur eine Testversion von ISP
WINAVR wäre somit sowieso in 20 Tagen fällig.
Ich werde jetzt versuchen diese Funktion einzubauen
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#LCD-Ansteuerung
Ich hoffe das ist die richtige Lösung. Und man kann das als LCD
Laie realiseren.
Vielen Dank für die tolle Unterstützung!!
Viele Grüße
ABSimon