PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bmp aufs glcd



manu_f
17.02.2007, 13:31
hallo zusammen!

ich versuche schon seit einiger zeit mein avr dazu zu bewegen bmps aufs display auszugeben.
habe die bmp in ein array-feld umgewandelt und mit verschiedenen libs versucht auszugeben. leider ohne erfolg. :(

1. könnt ihr eine von den zig libs die es gibt besonders empfehlen?

2. wie sieht so eine ausgabefunktion von so einem array aus?

wäre super wenn ihr mir etwas helfen könntet!!

viele grüße
manu

SprinterSB
17.02.2007, 22:02
Geht es um die Beschreibung des MS BMP-Formats?

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=247149#247149

Günstig ist auf jeden Fall, wenn sie bmp nicht komprimiert ist.

Oder willst du nicht selber implementieren und nur suchst ne fix-fertig-Lösung?

manu_f
18.02.2007, 12:14
hi sprinter,
danke für deine antwort!
ich habe das bmp mit einem tool/converter in einen c-header umgewandelt, leider weiß ich jetzt nicht mit welcher lib oder welche funktion ich das bild/header auf das glcd bekomme?

hast du sowas schon mal gemacht?

viele grüße
manu

SprinterSB
18.02.2007, 12:46
Nö, teilweise arbeite ich dann direkt auf der Datei (bmp) und lasse die dann anzeigen, wenn ich spezielle Grafiken erzeuge.

Was du ja wohl schon hast, ist einen Pixel zu malen. Falls nicht, kümmer dich um diese Basics bevor du ein komplettes Bild pinseln willst. Das ist eigentlich alles, was du brauchst...

Das bmp als C-Header zu haben ist nicht so toll, das würde ja bedeuten, daß du entweder die Grafik hart ins Programm reincompilierst oder aber zur Laufzeit den C-Header interpretieren musst.

Zweiteres ist zu vermeisen, ersteres evtl dann angebracht, wenn es sich um immer gleiche Bildchen wie feste Icons handelt, aber ineffizient ist das auch.

Am besten ist, wenn du die bmp irgendwoher binär beziehst (SPI, UART, I2C, Flash, EEPROM, XRAM, ...). Zuerst liest du die Kopfdaten ein (bmih, bmfh) und danach die eigentlichen Bilddaten (Palette + Pixel). Dabei brauchst du das Bild nicht komplett einzulesen, sondern kannst ja pixelweise einlesen/aufs GLCD ausgeben und brauchst den Wust von Daten nicht im µC (zwischen)zuspeichern, wofür der Platz eh nicht reichen würde.

manu_f
19.02.2007, 11:28
hallo,
hab jetzt noch mal die glcd-libs von avrlibs hergenommen.
darin gibts eine funktion die heißt:


void glcdWriteCharGr(u08 grCharIdx)
{
u08 idx;
u08 grLength;
u08 grStartIdx = 0;

// get starting index of graphic bitmap
for(idx=0; idx<grCharIdx; idx++)
{
// add this graphic's length to the startIdx
// to get the startIdx of the next one
grStartIdx += pgm_read_byte(FontGr+grStartIdx);
}
grLength = pgm_read_byte(FontGr+grStartIdx);

// write the lines of the desired graphic to the display
for(idx=0; idx<grLength; idx++)
{
// write the line
glcdDataWrite(pgm_read_byte(FontGr+(grStartIdx+1)+ idx));
}
}


leider weiß ich nicht was "u08 grCharIdx" sein soll...
eine grafik die dabei ist, sieht so aus:


#ifndef FONTGR_H
#define FONTGR_H

#ifndef WIN32
// AVR specific includes
#include <avr/pgmspace.h>
#endif

static unsigned char __attribute__ ((progmem)) FontGr[] =
{
// format is one character per line:
// length, byte array[length]
0x0B,0x3E,0x41,0x41,0x41,0x41,0x42,0x42,0x42,0x42, 0x3C,0x00,// 0. Folder Icon
0x06,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF // 1. Solid 6x8 block
};

#endif


würd mich über weitere hilfe sehr freuen!!
viele grüße,
manu

SprinterSB
19.02.2007, 12:19
Sorry, da kann ich auch nicht helfen wenn das Zeug nicht gscheit dokumentiert ist...

Vitis
19.02.2007, 20:39
aaalso,
ich hab gerade n Projekt, bei dem ich die Daten einer Kamera
mit dem AVR einlese in EDO-RAM zwischenspeichere und diese dann
probeweise auf n GLCD schreibe.
Der Haken bei der Geschichte ist die Ansteuerung des GLCD.
Hab da schon verschiedene verwendet und jedes wollte seine
eigene Ansteuerung, nen Treiber könnte man sagen.
Ohne zu wissen welches GLCd du hast kann man Dir nur
schwerlich helfen.

manu_f
19.02.2007, 20:52
hallo Vitis!

schön das sich doch noch jemand gefunden hat, der sich damit auskennt! :)

