LCD write Data optimieren

Gast #1339516
Lesenswert?
• ▲
▼
Hallo,

ich schreibe meine Daten in einen Cache bevor es aufs Display kommt.
Das Display hat 240 x 160 Pixel.

Um die Geschwindigkeit auzuloten setze ich 38400 mal LCDSetDot und das 
Display ist gefüllt.
Das ist dann die maximale Zeit um eine Displayseite zu beschreiben.
Dauert momentan ca. 800ms.(AVR32 mit 12 Mhz)
Wie könnte die LCDWriteData optimiert werden?

1
void LCDSetDot(unsigned char x, unsigned char y)
2
{
3
  LCD_GotoXY(x, y);
4
  LCDWriteData(0x80);
5
}
6

7
void LCDWriteData(unsigned char data)
8
{
9
  unsigned char  xOffset;
10
  unsigned short cachePos;
11
  
12
  xOffset = LCDCoord.x % 8;
13
  cachePos = (LCDCoord.y * 30) + LCDCoord.x/8;
14
  lcdcache[cachePos]         |= (data >> xOffset);
15
  lcdcache[cachePos+1]   |= (data << (8-xOffset));
16
  LCDCoord.x += 8;
17
}
Gast #1339828
Lesenswert?
• ▲
▼
optimieren könnte man das indem man direkt schreiben könnte
der adresscounter wird beim schreibvorgang ja meist selbst erhöht im LCD 
RAM
also fortlaufende schreiboperationen verwenden ohne jedesmal neu zu 
adressieren
Gast #1339850
Lesenswert?
• ▲
▼
Wenn ich mich nicht irre müsste sich %8 durch &0x7 ersetzten lassen. 
Wenn das der Compiler nicht eh schon macht dürfte es was bringen.

Wenn du bischen Cache verschenken kannst, dann lass nach jeder Zeile 
etwas platz. Dann wird aus

cachePos = (LCDCoord.y * 30) + LCDCoord.x/8;

nämlich

cachePos = (LCDCoord.y * 32) + LCDCoord.x/8;

*32 sollte dank Byte-tauschen auch deutlich schneller gehen
#1339891
Lesenswert?
• ▲
▼
Sebastian schrieb:

> *32 sollte dank Byte-tauschen auch deutlich schneller gehen

Byte tauschen? Da der µC eine Hardwaremultiplikation hat, sollte es egal 
sein, ob man mit 30 oder 32 multipliziert.

@Michael
Wieso teilst du das ganze auf 3 Funktionen auf?

Ich würde das ganze in einer Funktion machen:
1
void LCDSetDot(unsigned char x, unsigned char y)
2
{
3
  unsigned char  xOffset;
4
  unsigned short cachePos;
5
  
6
  xOffset = x % 8;
7
  cachePos = (y * 30) + x/8;
8
  lcdcache[cachePos]         |= (0x80 >> xOffset);
9
  lcdcache[cachePos+1]   |= (0x80 << (8-xOffset));
10
}

Wieso schreibst du eigentlich 2x?
1
  lcdcache[cachePos]         |= (data >> xOffset);
2
  lcdcache[cachePos+1]   |= (data << (8-xOffset));
Gast #1340457
Lesenswert?
• ▲
▼
Hallo,

Sebastian &0x07 funktioniert, und ist natürlich einiges schneller.

Benedikt:

da hast Du Recht, ich habe das in eine eigene Funtion gepackt.
2 x schreiben war damit ich ein byte an jede Position schreiben kann.
Braucht man bei SetDot dann auch nicht mehr.

Ergebnis: 20% schneller

Viele Grüße
Michael
Persönliche Seite #1341985
Lesenswert?
• ▲
▼
Das kann doch irgendwie nicht sein...

Ich kenne AVR32 nicht, aber bei 12MHz Takt und 38400 Pixeln sind das bei 
der "optimierten" (20% schnelleren) Version 250 Ticks pro Pixel!

Dauern Operationen auf AVR32 wiklich sooo lange?

Datt is doch ne RISC, die ca. 1MIPS/MHz liefern sollte, aber nicht 250 
Ticks für 1 Funktionsaufruf und ne handvoll Trivial-Operationen.

Johann

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.