Forum: Projekte & Code Library KS0108


von Jan.H (Gast)


Lesenswert?

Hallo Freunde,

Hat jemand von euch die Library des KS0108 evtl. um die Funktions zum 
schreiben eines Bitmaps ergänzt ?!

von Jan.H (Gast)


Lesenswert?

wenn das mal alles so einfach währe :D
Wie muss ich denn da vor gehen ?!

von Max H. (hartl192)


Lesenswert?

Jan.H schrieb:
> Hat jemand von euch die Library des KS0108 evtl. um die Funktions zum
> schreiben eines Bitmaps ergänzt ?!

Ja, irgendjemand sicher.

von Jan.H (Gast)


Lesenswert?

:D
Könntet ihr diese hier mal hochladen?!

von Max H. (hartl192)


Lesenswert?

Das Thema hatten wir am Dienstag schon einmal:
Beitrag "KS0108 GLCD BITMAP Funktion"

von Richard Zink (Gast)


Lesenswert?

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.

von Jan.H (Gast)


Lesenswert?

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);
                                }
}

von Max H. (hartl192)


Lesenswert?

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
von Jan.H (Gast)


Lesenswert?

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?

von Jan.H (Gast)


Angehängte Dateien:

Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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
von Jan.H (Gast)


Lesenswert?

Das klappt alles wunderbar...

Ich kann auch Schriften mit div. Schriftarten anzeigen lassen...

von Max H. (hartl192)


Lesenswert?

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
von Jan.H (Gast)


Lesenswert?

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 ?!

von Max H. (hartl192)


Lesenswert?

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
von Oliver (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

Welches Programmiergerät hast du?

von Jan.H (Gast)


Lesenswert?

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?

von anton (Gast)


Lesenswert?

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?

von Jan.H (Gast)


Lesenswert?

Max H. schrieb:
> Welches Programmiergerät hast du?

AVR ISP MKII

von Max H. (hartl192)


Lesenswert?

Jan.H schrieb:
> Max H. schrieb:
>> Welches Programmiergerät hast du?
>
> AVR ISP MKII

Sry. Der Post sollte in einen anderen Thread.

von Jan.H (Gast)


Angehängte Dateien:

Lesenswert?

Das mit dem Bitmap, hat jetzt geklappt ;)
Womit stelle ich ein das es auf dem ganzen GLCD nur einmal angezeigt 
wird ?! Mit i & j ?!

von Max H. (hartl192)


Lesenswert?

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
von Jan.H (Gast)


Lesenswert?

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...

von Sean G. (atmega318)


Lesenswert?

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

von Jan.H (Gast)


Lesenswert?

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?!

von Sean G. (atmega318)


Lesenswert?

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.

von Jan.H (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt ist es auf einer Seite... nur leider sieht man jetzt nicht 
wirklich mehr eine schicke Animation...

von Sean G. (atmega318)


Lesenswert?

Hmm 1 Mb ist ein bisschen gross...
Aber lade doch mal dein gesamtes Projekt (inklusive .h bitmap) hoch, ich 
schaus mir mal an.

von Jan.H (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Sean G. (atmega318)


Angehängte Dateien:

Lesenswert?

Versuche es mal mit diesem .c, ich habe da so einen Verdacht.

von Jan.H (Gast)


Lesenswert?

Sean Goff schrieb:
> Versuche es mal mit diesem .c, ich habe da so einen Verdacht.

Ist immer noch das gleiche

von Sean G. (atmega318)


Angehängte Dateien:

Lesenswert?

Nächster Versuch...

von Jan.H (Gast)


Lesenswert?

Sean Goff schrieb:
> Nächster Versuch...

also das ändert leider auch nichts :(

von Sean G. (atmega318)


Lesenswert?

Aber ohne Animation funktioniert es?

von Jan.H (Gast)


Lesenswert?

genau das gleiche :D

von OldMen (Gast)


Lesenswert?

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.

von OldMen (Gast)


Lesenswert?

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
}

von Jan.H (Gast)


Lesenswert?

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?

von Jan.H (Gast)


Angehängte Dateien:

Lesenswert?

Kann mir mal jemand diesen Fehler erklären ?!

von Jan.H (Gast)


Lesenswert?

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 ???

von Micha (Gast)


Lesenswert?

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

von Jan.H (Gast)


Lesenswert?

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 ?!

von Micha (Gast)


Lesenswert?

Jan,
einfache Frage:
WO definierst du denn die Funktion ks0108DrawBitmap() ?

von Jan.H (Gast)


Lesenswert?

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);
  }

}

von Jan.H (Gast)


Angehängte Dateien:

Lesenswert?

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

von Micha (Gast)


Lesenswert?

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.

von Jan.H (Gast)


Lesenswert?

muss ich, wenn ich in der .c Datei was änder auch die .c Datei in meinem 
Hauptprogramm #includen?!

von Micha (Gast)


Lesenswert?

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 
?

von Micha (Gast)


Lesenswert?

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.

von Micha (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.