also ich habe ein glcd mit 2 ks0108 controllern. ich nutze derzeit die libs von avrlib. texte, striche, kreise, rechtecke zeichnen funktioniert alles, aber eine grafik ausgeben habe ich noch hinbekommen....
meines erachtens ist die funktion für das ausgeben einer grafik dafür zuständig?
void glcdWriteCharGr(u08 grCharIdx)

leider weiß ich nicht was "u08 grCharIdx" sein soll.

wie gibts du die grafiken aus?

viele grüße,
manu

Vitis
19.02.2007, 22:30
2x KS, das sind dann irgendwas um die 64 x 128, richtig?
ich ab gar keine Highlevelbefehle verwendet, sondern hab
eben die Grafik bit für bit zusammengesetzt.
Der Haken ist, dass 8Bit also 1 Byte immer geschrieben wird
und damit eben 8 Pixels gesetzt werden.
Du hast dann 2 Optionen, du schreibst immer eine Zeile durch,
gehst dann zurück zum ausgangspunkt, liest dann wieder die
bytes zurück und setzt die nächsten Linienpunkte, bis dann die
Page wieder durch ist, dann wechsel zur nächsten Page usw. usw.
zu beachten ist, dass Du in der Mitte des Displays eben den CS
wechseln musst ... ist etwas knifflig, aber geht.
Die andere Variante ist, das Du im RAM die Zeilen durchspringst
um das Byte zusammenzusetzen, das spart das rücklesen, ist
dadurch schneller ...
aber mal was Anderes, wo speicherst du die Displaydaten zwischen?

Aber erwarte nicht zu viel von der Graphik, es geht nur
1-Bit, also über Schwellenwert Bit setzen, darunter Bit löschen, also
den Grafikdot versteht sich.
mal schaun, ich schick später mal Bilder nach wie das bei mir aussieht.

manu_f
20.02.2007, 13:10
ja das display ist 128x64.

habs jetzt endlich geschafft mal die beispiel grafik auszugeben! :)
musste glcdWriteCharGr(1024); schreiben


static unsigned char __attribute__ ((progmem)) FontGr[] =
{
// format is one character per line:
// length, byte array[length]
0x0B,0x3E,0x41,0x41,0x41,0x41,0x42,0x42,0x42,0x42, 0x3C,0x00,// 0. Folder Icon
0x06,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF // 1. Solid 6x8 block
};


leider wars das auch schon. andere grafiken mag er nicht, so wie diese hier:


static unsigned char __attribute__ ((progmem)) grafik[] = {
0x42,0x4D,0xBE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3E,0x00,0x00,0x00,0x28,0x00,
0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x80,0x00,0x00,0x00,0xC4,0x09,0x00,0x00, 0xC4,0x09,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xE0,0xFF,0xFF,0xFF,0xDF,0x7F,
0xFF,0xFF,0xBF,0xBF,0xFF,0xFF,0xB1,0xBF,0xFF,0xFF, 0xB1,0xBF,0xFF,0xFF,0xBF,0xBF,
0xFF,0xFF,0xDF,0x7F,0xFF,0xFF,0xEE,0xFF,0xFF,0xFF, 0xEE,0xFF,0xFF,0xFF,0xEE,0xFF,
0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xEE,0xFF,0xFF,0xFF, 0xEE,0xFF,0xFF,0xFF,0xEE,0xFF,
0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xEE,0xFF,0xFF,0xFF, 0xEE,0xFF,0xFC,0x1F,0xEE,0xFF,
0xF8,0x1F,0xE0,0xFF,0xF3,0xFF,0xEE,0xFF,0xF3,0xFF, 0xEE,0xFF,0xF3,0xFF,0xEE,0xFF,
0xF3,0xFF,0xE0,0xF0,0x33,0xFF,0xEE,0xF0,0x33,0xFF, 0xEE,0xF3,0x33,0xFF,0xEE,0xF3,
0x38,0x1F,0xF1,0xF0,0x3C,0x1F,0xFF,0xF0,0x3F,0xFF, 0xFF,0xFF,0xFF,0xFF,0x00
};


jemand noch ne idee dazu? warum geht die erste und die zweite nicht?

viele grüße
manu

Vitis
20.02.2007, 16:28
weil Dein Array grafik anstatt FontGR heißt?

Die Die Daten kommen als 8-Bit grey Rohdaten, also unkomprimiert
von der Kamera (C-328) zeilenweise.
Das ist dann in etwa das BMP-Format, nur eben ohne den Header

manu_f
20.02.2007, 17:14
woa die bilder sehn ja mal super aus!!

ne daran kanns nicht liegen, hab überall in der funktion FontGr durch grafik ersetzt. hat die FontGr.h vllt irgendein anderes format als die grafik.h?

hast du auch den ks108 kontroller? wenn ja, könntest du mir bitte mal deine lib und die funktion zu ausgabe zukommen lassen? kann sowas leider noch nicht selbst programmieren!

viele grüße
manu

Vitis
20.02.2007, 18:40
ich hab keine Lib verwendet, alles zu Fuß und auch leider in Bascom,
aber das Prinzip ist das gleiche. Ach so, auch kein
KS0108, sondern n SED1531 seriell über SPI angeschlossen.
Aber das ist auch im Prinzip wurst.
Es geht im Wesentlichen im Nutzdaten und Steuerkommandos.
der KS0108 ist parallel angeschlossen, hat CS und diverse andere
Lines. Das Problem ist nur, welche Steuerleitung wann
zu welchem Zweck wie gesetzt wird.
Wenn Du Dir das Datenblatt mal anschaust ist der Rest keine
Sache mehr.

Helfen kann Dir zum testen u.U. :
http://www.geocities.com/dinceraydin/djgfxlcdsim/djgfxlcdsim.html

mark_kla
24.03.2007, 03:19
Hallo Vitis,
nach Deinem letzten Post hier, kannst du mir vielleicht (hoffentlich) weiterhelfen. Ich habe ebenfalls ein SED1531 an einem Grafischen LCD (auch das von Pollin, 121x62 Pixel) und möchte darauf eine Laufschrift anzeigen. Vielleicht könnte man das ja auch mit sich in der X-Achse verschiebenden Bildern machen.

Meine Frage: Welchen Chip hast du denn verwendet? Ich habe hier einen ATMega16 auf einem MiniArduino ( http://www.arduino.cc/en/Main/ArduinoBoardMini ), aber der USB Programmer (Fdti) wird unter Bascom nicht unterstützt, deshalb überleg ich, einen anderen Chip/Programmer zu kaufen. Denn Bascom wäre für mein Können glaub ich gerade recht ;-)
Die Library für SED Controller von Bascom hast du ja nicht verwendet?


Ein paar Tips wären super!
Das wär echt eine sehr große Hilfe!!!

Das hier ist das Ziel des Projekts:
http://www.digital.udk-berlin.de/de/projects/summer06/hauptstudium/sacraldesign/ticker.html
Aber ich ob es wirklich live geladene Kurse sind weiß ich nicht...

VIELEN DANK.