Forum: Mikrocontroller und Digitale Elektronik 8Bit BMP auf LED Matrix anzeigen HEX-->BIN umwandlung


von Jakob B. (teddynator)


Lesenswert?

Hallo Forum,

gestern sind endlich die Platinen für meine RGB LED Matrix gekommen. 
Funktionieren nach einem ersten Test auch recht gut. Die Daten werden 
per Uart in der form übertragen:

rotes Bild:

0b00001111
0b00011111
0b11000011
0b01010101
.
.
.

also pro Zeile ein Byte wobei "0" für LED leuchtet und "1" für led 
leuchtet nicht. ebenso werden hinter her die daten für grün und blau 
übertragen.

Jetzt versuche ich natürlich mehr als nur diese Grundfarben und deren 
Mischfarben darzustellen. Ich habe mir das so vorgestellt dass ich 
mehrere rot, grün, und blau bilder hintereinander übertrage und diese 
nacheinander anzeigen lasse. So erreiche ich eine Art PWM.

Problem: ich würde die Daten gerne als hex code übertragen als 256 
Farben bild. so bräuchte ich insgesamt 6 RGB Bilder. Das sollte von der 
Geschwindigkeit her leicht machbar sein. Schwierigkeiten habe ich im 
umwandeln des hex codes in die binär codes für die einzelnen Bilder.

1. Gibt es eine Standard Farbtabelle für BMP an die sich Paint hält? 
Also so etwas wie die Standard Web farben nur mit zugehörigen HEX codes, 
wie sie im BMP gespeichert werden?

2. mal angenommen 0xF3 wäre der wert RGB:6,3,1 zugeordnet. So müsste ich 
dieses byte in daten folgender art umwandeln:

rot:
0b1xxxxxxx;
-restliche zeilen

0b1xxxxxxx;
-restliche zeilen

0b1xxxxxxx;
-restliche zeilen

0b1xxxxxxx;
-restliche zeilen

0b1xxxxxxx;
-restliche zeilen

0b1xxxxxxx;
-restliche zeilen

grün:
0b1xxxxxxx;
-restliche zeilen

0b1xxxxxxx;
-restliche zeilen

0b1xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

blau:
0b1xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

0b0xxxxxxx;
-restliche zeilen

und das alles für jedes Pixel einzeln?!
Hat hier jemand eine Idee wie man das sinnvoll umsetzen kann.

Gerne können auch völlig andere Lösungsvorschläge gemacht werden.

Ziel: Übertragen der hex werte eines 8x8 8Bit BMPs und Anzeigen auf der 
LED Matrix.

Hoffe ich konnte mich halbwegs verständlich ausgedrückt. Wäre schön wenn 
mir jemand weiterhelfen könnte.

Zur Hardware: MEGA32 (16MHz), CD4017, ULN2981 R-Netzwerke und FT232
sollte aus irgend einem Grund ein Schaltplan benötigt werden, liefere 
ich den gerne nach.

Danke schonmal.

von ... (Gast)


Lesenswert?

Jakob B. schrieb:
> 8x8 8Bit BMPs

Das wird aber eine sehr grobe Blockgrafik. 8x8 Pixel reichen ja gerade 
eben aus um Buchstaben und Zahlen einigermaßen deutlich darzustellen.

von Jakob B. (teddynator)


Lesenswert?

... schrieb:
> Das wird aber eine sehr grobe Blockgrafik. 8x8 Pixel reichen ja gerade
>
> eben aus um Buchstaben und Zahlen einigermaßen deutlich darzustellen.

Ist mir bewusst. Das ganze sollen auch mal meherere Module werden, die 
dann zusammengeschaltet werden. Aber zuerst will ich eines mit 8x8 zum 
Laufen bringen bevor ich mich weiter vor wage. Hier gehts mir mehr um 
das Prinzip wie man so etwas am besten/einfachsten umsetzt.

von Sebastian M. (noobuntu)


Lesenswert?

Hallo Jakob,

natürlich gibt es einen Standart an den sich alle Programme halten die 
mit BMPs zu tun haben. Am besten schaust du dir mal den dazugehörigen 
Wikipediaeintrag an.
http://de.wikipedia.org/wiki/Windows_Bitmap

Ich habe mir mal ein kleines Java Programm geschrieben, dass ein 
beliebiges BMP in einen großen C-Array umwandelt, sodass ich dann das 
BMP auf einem Fabrdisplay darstellen konnte. Hättest du an sowas 
interesse?

Du kannst dir aber auch einfach selber ein kleines C-Programm schreiben, 
dass das BMP umwandelt und dann über den virtuellen COM Port an deinen 
uC ausgibt!

