Forum: Mikrocontroller und Digitale Elektronik Speicheradresse eines Pixels


von n-joy (Gast)


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

von n-joy (Gast)


Lesenswert?

Ah 16bpp soll die Farbtiefe sein...

von Justus S. (jussa)


Lesenswert?

es gibt ja auch nur einen Displaytreiber und eine Putpixel-Funktion auf 
der ganzen weiten Welt...

von Uwe (Gast)


Lesenswert?

> 256kByte und 16 Adressleitungen
Geht nur mit 32Bit Datenbus
> 0h-40000h
geht nicht bei 16 Adressleitungen

von Klaus W. (mfgkw)


Lesenswert?

zeig doch mal die ganze Hausaufgabe, dann kann man besser helfen :-)

von Karl H. (kbuchegg)


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?

von n-joy (Gast)


Lesenswert?


von n-joy (Gast)


Lesenswert?

okay danke danke schonmal.
also
addr(X, Y) = Y rows * (Xm + 1) + X

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

von Karl H. (kbuchegg)


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?

von Vlad T. (vlad_tepesch)


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.

von n-joy (Gast)


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

von Vlad T. (vlad_tepesch)


Lesenswert?

wenn du c schreibst:
1
#define imgWidth 800
2
3
// 8 bit image buffer:
4
uint8_t*  img8  = (uint8_t* )0xCAFFEE; 
5
uint16_t* img16 = (uint16_t*)0xCAFFEE; 
6
7
8
uint16_t x = 42;
9
uint16_t y = 23;
10
11
uint8_t pixel8  = img8 [y*imgWidth + x];
12
uint8_t pixel16 = img16[y*imgWidth + x];

von n-joy (Gast)


Lesenswert?

Ohooo thats it! Caffee....gute idee =)
Okay danke jetzt hab ich es hehe

von Vlad T. (vlad_tepesch)


Lesenswert?

Vlad Tepesch schrieb:
> uint8_t pixel8  = img8 [y*imgWidth + x];
> uint8_t pixel16 = img16[y*imgWidth + x];

sollte natürlich
uint16_t pixel16 = img16[y*imgWidth + x];
heißen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.