Forum: Mikrocontroller und Digitale Elektronik KS0108 Grafik anzeigen


von SIG (Gast)


Lesenswert?

Hallo, ich wollte mit der Lib von Ape ein Glcd ansteuern.
Nun hänge ich aber daran diegrafik anzuzeigen da kommt folgender Fehler
../main.c:21: error: incompatible type for argument 1 of 
'ks0108WriteData'
kann mir jemand helfen

gruß SIG

ach hier noch meine main.C
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <avr/pgmspace.h>
4
5
#include "ks0108.h"
6
#include "bild.h"
7
8
9
10
11
int main(void) {
12
  volatile uint16_t i;
13
  struct font bild;
14
  
15
  for(i=0; i<15000; i++);
16
  
17
  
18
  
19
  ks0108Init();
20
  ks0108GotoXY(0,0);
21
  ks0108WriteData(bild);
22
23
  while(1);
24
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Hallo, ich wollte mit der Lib von Ape ein Glcd ansteuern.

Die hier? 
Beitrag "KS0108 GLCD Routinen"

Darin ist kein "bild.h" und man kann deinen Quelltext nicht kompilieren.

Die ks0108WriteData dort hat als Prototyp:
void ks0108WriteData(uint8_t data);

Dein übergebenes Argument bild mit Datentyp struct font ist da wirklich 
seltsam: Adresse statt Bytewert. Man würde so etwas erwarten:
1
uint8_t bild[MAXBYTES] PROGMEM = { ... }; // Initialisierte Werte eintragen
2
3
int main(void)
4
{
5
  // for(i=0; i<15000; i++); durch _delay_ms(...) ersetzen!
6
  ks0108Init();
7
  ks0108GotoXY(0,0);
8
  for (uint16_t i = 0; i < MAXBYTES; i++)
9
  {
10
    ks0108WriteData( pgm_read_byte( bild+i ) );
11
  }
12
  while(1);
13
}

ADD: Siehe auch Beitrag "Bitmap auf KS0108"

von SIG (Gast)


Lesenswert?

Stefan B. schrieb:
> Die hier?

Ja genau das!

Stefan B. schrieb:
> ADD: Siehe auch Beitrag "Bitmap auf KS0108"

Habemal das ausprobiert sieht so aus:
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <avr/pgmspace.h>
4
5
#include "ks0108.h"
6
#include "bild.h"
7
8
{
9
    ks0108ClearScreen();
10
11
    int offset = 0;
12
    int y = 0;
13
    int x =0;
14
15
    for(y=0; y<63 ;y=y+8)
16
    {
17
      for(x=0; x<64 ;x++)
18
      {
19
        ks0108GotoXY(0, 0);
20
        ks0108WriteData(ImageMap[offset]);
21
        offset++;
22
      }
23
    }
24
    
25
    for(y=0; y<63 ;y=y+8)
26
    {
27
      for(x=63; x<128 ;x++)
28
      {
29
        ks0108GotoXY(0, 0);
30
        ks0108WriteData(ImageMap[offset]);
31
        offset++;
32
      }
33
    }
34
}
und habe jetzt folgende fehlermeldung
../main.c:8: error: expected identifier or '(' before '{' token


Bin noch ein Anfänger also nicht Steinigen wegen den für manche Dumme 
fragen

von SIG (Gast)


Lesenswert?

Stefan B. schrieb:
> for (uint16_t i = 0; i < MAXBYTES; i++)

wofür steht bei dir eigentlich MAXBYTES???

von Karl H. (kbuchegg)


Lesenswert?

SIG schrieb:

> Habemal das ausprobiert sieht so aus:
> [c]
> #include <inttypes.h>
> #include <avr/io.h>
> #include <avr/pgmspace.h>
>
> #include "ks0108.h"
> #include "bild.h"
>
> {
>     ks0108ClearScreen();

Wo ist da das

int main()


> ../main.c:8: error: expected identifier or '(' before '{' token
>

Geh in die Zeile 8 und sieh nach was dort steht.
Wenn dir in der Zeile unmittelbar selber nix auffällt, dann untersuch 
auch mal die Zeilen davor.
Und siehe da: Ooops da ist der Funktionskopf mysteriöserweise 
verschwunden.

>
> Bin noch ein Anfänger also nicht Steinigen wegen den für manche Dumme
> fragen

Steinigen nicht.
Aber du solltest dir im klaren sein, dass ein GLCD nicht unbedingt etwas 
anfängertaugliches ist.

von Karl H. (kbuchegg)


Lesenswert?

SIG schrieb:
> Stefan B. schrieb:
>> for (uint16_t i = 0; i < MAXBYTES; i++)
>
> wofür steht bei dir eigentlich MAXBYTES???

Für die Anzahl der Bytes in den Daten

Siehe
1
...
2
uint8_t bild[MAXBYTES] PROGMEM = { ... }; // Initialisierte Werte eintragen
3
...

von Sascha W. (sascha_w)


Lesenswert?

SIG schrieb:
1
>     for(y=0; y<63 ;y=y+8)
2
>     {
3
>       for(x=0; x<64 ;x++)
4
>       {
5
>         ks0108GotoXY(0, 0);
6
>         ks0108WriteData(ImageMap[offset]);
7
>         offset++;
8
>       }
9
>     }
immer wieder
1
ks0108GotoXY(0, 0);  ?????

Sascha

von SIG (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wo ist da das
>
> int main()

danke jetzt sind die Fehler eg aber mein Atega 16 ist jetzt zu 100,3% 
voll kann das sein?

Sascha Weber schrieb:
> SIG schrieb:>     for(y=0; y<63 ;y=y+8)
>
>>     {
>
>>       for(x=0; x<64 ;x++)
>
>>       {
>
>>         ks0108GotoXY(0, 0);
>
>>         ks0108WriteData(ImageMap[offset]);
>
>>         offset++;
>
>>       }
>
>>     }
>
>
> immer wiederks0108GotoXY(0, 0);  ?????
>
> Sascha

was möchtest du mir damit sagen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

SIG schrieb:

> danke jetzt sind die Fehler eg aber mein Atega 16 ist jetzt zu 100,3%
> voll kann das sein?

Alles kann sein.

Aber zum Nachvollziehen und Erklären müsste man genauer wissen, was du 
machen willst und was du machst.

Und so lange wie Quellcode (Definition von ImageMap), Dateien (bild.h) 
fehlen und genaue Infos, was du wie machst, kann man das nicht.

Für mich sieht es im Moment so aus, als ob ImageMap komplett im RAM 
liegt, statt wie in meinem Vorschlag im FLASH. Dass du dann irgendwo in 
Probleme reinläufst ist wahrscheinlich. Ich vermute die 100.3% 
beziehen sich aufs RAM, oder?

Überleg mal, wann du die Info gegeben hast, dass du einen Atmega16 
benutzt... wieviel RAM hat der? Wie gross wäre ein Bild auf dem GLCD 
128x128 = 2KB? Go figure.

Und von den Compilereinstellungen und dem genauen Typ des GLCD und 
dessen Datenblatt usw. sind wir noch meilenweit entfernt...

>>>       for(x=0; x<64 ;x++)
>>>       {
>>>         ks0108GotoXY(0, 0);
>>>         ks0108WriteData(ImageMap[offset]);
>>>         offset++;
>>>       }
> was möchtest du mir damit sagen?

Dass es sinnlos ist, ein Bild auf das Display zu schreiben und bei jedem 
Byte (= 8 Bildpunkte) immer zurück an Position 0,0 zu springen. Wenn du 
das willst, wären nämlich 8 LEDs ausreichend.

von holger (Gast)


Lesenswert?

>Wenn du das willst, wären nämlich 8 LEDs ausreichend.

Könnte man doch ein schönes Schütteldisplay draus bauen;)

von ISG (Gast)


Angehängte Dateien:

Lesenswert?

Ich wollte erstmal nur ein Bild auf dem GLCD anzeigen.
ich habe das Display von Pollin 124x64
http://www.pollin.de/shop/dt/NTc1OTc4OTk-/Bauelemente/Aktive_Bauelemente/Displays/LCD_Modul_TG12864B_03.html

Stefan B. schrieb:
>>>>         ks0108GotoXY(0, 0);

Ich dachte ich müsste hier angeben wo er das Bild setzten muss

Im anhang noch den Ordner wo ich alles drin habe

Ich Proggramiere mit dem AVR Studio4

von holger (Gast)


Lesenswert?

Dein bild.h belegt 1kB RAM.
Pack es ins PROGMEM (Flash).

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Mach es wie Holger schreibt. S. Anhang, ist aber ungetestet
1
AVR Memory Usage
2
----------------
3
Device: atmega16
4
5
Program:    2556 bytes (15.6% Full)
6
(.text + .data + .bootloader)
7
8
Data:          3 bytes (0.3% Full)
9
(.data + .bss + .noinit)

Das Bildformat in bild.h ist seltsam und IMHO komplizierter als nötig in 
main.c zu verarbeiten. Eigentlich sind die Routinen in der Lib so 
geschrieben, dass man die 128x64 linear adressieren kann. Die Aufteilung 
auf Chip0 und Chip1 und das Hochzählen der XY Position kann die Lib 
alleine machen. Bin aber nicht tiefer eingestiegen.

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.