Hallo will nun endlich loslegen mit meinen Ledsee 320x240 display. Display ist initialisiert 34 Layer nur Grafik. kreise und linien in den Layern kann ich schon zeichnen. nun will ich einige anzeigen Analog als bitmap erstellen und diese dann in den 3 Layer als bild laden. habe mir das ganze mit corel draw gezeichnet. Mein erstes Problem wenn ich das Bitmap auf 320x240 pixel anpasse siht es nicht schön aus. siehe anhang. kann man das irendwie besser machen???? wie bekomme ich das bild in ein gcc h file so wie beim font generator???? Vielen Dank Gruß Andy
> kreise und linien in den Layern kann ich schon zeichnen. Ein Bitmap bestehet aber nur aus Punkten. > Mein erstes Problem wenn ich das Bitmap auf 320x240 pixel anpasse siht > es nicht schön aus. siehe anhang. > kann man das irendwie besser machen???? In dieser Grösse zeichnen, oder als Vektorgrafik erzeugen (z.B. mit Inkscape) und dann ein Bitmap erzeugen. > wie bekomme ich das bild in ein gcc h file so wie beim font > generator???? Da musst du dir wohl ein (einfaches) Programm schreiben und z.B. das Bitmap als "Bit"map speichern (z.B. hart im Code). Also ein Array mit 320x440=140'800 Bits = 17600 Bytes, das du dann eins zu eins auf das Display überträgst (Farbe oder Grautönen werdens natürlich mehr). Es sei denn du willst die Linien als Linien und die Kreise als Kreise Zeichnen, dann gibst du das wohl am Besten gleich so im Code ein, jede Figur als ein Funktionsaufruf. Hat aber nur beschränkte Vorteile.
Hallo Danke bin gerade am herunterladen von inkscape. habe mal testhalber mit vectormagic das jpg vectorisiert und es siht erstaml gut aus . werde noch mal ein bissle testen. Vielen Dank Gruß Andy
Hallo also mit inkscape kann ich sehr gut arbeiten aber wenn ich exportiere als Bitmap (PNG) und es in ein C Header file exportiere sieht es wieder unscharf und unsauber im Display aus. Ich komme infach so nicht weiter benutze den grafikconverter von leubisoft. Gibt es noch andere converter ???? danke Gruß Andy
Das Bild, das du angehängt hast, ist keine Bitmap, sondern hat Graustufen. Wenn du die bei einer Konvertierung wieder wegmachst, dürfte das recht häßlich aussehen.
Hallo Ich will eigendlich so etwas erreichen aber ich bekomme es nicht mit einem Bitmap hin. Es wird wohl mir nichts anderes übrig bleiben als es im Code zu zeichnen. Werde mich mal mit Bresenham beschäftigen. gibt es irgend ein toll was mir von einen Bresenham Algo ein Ziffernblatt in eine Struct schreibt???? Danke Andy
Hallo habe mal in paint ein paar freihand striche für das Ziffernblatt gemalt und die sehen auf dem Display klar und deutlich aus weil si schwarz sind und der hintergrund weiß. im Inkscape ist zwar auch alles scharz weiß aber beim export werden graustufen draus gemacht das geht natürlich nicht. Ich habe auch nichts gefunden womit man in incscape schwarz weiß exportiert.
Andreas Herrmann schrieb: > im Inkscape ist zwar auch alles scharz weiß aber beim export werden > graustufen draus gemacht das geht natürlich nicht. Das Problem sitzt also vor dem REchner ;) Du kannst in Inkscape einstellen, wie er die Bilder behandeln soll. Stell das mal auf True Color um. Frag jetzt nich wie und wo - Google ist dein Freund (oder eben Paint).
Hallo Ja das Problem saß vor dem rechner habe es mit Corel Draw hinbekommen. Was ich jetz noch habe ist das ich immer nur 8 bit in x richtung den Coursor setzten kann. einzelne Pixel kann ich punktgenau setzten. hier mal der COde ist aus der SED Lib //Berechnen der STartadresse Layer= Display Layer 1-4 void GLCD_GraphicGoTo_pix(unsigned int x, unsigned int y,unsigned int layer) { if(layer==1)GLCD_SetCursorAddress(SED1335_GRAPHICSTART1 + (y*40) + x/8); if(layer==2)GLCD_SetCursorAddress(SED1335_GRAPHICSTART2 + (y*40) + x/8); if(layer==3)GLCD_SetCursorAddress(SED1335_GRAPHICSTART3 + (y*40) + x/8); } //Coursor ADresse setzten void GLCD_SetCursorAddress(unsigned int address) { GLCD_WriteCommand(SED1335_CSRW); GLCD_WriteData((unsigned char)(address & 0xFF)); GLCD_WriteData((unsigned char)(address >> 8)); } //Daten aus Array einlesen Fontdarstellung void GLCD_char(char * bmp, int x, int y, int width, int height,unsigned int layer) { unsigned int i, j; for(i = 0; i < height ; i++) { GLCD_GraphicGoTo_pix(x, y+i,layer); GLCD_WriteCommand(SED1335_MWRITE); for(j = 0; j < width/8; j++) GLCD_WriteData(GLCD_ReadByteFromROMMemory(bmp+j+(i*(width/8)))); } } // Aufruf zum zeichnen GLCD_char(&tanksym,5,145,16,16,1); beginnend soll er ab x=5 machen tut er aber bei 0 wenn ich statt 5 eine 10 setzte beginnt er statt 10 bei 8 18=16 usw immer volle 8ten.Y richtung ist io. irgendwass stimmt bei den adress berechnungen nicht. //bild daten onst prog_char tanksym[] = { 0x03, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x82, 0x01, 0x82, 0x01, 0xC2, 0x01, 0xC2, 0x01, 0x83, 0xFF, 0x83, 0xFF, 0x83, 0xFF, 0xC3, 0xFF, 0x7F, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, }; // hIer das Pixel stzten das geht wunderbar pixel x=5 display auch auf 5 das gleiuche in Y richtung void GLCD_SetPixel(unsigned int x,unsigned int y, int color,int layer) { unsigned char tmp = 0; unsigned int address; if(layer==1)address=SED1335_GRAPHICSTART1 + (40 * y) + (x/8); if(layer==2)address=SED1335_GRAPHICSTART2 + (40 * y) + (x/8); if(layer==3)address=SED1335_GRAPHICSTART3 + (40 * y) + (x/8); GLCD_SetCursorAddress(address); GLCD_WriteCommand(SED1335_MREAD); tmp = GLCD_ReadData(); if(color) tmp |= (1 << (SED1335_FX - (x % 8))); else tmp &= ~(1 << (SED1335_FX - (x % 8))); GLCD_SetCursorAddress(address); GLCD_WriteCommand(SED1335_MWRITE); GLCD_WriteData(tmp); } Danke Gruß Andy
Andreas Herrmann schrieb: > Was ich jetz noch habe ist das ich immer nur 8 bit in x richtung den > Coursor setzten kann. Das wird wohl daran liegen, dass dein Grafik LCD so organisiert ist, dass jeweils 8 nebeneinander liegende Pixel zu einem Byte zusammengefasst sind. Du hast ein paar Möglichkeiten * entweder du verzischtest darauf, dass du deine Anzeige an jeder beliebigen Position anzeigen lassen kannst. Sprich: Du legst alles so aus, dass jede Bitmap immer auf einer 8-er Grenze beginnt * oder du legst dir 8 Bitmaps bereit in der die Anzeige jeweils um 1 Pixel verschoben ist * oder du schreibst dir eine Bitmap Anzeigefunktion, die eine Bitmap auch um 1 Pixel verschoben anzeigen kann. Sprich, die die Bits per Bedarf durchrotiert, so dass sich wieder alles ausgeht * oder du zeichnest deine Skalen per Kreisbogen und Linien-Kommandos Und wenn ich mir so ansehe, wie lange du da jetzt schon rumdoktorst wäre das nicht die schlechteste Lösung. Zumal da ja auch viele der Funktionen sowieso brauchst um den Zeiger auch noch reinzumalen.
Hallo habe es mit Corel draw hinbekommen der grundstock steht jetzt will ich eine Tabell erstellen die mir die x2,y2 koordinaten vom ursprung des Zeigers erstellt und per line funktion darstellt als Zeiger x = center.x + cos(alpha) * radius; y = center.y + sin(alpha) * radius; ich habe pixelwerte center.x=137 center.y=134 radius=113 werte in pixel. alpha von 180-70 grad. will ich die x und y bestimmen für 180 grad rechne ich doch x=137+-1*113 x=24 y=134+0*113 y=134 habe nun die tabelle fertig in zwei arrays x und y. übergebe nur die geschwindigkiet z.b 13kmh suche den wert an stelle 13 im array und zeichne die linie geht supi. Danke Gruß Andy
Andreas Herrmann schrieb: > habe nun die tabelle fertig in zwei arrays x und y. würd ich nicht tun. Tabelle, ja. Aber da dann die Sinus/Cosinus Werte für den Winkel. Den Rest (ausmultiplizeren) dann im Programm. Bei mehreren Instrumenten hast du sonst massenhaft Tabellen. Und wenn dein Zeiger dann irgendwann nicht mehr nur ein einfacher Strich ist, werden deine Tabellen immer komplexer, unübersichtlicher und größer. Einfach: Sinus/Cosinuswerte -127 entspricht -1 +127 entspricht +1 (dann brauchst du nur 1 Byte für Sin/Cos) und dann einfach x = center.x + myCos(alpha) * radius / 127; y = center.y + mySin(alpha) * radius / 127; |127| als Normierung für +-1 wird für deine kleinen Radien mehr als genug sein. Sinus und Cosinus sind um 90° pahsenverschoben. Man kann also dieselbe Tabelle benutzen. Aus Symetrieüberlegungen reicht es auch aus, nur eine Tabelle für Winkel von 0 bis 90° anzulegen, der Rest entsteht durch Spiegelung bzw. Symetrien. Du scheinst wahnsinnige Scheu davor zu haben, in deinem Programm ein wenig zu rechnen. Zu unrecht. µC können rasend schnell rechnen. So schnell kannst du nicht schauen. Im Grunde könnte man auch ganz einfach sin/cos in Floating Point zur Laufzeit ausrechnen und du wirst keinen Unterschied bemerken, solange du nicht mehr als, sagen wir mal 20 Anzeigen auf dem Display hast.
Hallo Werde es mal probieren die Werte im µc zu berechnen. Ich habe im endeffekt nur ein Tacho Drehzahlmesser und Tankuhr 2x. der rest ist Schrift + Zahlen. Danke Gruß ANdy
Andreas Herrmann schrieb: > Hallo > > Werde es mal probieren die Werte im µc zu berechnen. Probiers gleich mit Floating Point. Die Rechenzeit kannst du dir leisten, solange bis sich rausstellt, dass es doch nicht reicht. Aber da ist noch lange Zeit hin. > > Ich habe im endeffekt nur ein Tacho Drehzahlmesser :-) Dachte ich mir schon. Wird nicht lange dauern, bis du mit dem einfachen Strich als Zeiger nicht mehr zufrieden bist. Wie wärs mit einer schönen Raute, die sich um den 0-Puntk dreht, oder einem Dreieck, das sich (natürlich jeweils richtig gedreht) entlang des Bogens bewegt?
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.