von Jakob B. (teddynator)


Lesenswert?

Sebastian M. schrieb:
> natürlich gibt es einen Standart an den sich alle Programme halten die
>
> mit BMPs zu tun haben. Am besten schaust du dir mal den dazugehörigen
>
> Wikipediaeintrag an.
>
> http://de.wikipedia.org/wiki/Windows_Bitmap

Der Artikel ist mir bekannt. Was ich suche ist allerdings eine Tabelle 
mit den Farben. Also woher weiß ich welche Farbe z.B. 0x00 ist? ich 
vermute schwarz. Und 0xff vermutlich weiß. aber was ist z.b. 0x45? Kann 
man das irgendwie herausfinden? oder hat jedes bmp eine eigene 
Farbtabelle. Irgendwas habe ich da noch nicht so ganz verstanden. Also 
24bit BMPs ohne Farbtabelle sind mir klar. Aber mit den 8Bit hab ich 
noch so meine Probleme

Sebastian M. schrieb:
> Ich habe mir mal ein kleines Java Programm geschrieben, dass ein
>
> beliebiges BMP in einen großen C-Array umwandelt, sodass ich dann das
>
> BMP auf einem Fabrdisplay darstellen konnte. Hättest du an sowas
>
> interesse?

Ich glaube ich habe schon ein ähnliches Programm gefunden. mein Problem 
ist nicht das Array sondern die Darstellung selbst. Aber danke

Sebastian M. schrieb:
> Du kannst dir aber auch einfach selber ein kleines C-Programm schreiben,
>
> dass das BMP umwandelt und dann über den virtuellen COM Port an deinen
>
> uC ausgibt!

Kann ich nicht. Bin leider eine Niete in PC software programmieren. Habe 
bisher noch nichts gefunden mit dem ich einigermaßen umgehen kann. 
Minimale Kenntnisse in VBasic. C hab ich probiert. Ging aber nicht weit 
über einfache "Benzinkostenrechner" oder ähnliches hinaus. Wird noch ein 
weilchen dauern, bis ich hier was anständiges zusammen bringe.

von Sebastian M. (Gast)


Lesenswert?

Jakob B. schrieb:
> Also woher weiß ich welche Farbe z.B. 0x00 ist? ich
> vermute schwarz. Und 0xff vermutlich weiß. aber was ist z.b. 0x45? Kann
> man das irgendwie herausfinden? oder hat jedes bmp eine eigene
> Farbtabelle. Irgendwas habe ich da noch nicht so ganz verstanden. Also
> 24bit BMPs ohne Farbtabelle sind mir klar. Aber mit den 8Bit hab ich
> noch so meine Probleme

Also ich habe hier mal ein Programm für mein Farbdisplay ausgegraben.

Das Display wird im 16Bit Modus betrieben. Das heißt es stehen 16 Bit 
zur Darstellung einer Farbe eines Pixels da.

Definiert ist das so:
1
#define RGB(r,g,b)           (((r&0xF8)<<8)|((g&0xFC)<<3)|((b&0xF8)>>3)) //5 red | 6 green | 5 blue
2
[c]
3
4
Sprich die ersten 5 Pixel stehen für den Rotwert des Pixels, die nächsten 6 für den Grünwert und die restlichen 5 Pixel für den Blauwert. Nimmt der Wert für zum Beispiel den Rotwert sein Maximum an, ist das Maximum an Rot vorhanden, bei dem Rotwert 0 fehlt Rot komplett in der Farbe. Mit diesen 3 Grundfarben kann man sich dann alle anderen Farben mischen.
5
6
Bei mir sieht des dann im Code so aus
7
[c]
8
#define COLOR_WHITE  RGB(255,255,255)
9
#define COLOR_BLACK  RGB(  0,  0,  0)
10
#define COLOR_RED    RGB(255,  0,  0)
11
#define COLOR_GREEN  RGB(  0,255,  0)
12
#define COLOR_BLUE   RGB(  0,  0,255)
13
#define COLOR_YELLOW RGB(255,255,  0)

Suchst du etwa so was?
http://www.farb-tabelle.de/de/farbtabelle.htm

Hoffe ich konnte dir weiterhelfen

mfg sebastian

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jakob B. schrieb:
> Was ich suche ist allerdings eine Tabelle
> mit den Farben. Also woher weiß ich welche Farbe z.B. 0x00 ist? ich
> vermute schwarz. Und 0xff vermutlich weiß. aber was ist z.b. 0x45? Kann
> man das irgendwie herausfinden? oder hat jedes bmp eine eigene
> Farbtabelle.

