Speicheradresse eines Pixels

Gast #3217365
Lesenswert?

Guten Tag,

ich würde gerne wissen, wie die Speicheradresse bei einem Displaytreiber 
256kByte und 16 Adressleitungen ermittel (angenommen die Displaygröße 
ist 420*280 Pixel).
Speicherbereich Grafikchip: 0h-40000h.
Dies soll für die Putpixel Funktion gültig sein

Grüße
#3217396
Lesenswert?

Im speziellen findest du das natürlich für deinen konkreten Controller 
im Datenblatt und das kann durchaus abweichen.

Aber nur so als Übung.
Angenommen du hast ein Raster
1
     +---+---+---+---+---+---+
2
     |   |   |   |   |   |   |
3
     +---+---+---+---+---+---+
4
     |   |   |   |   |   |   |
5
     +---+---+---+---+---+---+
6
     |   |   |   |   |   |   |
7
     +---+---+---+---+---+---+
8
     |   |   |   |   |   |   |
9
     +---+---+---+---+---+---+

und die Zellen wären zeilenweise durchnummeriert. Beginnend links oben, 
dann entlang der Zeile und wenn die Zeile zu Ende ist, dann eben weiter 
in der nächsten Zeile:
1
       0   1   2   3   4   5
2

3
     +---+---+---+---+---+---+
4
  0  | 0 | 1 | 2 | 3 | 4 | 5 |
5
     +---+---+---+---+---+---+
6
  1  | 6 | 7 | 8 | 9 |10 |11 |
7
     +---+---+---+---+---+---+
8
  2  |12 | . | . | . |   |   |
9
     +---+---+---+---+---+---+
10
  3  |   |   |   |   |   |   |
11
     +---+---+---+---+---+---+

dann hat das erste Pixel der zweiten Zeile offenbar die Nummer 6. Stellt 
man sich das Raster linear abgewickelt im Speicher vor, dann ist das 
also die 7-te Zelle, gerechnet vom Beginn im Speicher.
Warum ist das die Zelle mit der Nummer 6? (Schau dir mal die Anzahl der 
Spalten an)

Die Zelle an der Position 1/2 hat die Nummer 8. Warum ist das so?
Nun, weil das erste Pixel in dieser Zeile die Nummer 6 hat, und da dann 
noch die 2 für die tatsächlich benötigte Spalte dazu, macht die 8.

Also: Was ist jetzt die allgemeine Formel um auszurechnen, welche NUmmer 
eine Zelle vom Beginn des Rasters an gerechnet hat, wenn man die Spalten 
und Zeilennummer hat?

Wie ändert sich diese Formel, wenn man an jeder Rasterposition nicht 1 
Byte sondern deren 2 (wegen 16bpp) hat?
#3217481
Lesenswert?

n-joy schrieb:
> okay danke danke schonmal.
> also
> addr(X, Y) = Y rows * (Xm + 1) + X

wieso  "+ 1"

Du musst unterscheiden zwischen
* der Zeilen/Spalten NUMMER (mit der dann adressiert wird)
* der Anzahl an Zeilen/Spalten

mein Raster hat 6 Spalten, aber die Spaltennummern laufen von 0 bis 5

Anzahl == 6
Adressiernummern == 0 .. 5


Also: nochmal von vorne

>
> funktioniert für dein raster beispiel gut.
> aber wie das jetzt bei 16bpp (2byte/pixel) ist macht mir sorgen..
1
       0   1   2   3   4   5
2

3
     +---+---+---+---+---+---+
4
  0  | 0 | 2 | 4 | 6 | 8 |10 |
5
     +---+---+---+---+---+---+
6
  1  |12 |14 |16 |18 |20 |22 |
7
     +---+---+---+---+---+---+
8
  2  |24 | . | . | . |   |   |
9
     +---+---+---+---+---+---+
10
  3  |   |   |   |   |   |   |
11
     +---+---+---+---+---+---+

Selber Nachdenkprozess!

sind deine Sorgen jetzt kleiner?
#3217490
Lesenswert?

Karl Heinz Buchegger schrieb:
> Beginnend links oben,
> dann entlang der Zeile und wenn die Zeile zu Ende ist, dann eben weiter
> in der nächsten Zeile:

das muss aber nicht sein.

Bestes Beispiel sind doch die typischen Character-LCD-Controller.
unabhängig von der tatsächlichen Spaltenzahl des Displays sind die 
Zeilenpuffer immer gleich breit  zB 40 (bei der Zahl bin mir jetzt nicht 
sicher).
Zeile 2 beginnt also bei Offset 40, egal ob jede Zeile 8,16,20,30 oder 
40 Zeichen hat.

Selbes gibts bei Grafik-Controllern auch.
Das heißt man muss unterscheiden zwischen tatsächlicher Bildgeometrie 
und der Geometrie des Bildspeichers.

n-joy schrieb:
> addr(X, Y) = Y rows * (Xm + 1) + X

wiso +1?
index = y*spalten + x

n-joy schrieb:
> aber wie das jetzt bei 16bpp (2byte/pixel) ist macht mir sorgen..
genauso, nur dass der index jetzt nicht in ein 8bit-Array eingesetzt 
wird, sondern in ein 16bit Array. Die Adressberechung macht der 
Compiler.
bzw, wenn du assembler schreibst, musst du halt den index mit der 
Bittiefe in Byte multiplizieren.
Gast #3217784
Lesenswert?

Huhu,

jaa das Xm stand für die letzte Zahl in der Zeile daher +1.
Wenn ich von 6 Zeilen ausgehe dann ist
index = y*6+ x
natürlich logischer :D

okay heißt das jetzt meine adresse muss für 16pbb
index = (y*spalten + x)*2
sein,
oder kann ich auch
index = y*spalten + x
nehmen und der rest läuft

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