www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Alternative für DOTMATRIXDISPLAY Da super langsam.


Autor: ABSimon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde sagen schlecht programmiert.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>"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.

Autor: ABSimon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>* INTEGRIERTER KONTROLLER HD44780 ODER KOMPATIBEL

Normaler gehts nicht ;)

Dürfte also mit (fast) jeder LCD-lib funktionieren.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: ABSimon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
/**************** myLCDInit ****************/
unsigned char myLCDInit(void) {

  setLCDPort(0x00, 0);
  __delay_cycles(_100_ms);// delay after lcd powerup
  setLCDPort(0x38, 0);
  setLCDPort(0x38, 0);
  setLCDPort(0x0E, 0);
  setLCDPort(0x06, 0);
  clearDisplay();
  __delay_cycles(_4_ms);
  return 0;
}

/*************** setLCDPort ****************/

unsigned char setLCDPort(unsigned char data, unsigned char dataflag) {
  LCDENABLE = 1;     // set enable pin high
  if(dataflag) {
    LCD_RS = 1;   //transmit data
  } else {
    LCD_RS = 0;   //transmit command
  }
  LCD_RW = 0;

  LCDDATA0 = data ;       //Display Data bit 0 (=DDB 0
  LCDDATA1 = data >>1;    //Display Data bit 1 (=DDB 1
  LCDDATA2 = data >>2;    //Display Data bit 2 (=DDB 2
  LCDDATA3 = data >>3;    //Display Data bit 3 (=DDB 3
  LCDDATA4 = data >>4;    //Display Data bit 4 (=DDB 4
  LCDDATA5 = data >>5;    //Display Data bit 5 (=DDB 5
  LCDDATA6 = data >>6;    //Display Data bit 6 (=DDB 6
  LCDDATA7 = data >>7;    //Display Data bit 7 (=DDB 7

  __delay_cycles(_40_ms);
  LCDENABLE = 1;     // set enable pin high
  __delay_cycles(_40_ms);
  LCDENABLE = 0;     // set enable pin low to start transfer
  __delay_cycles(_20_ms);

  return 0;
}

/************** clearDisplay ***************/

unsigned char clearDisplay(void) {
  setLCDPort(0x00,0);     // get ready for display clear
  setLCDPort(0x01,0);     // clear display
  __delay_cycles(_20_ms);
  return 0;
}

/************* writeLCDString **************/

unsigned char writeLCDString(unsigned char* string,unsigned char length) {
  unsigned char c;

  clearDisplay();
  __delay_cycles(_20_ms);

  for(c=0;c<length;c++) {
    writeLCDChar(string[c]);
    if(c==27) {                  //if at last position of first line
      moveCursor(0x40);        // go to second line
    }
  }

  return 0;
}

/*************** moveCursor ****************/

unsigned char moveCursor(unsigned char position) {
  setLCDPort(position & 0x27,0);
  __delay_cycles(_20_ms);
  return 0;
}

/************** writeLCDChar ***************/

unsigned char writeLCDChar(unsigned char symbol) {
  setLCDPort(lookUpSymbol(symbol),1);          // second part of symbol
  __delay_cycles(_20_ms);

  return 0;
}
/************** lookUpSymbol ***************/
unsigned char lookUpSymbol(unsigned char symbol) {
  return symbol - 'A' + 0x41;     // character code table of display is ASCII table with offset
                                  // 0x41 is capital A in LCD char code table
}


Danke & Viele Grüße
ABSimon

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ABSimon wrote:
>   __delay_cycles(_40_ms);
>   LCDENABLE = 1;     // set enable pin high
>   __delay_cycles(_40_ms);
>   LCDENABLE = 0;     // set enable pin low to start transfer
>   __delay_cycles(_20_ms);

Wenn der Name stimmt, also 40ms, dann sind das nur knappe 10000000% 
Zeitverschwendung.
1µs reicht als enable-Puls völlig.


Peter

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie sieht der restliche Code aus?

Autor: ABSimon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

trau ich mich garnicht zu posten :-)

Aufgerufen wird das ganze so
z.B. Anzeigen von VSource
  //VSOURCE
  adc_0 = Basic_ADC(0x07);

  adc_0 = (adc_0 * 34)/k; //this factor is due to voltage divider
  adc_0 = adc_0 / 10;
  a = adc_0 / 100;
  b = (adc_0 - 100 * a) / 10;
  c = adc_0 - 100*a-b*10;

  //overload in Basic_ADC is 0xFF -> 6V in display

  writeLCDString("Spannung VSOURCE =",18);    //write string to display
  writeLCDNumb(a);
  writeLCDNumb(b);
  writeLCDChar('.');
  writeLCDNumb(c);
  writeLCDChar('V');
  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

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.
unsigned char writeLCDChar(unsigned char symbol) {
  setLCDPort(lookUpSymbol(symbol),1);          // second part of symbol
  __delay_cycles(_20_ms);

  return 0;
}

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 ;)

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: ABSimon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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-Tu...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.