8-Bit-BMP-Dateien ("256 Farben") enthalten in der Tat eine 
Farbpalette. In der Bitmap selber ist statt des Farbwertes der Index in 
die Farbpalette gespeichert. Die Farbpalette besteht entsprechend aus 
einer Liste von 256 Farbwerten.

http://en.wikipedia.org/wiki/BMP_file_format#Color_Table

von Jakob B. (teddynator)


Lesenswert?

Sebastian M. schrieb:
> Suchst du etwa so was?
>
> http://www.farb-tabelle.de/de/farbtabelle.htm

Ja, nur ich suche nicht hex werte der form RRGGBB sondern eher was in 
der richtung OxXX entspricht RRGGBB also nur ein byte dass einer farbe 
zugeordnet ist.

Ähnliches wie in deinem Code habe ich auch vor. Nur mit 1Byte pro pixel. 
in diesem sollen aber nicht die farben im format RRRGGGBB oder ähnlich 
stehen sondern soll diesem byte ein wert aus einer tabelle zugeordnet 
werden. Und genau diesen wert finde ich nicht. Ich dachte bei BMPs mit 
farbtabelle wird das ähnlich gemacht. ich möchte dann je farbe eben 6 
zustände haben, also aus 255,255,0 soll dann eben werden 6,6,0 so komme 
ich auf insgesamt 256 farben. diese umwandlung wäre nicht das problem 
nur wie komme ich von 0xXX auf 0xRRGGBB?

von Jakob B. (teddynator)


Lesenswert?

Rufus Τ. Firefly schrieb:
> 8-Bit-BMP-Dateien ("256 Farben") enthalten in der Tat eine
>
> Farbpalette. In der Bitmap selber ist statt des Farbwertes der Index in
>
> die Farbpalette gespeichert. Die Farbpalette besteht entsprechend aus
>
> einer Liste von 256 Farbwerten.

Und genau so eine Tabelle suche ich. Gibt es hier keinen Standard? z.B. 
Webfarben oder ist die in jedem bmp anders. Oder besser gefragt kann ich 
eine Standard Tabelle erzwingen?
Ich möchte die Tabelle sozusagen direkt auf dem ATMEGA speichern und nur 
noch die Bilddaten übertragen.

von Optiker (Gast)


Lesenswert?

Jakob B. schrieb:
> Und genau so eine Tabelle suche ich. Gibt es hier keinen Standard? z.B.
> Webfarben oder ist die in jedem bmp anders. Oder besser gefragt kann ich
> eine Standard Tabelle erzwingen?Beitrag melden | Bearbeiten | Löschen |

Die Tabelle wird normalerweise z.B. vom Bildbearbeitungsprogramm 
erzeugt, wenn du das Bild mit 256 Farben abspeicherst und heißt 
Farbpalette. Programme, die über die rudimentären Fähigkeiten von Paint 
hinausgehen, bieten meist die Möglichkeit die Farbpalette getrennt 
abzuspeichern oder aus einer Datei zu laden. Diese Palettendatei gibt 
dir dann die Umsetzung von den 256 Farbindizes in die RGB-Farbwerte.

Gruß

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Jakob B. schrieb:
> Ich möchte die Tabelle sozusagen direkt auf dem ATMEGA speichern und nur
> noch die Bilddaten übertragen.
Klar geht das. Schau mal in deinem Bildverarbeitungsprogramm zum Thema 
"Indizierte Farben" nach, bei vielen Kann man z.B. die Palette 
"Webfarben" wählen oder sich selbst eine Palette anlegen und 
speichern/laden. Wieviel Farben soll den deine Palette haben?
Ich hab mal vor längerer Zeit hier
Beitrag "Grafikkonverter Tool für AVR/Mikrocontroller (BMP2C, BMP2ASM, BMP2BASCOM)"
ein Programm veröffentlicht, wo du dir selbst ein alette basteln kann 
und die Grafiken gleich umgerechnet werden.

von Jakob B. (teddynator)


Lesenswert?

@Optiker und Läubi ..

Danke euch beiden. Das hat mir erst mal geholfen. Werd mich mal mehr in 
das Thema einarbeiten. Wenn ich dann noch Fragen habe, meld ich mich 
nochmal.

Läubi .. schrieb:
> Wieviel Farben soll den deine Palette haben?

216 nach den standard Webfarben. Der rest sollen für steuerbefehle 
freibleiben.

Ich glaube für die Umsetzung der Anzeige ist mir auch schon was besseres 
eingefallen.

Danke an alle, die sich beteiligt haben.

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.