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
es gibt ja auch nur einen Displaytreiber und eine Putpixel-Funktion auf der ganzen weiten Welt...
> 256kByte und 16 Adressleitungen Geht nur mit 32Bit Datenbus > 0h-40000h geht nicht bei 16 Adressleitungen
zeig doch mal die ganze Hausaufgabe, dann kann man besser helfen :-)
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?
Huhu, für 8bit habe ich bereits das hier gefunden: http://www.siggraph.org/education/materials/HyperGraph/scanline/outprims/setpixel.htm Es geht um den s1d13a05 von epson. http://vdc.epson.com/index.php?option=com_docman&task=doc_download&gid=1912&Itemid=99 grüße
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..
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?
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.
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
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]; |
Ohooo thats it! Caffee....gute idee =) Okay danke jetzt hab ich es hehe
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.