Library KS0108

Gast #3492251
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.
Gast #3492271
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);
                                }
}
Gast #3492293
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
Angehängte Dateien:
#3492305
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);
Gast #3492318
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
Gast #3492346
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?
#3492504
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?
#3492521
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
#3492541
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.
Gast #3492663
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.
Gast #3492674
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
}
Gast #3492695
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?
Gast #3492900
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 ???
Gast #3493061
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
Gast #3493231
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 ?!
Gast #3493272
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);
  }

}
Gast #3493452
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.
Gast #3493516
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 
?
Gast #3493542
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.
Gast #3493857
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren