Hallo Freunde, Hat jemand von euch die Library des KS0108 evtl. um die Funktions zum schreiben eines Bitmaps ergänzt ?!
Jan.H schrieb: > Hat jemand von euch die Library des KS0108 evtl. um die Funktions zum > schreiben eines Bitmaps ergänzt ?! Ja, irgendjemand sicher.
Jan.H schrieb: > wenn das mal alles so einfach währe :D > Wie muss ich denn da vor gehen ?! Bitmap bitweise auslesen. Ein Byte zusammenstellen und dieses an den KS0108 uebertragen. Genaue Datenanordnung aus dem Datenblatt vom KS0108 in Information bringen. Im Normalfall wird die Library eine Funktion beinhalten, mit der du einzelne Pixel setzen kannst. Die koenntest du dafuer verwenden.
das müsste doch eigentlich so gehen oder nicht ?! nur leider tut es das nicht :( void LoadBitmap(unsigned char *bitmap) { uint16_t i, j,by; for(i=0; i<64; i+=8) for(j=0; j<128; j++) { by=pgm_read_byte(bitmap++); ks0108GotoXY(j, i); ks0108WriteData(by); } }
Jan.H schrieb: > by=pgm_read_byte(bitmap++); Die unsigned char die du an die Funktion übergibst ist nicht im Flash. Vllt. könnte man Genaueres dazu sagen, wenn man wüsste welche Bibliothek du umbauen willst. Welchen Compiler, welchen µC?
:
Bearbeitet durch User
Max H. schrieb: > Jan.H schrieb: >> by=pgm_read_byte(bitmap++); > Diene unsigned char die du an die Funktion übergibst ist nicht im Flash. Wie meinst du das jetzt ?! Meinst du mein Bitmap?
Jan.H schrieb: > Max H. schrieb: >> Jan.H schrieb: >>> by=pgm_read_byte(bitmap++); >> Diene unsigned char die du an die Funktion übergibst ist nicht im Flash. > > Wie meinst du das jetzt ?! Meinst du mein Bitmap? Max H. schrieb: > Vllt. könnte man Genaueres dazu sagen, wenn man wüsste welche Bibliothek > du umbauen willst. > Welchen Compiler, welchen µC? Ich benutze einen Atmega32 / AVR - GCC / Bibliothek habe ich mal als .ZIP angehangen
Hast du es versuch geschaft mit der funktion ks0108WriteData(by); nur ein Streifenmuster zu zeichenen. Ca. so:
1 | ks0108WriteData(0x00); |
2 | ks0108WriteData(0xFF); |
3 | ks0108WriteData(0x00); |
4 | ks0108WriteData(0xFF); |
5 | ks0108WriteData(0x00); |
6 | ks0108WriteData(0xFF); |
7 | ks0108WriteData(0x00); |
8 | ks0108WriteData(0xFF); |
:
Bearbeitet durch User
Das klappt alles wunderbar... Ich kann auch Schriften mit div. Schriftarten anzeigen lassen...
Jan.H schrieb: > ...ap(unsigned char *bitmap) Ich weiß nicht wie es beim GCC für AVR ist, aber es kann sein, dass man Daten aus dem Progmem anders an die Funktion übergeben muss.
:
Bearbeitet durch User
Max H. schrieb: > Jan.H schrieb: >> ...ap(unsigned char *bitmap) > Ich weiß nicht wie es beim GCC für AVR ist, aber es kann sein, dass man > Daten aus dem Progmem anders an die Funktion übergeben muss. okay... was gibt es denn noch für möglichkeiten ?!
Jan.H schrieb: > okay... was gibt es denn noch für möglichkeiten ?! 1. Es mit einer kleinen Bitmap aus dem RAM versuchen 2. Nachsehen wie man bei AVR-GCC variablen aus dem Progmem übergibt
:
Bearbeitet durch User
Jan.H schrieb: > Ich kann auch Schriften mit div. Schriftarten anzeigen lassen... Na ja, genauer gesagt, die lib vom Fabian Thiele kann das, und du kannst das Beispielprogramm daraus laufen lassen. Im Netz gibt es einige libs für graphische Displays am AVR, die auch bitmaps anzeigen können. Auch wenn die nicht direkt für einen ks0108 sind, lassen die sich doch leicht anpassen. Bemüh halt google mal etwas ausführlicher. Oliver
void LoadBitmap(unsigned char *bitmap) { uint16_t i, j,by; for(i=0; i<64; i+=8) for(j=0; j<128; j++) { by=pgm_read_byte(bitmap++); ks0108GotoXY(j, i); ks0108WriteData(by); } } ______________________________________________________ der code klingt ja wirklich logisch... was ich noch nicht ganz so verstehe... ich rufe ja mit LoadBitmap die Funktion auf... Was muss ich denn dort noch für Parameter eingeben?! LoadBitmap(TestBMP); ?! Wie wird das verlinkt ?! Woher weiß die Funktion wo sich die Daten für das BMP befinden?
Vilex schrieb im Beitrag #3492288:
> Lern einfach programmieren....Dummkopf :P
Warum beleidigst Du eigentlich? Willst du direkt auf die Fresse oder
erst nach der Arbeit vorm Firmengelände?
Jan.H schrieb: > Max H. schrieb: >> Welches Programmiergerät hast du? > > AVR ISP MKII Sry. Der Post sollte in einen anderen Thread.
Das mit dem Bitmap, hat jetzt geklappt ;) Womit stelle ich ein das es auf dem ganzen GLCD nur einmal angezeigt wird ?! Mit i & j ?!
Der rechte Bildteil wird auch links angezeigt. Ich denke mir, dass irgendetwas mit CS1 und CS2 nicht stimmt. http://embedded-lab.com/blog/wp-content/uploads/2011/12/GLCD_Pages.jpg Was passiert, wenn du nur ein einzelnes Byte auf der rechten hälfte einschaltest? Und was wenn nur eines auf der linken? OT: Was ist eurer Meinung nach die kleinste vernünftige Schriftgröße für GLCD?
:
Bearbeitet durch User
Max H. schrieb: > Der rechte Bildteil wird auch links angezeigt. Ich denke mir, dass > irgendetwas mit CS1 und CS2 nicht stimmt. Normalen Test kann ich ja Prima ausgeben...
Ist das bitmap so gewollt wenn es nicht doppelt wäre? Oder ist es auch abgeschnitten? Falls ersteres ist es ganz einfach:
1 | void LoadBitmap(unsigned char *bitmap, uint8_t size_x, uint8_t size_y) |
2 | {
|
3 | uint16_t i, j,by; |
4 | for(i=0; i< size_y; i+=8) |
5 | |
6 | for(j=0; j< size_x; j++) |
7 | {
|
8 | by=pgm_read_byte(bitmap++); |
9 | ks0108GotoXY(j, i); |
10 | ks0108WriteData(by); |
11 | }
|
12 | }
|
die size könntest du natürlich auch am Anfang des Bitmaps im PROGMEM mitspeichern. LG, Sean
Sean Goff schrieb: > Ist das bitmap so gewollt wenn es nicht doppelt wäre? Oder ist es auch > abgeschnitten? Falls ersteres ist es ganz einfach: es ist so aber halt doppelt... muss ich die size nicht auch in der header datei schreiben?!
Bei meinem Beispiel musst du die Grösse beim Funktionsaufrauf angeben: LoadBitmap(bitmap, 64, 64); du könntest es aber auch z.B. so machen:
1 | void LoadBitmap(unsigned char *bitmap) |
2 | {
|
3 | uint8_t size_x = pgm_read_byte(0); |
4 | uint8_t size_y = pgm_read_byte(1); |
5 | uint16_t i, j,by; |
6 | for(i=0; i< size_y; i+=8) |
7 | |
8 | for(j=0; j< size_x; j++) |
9 | {
|
10 | by=pgm_read_byte(2 + bitmap++); |
11 | ks0108GotoXY(j, i); |
12 | ks0108WriteData(by); |
13 | }
|
14 | }
|
Dein Bitmap währe dann um 2 Bytes verschoben, und die ersten 2 Bytes enthalten die Grösseninformation.
Jetzt ist es auf einer Seite... nur leider sieht man jetzt nicht wirklich mehr eine schicke Animation...
Hmm 1 Mb ist ein bisschen gross... Aber lade doch mal dein gesamtes Projekt (inklusive .h bitmap) hoch, ich schaus mir mal an.
Sean Goff schrieb: > Hmm 1 Mb ist ein bisschen gross... > Aber lade doch mal dein gesamtes Projekt (inklusive .h bitmap) hoch, ich > schaus mir mal an. Bilder sind auch dabei!
Sean Goff schrieb: > Versuche es mal mit diesem .c, ich habe da so einen Verdacht. Ist immer noch das gleiche
1 | //************************************************************************
|
2 | // Bitmap.C
|
3 | //
|
4 | // Bitmaps an beliebige Position zeichnen
|
5 | //
|
6 | // Der Nullpunkt der Anzeige ist links oben
|
7 | //
|
8 | // hk@holger-klabunde.de
|
9 | // http://www.holger-klabunde.de
|
10 | // 08.10.2003
|
11 | // Compiler WinAVR 3.3
|
12 | //************************************************************************
|
13 | #include <avr/pgmspace.h> |
14 | |
15 | #include "protos.h" |
16 | |
17 | //##########################################################
|
18 | void LoadBitmap(unsigned char *bitmap,unsigned char xpos , unsigned char ypos, unsigned char width, unsigned char height) |
19 | {
|
20 | unsigned char bwidth,i,j,k,yp,xp; |
21 | unsigned char by,mask; |
22 | unsigned int xend; //xpos + width kann größer als 255 werden |
23 | |
24 | xend=(unsigned int)xpos + (unsigned int)width; |
25 | if(xend>LCD_WIDTH) xend=LCD_WIDTH; //Bitmap abschneiden wenn außerhalb des Displays |
26 | |
27 | bwidth=width/8; //Anzahl Bytes horizontal |
28 | if((width%8)!=0) bwidth++; //Bei Rest noch ein Byte mehr |
29 | |
30 | yp=ypos; |
31 | for(i=0; i<height; i++) //Über die gesamte Höhe |
32 | {
|
33 | xp=xpos; //Zum Beginn der Zeile |
34 | |
35 | for(j=0; j<bwidth; j++) //Über die gesamte Breite in Bytes |
36 | {
|
37 | by=pgm_read_byte(bitmap); |
38 | |
39 | mask=0x80; //Fängt bei MSB an |
40 | |
41 | for(k=0; k<8; k++) //Über ein Byte |
42 | {
|
43 | //Nur vorhandene und keine Füllpixel,-bytes zeichnen
|
44 | if(xp < (unsigned char)xend) |
45 | {
|
46 | SetPixel(xp,yp,(by & mask)); |
47 | xp++; |
48 | }
|
49 | |
50 | mask>>=1; //Nächstes Bit |
51 | }//for k |
52 | |
53 | bitmap++; |
54 | } //for j |
55 | |
56 | yp++; //Nächste Zeile |
57 | } //for i |
58 | }
|
Diese Funktion macht das richtig. Zumindest bei mir.
Nachtrag: SetPixel muss natürlich auch die Pages des GLCD berücksichtigen:
1 | //
|
2 | //Set a Pixel within the RAM-Buffer
|
3 | //val=0; Pixel clear
|
4 | //val=1; Pixel set
|
5 | //
|
6 | unsigned char SetPixel(unsigned int x, unsigned int y, unsigned char val ) |
7 | {
|
8 | unsigned char *p, tmp; |
9 | int idx; |
10 | |
11 | |
12 | |
13 | if(x >= LCD_WIDTH) return 1; //Out of bounds |
14 | if(y >= LCD_HEIGHT) return 1; |
15 | |
16 | |
17 | |
18 | idx = 0; |
19 | |
20 | idx = y/8; |
21 | |
22 | idx = idx * 64; |
23 | |
24 | if ( x <= 63 ) |
25 | idx += x; |
26 | else
|
27 | idx += (512 + ( x - 64)); |
28 | |
29 | if ( idx > 1023 || idx < 0){ |
30 | return 1; |
31 | }
|
32 | |
33 | |
34 | p = &Dis_Buf[ idx ]; |
35 | tmp = y % 8; |
36 | |
37 | if(val) |
38 | *p |= ( 1 << tmp); |
39 | else
|
40 | *p &= ~( 1 << tmp); |
41 | |
42 | return 0; |
43 | }
|
OldMen schrieb: > Nachtrag: > SetPixel muss natürlich auch die Pages des GLCD berücksichtigen:// > //Set a Pixel within the RAM-Buffer > //val=0; Pixel clear > //val=1; Pixel set > // > unsigned char SetPixel(unsigned int x, unsigned int y, unsigned char val > ) > { > unsigned char *p, tmp; > int idx; > > > > if(x >= LCD_WIDTH) return 1; //Out of bounds > if(y >= LCD_HEIGHT) return 1; würdest du vill. die .c & .h als .Zip anhängen?
also im header steht... void LoadBitmap(unsigned char *bitmap) im source file steht... void LoadBitmap(unsigned char *bitmap) { uint8_t i, j,by; for(i=0; i<64; i+=8) for(j=0; j<128; j++) { by=pgm_read_byte(bitmap++); ks0108GotoXY(j, i); ks0108WriteData(by); } } & dann kommt er mit so einer fehlermeldung ?! was ist da los ???
Hallo Jan, die Fehlermeldung: undefined reference to 'ks0108DrawBitmap' und der oben gepostete Code haben ja scheinbar erstmal nichst miteinander zu tun , ich vermute mal, du hast dir irgendwo eine ältere/unvollständige Library heruntergeladen und willst jetzt im Programm eine nicht enthaltene Funktion abrufen. Gruß, Micha
Micha schrieb: > Hallo Jan, > die Fehlermeldung: undefined reference to 'ks0108DrawBitmap' und der > oben gepostete Code haben ja scheinbar erstmal nichst miteinander zu tun > , ich vermute mal, du hast dir irgendwo eine ältere/unvollständige > Library heruntergeladen und willst jetzt im Programm eine nicht > enthaltene Funktion > abrufen. > > Gruß, > Micha Wenn ich den Code im Hauptprogramm schreibe funktioniert alles... Wieso kann ich die Funktion so nicht einfach in die .c Datei schreiben und in dem Header sie dann aufrufen ?!
Micha schrieb: > Jan, > einfache Frage: > WO definierst du denn die Funktion ks0108DrawBitmap() ? Ich möchte eine neue Funktion einfügen... void LoadBitmap(unsigned char *bitmap) { uint8_t i, j,by; for(i=0; i<64; i+=8) for(j=0; j<128; j++) { by=pgm_read_byte(bitmap++); ks0108GotoXY(j, i); ks0108WriteData(by); } }
Micha schrieb: > Jan, > einfache Frage: > WO definierst du denn die Funktion ks0108DrawBitmap() ? Ich habe das aktuelle Programm noch mal mit angehangen! Ist vill. einfacher dort gleich alles sich an zu schauen... Definiert wird sie ja in meiner Header... die Funktion steht im Quellcode
Ah ja, die Funktion ks0108DrawBitmap() wird also in "ks0108.c" definiert wie auch die Funktion LoadBitmap() dort definiert wird; wieso hast du eigentlich die LoadBitmap-Funktion im Hauptprogramm nochmal definiert ? Als Assembler-Freak ohne AVR-GCC Kenntnisse würde ich jetzt sagen, da wird was nicht gelinkt. Sind denn die beiden C-Source-Dateien in deinem Projekt richtig eingetragen ? Wenn die nicht zusammen compiliert werden , können die ja auch nicht gelinkt werden, nicht wahr.
muss ich, wenn ich in der .c Datei was änder auch die .c Datei in meinem Hauptprogramm #includen?!
Mahlzeit ! Das ist es ja eben, was ich bzgl. AVR-GCC auch nicht weiß. Kann hier leider auch nicht "auf die Schnelle" ein neues Studio installieren, da Atmel mir noch keinen Download-Schlüssel geschickt hat. Wenn ich aber in der "Linker Address Map" im .\debug-Verzeichnis nachschaue, finde ich keinen Eintrag zu 'ks0108DrawBitmap()' ! War da nicht was mit dem Aufruf von "make clean" oder so, was den Compiler zwingt, alle zu verlinkenden Dateien nochmal neu zu übersetzen ?
Wenn ich das Makefile mal nach <makefile_lesen.txt> kopiere und dann darin lese finde ich: C_SRCS += \ ../GLCD_17.01.2014.c \ ../ks0108.c ... OBJS += \ GLCD_17.01.2014.o \ ks0108.o Übrigens, wenn man das Datum der verschiedenen Dateien im .\debug-Verzeichnis betrachtet, ist ks0108.c wohl tatsächlich nicht neu übersetzt worden. Da hakt es also.
Jan, nach der Installation des Studios kommt bei mir folgendes raus: ------ Clean started: Project: GLCD_17.01.2014, Configuration: Debug AVR ------ Build started. Project "GLCD_17.01.2014.cproj" (Clean target(s)): Target "Clean" in file "C:\Programme\Atmel\Atmel Studio 6.1\Vs\Compiler.targets" from project "C:\Dokumente und Einstellungen\Micha\Eigene Dateien\AVR_TESTDIR\JAN\GLCD_17.01.2014\GLCD_17.01.2014\GLCD_17.01.2014. cproj" (entry point): Using "RunCompilerTask" task from assembly "C:\Programme\Atmel\Atmel Studio 6.1\Extensions\Application\AvrGCC.dll". Task "RunCompilerTask" C:\Programme\Atmel\Atmel Studio 6.1\shellUtils\make.exe clean rm -rf GLCD_17.01.2014.o ks0108.o rm -rf GLCD_17.01.2014.d ks0108.d rm -rf "GLCD_17.01.2014.elf" "GLCD_17.01.2014.a" "GLCD_17.01.2014.hex" "GLCD_17.01.2014.lss" "GLCD_17.01.2014.eep" "GLCD_17.01.2014.map" "GLCD_17.01.2014.srec" Done executing task "RunCompilerTask". Done building target "Clean" in project "GLCD_17.01.2014.cproj". Done building project "GLCD_17.01.2014.cproj". Build succeeded.
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.