- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: bmp aufs glcd

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.09.2006
    Ort
    Bayer/Unterfranken
    Beiträge
    31

    bmp aufs glcd

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Geht es um die Beschreibung des MS BMP-Formats?

    https://www.roboternetz.de/phpBB2/ze...=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?
    Disclaimer: none. Sue me.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.09.2006
    Ort
    Bayer/Unterfranken
    Beiträge
    31
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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.
    Disclaimer: none. Sue me.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.09.2006
    Ort
    Bayer/Unterfranken
    Beiträge
    31
    hallo,
    hab jetzt noch mal die glcd-libs von avrlibs hergenommen.
    darin gibts eine funktion die heißt:
    Code:
    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:
    Code:
    #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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Sorry, da kann ich auch nicht helfen wenn das Zeug nicht gscheit dokumentiert ist...
    Disclaimer: none. Sue me.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    49
    Beiträge
    2.253
    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.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    09.09.2006
    Ort
    Bayer/Unterfranken
    Beiträge
    31
    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

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    49
    Beiträge
    2.253
    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.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    09.09.2006
    Ort
    Bayer/Unterfranken
    Beiträge
    31
    ja das display ist 128x64.

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

    Code:
    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:
    Code:
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus