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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren