c pointer / array problem bei GLCD

OP Persönliche Seite #1251218
Lesenswert?

Hallo zusammen,

ich bin dabei ein Grafik-Display anzusteuern - was auch wunderbar geht.

Jetzt bin ich dabei ein Bitmap aus einem Array auszugeben
Das Array ist wie folgt aufgebaut:
1
const int8 Logo[] = {
2
0xF8, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,... }

Das möchte ich jetzt mit dieser Funktion ausgeben:
1
void display_bitmap(int16 *bitmap, unsigned char x, unsigned char y, unsigned char dx, unsigned char dy) {
2
  unsigned char i, j;
3
  int16 zhl = 0;
4
  for(j = 0; j < dy / 8; j++) {
5
    display_goto(x,y + j);
6
    for(i = 0; i < dx; i++) {
7
      display_write(bitmap++,DATA);
8
      //display_write(Logo[zhl++],DATA);
9
    }
10
  }
11
}

Wenn ich die Funktion aufrufe mit der auskommentierten Zeile 
(display_write(Logo[zhl++],DATA)) dann zeigt er mir das Logo auch an... 
Nur wenn ich die Funktion aufrufe und als Parameter das Logo angebe, 
dann kommt vom CCS-Compiler die Fehlermeldung "Attempt to create a 
pointer to a constant".

Der Aufruf erfolgt so:
1
display_bitmap(Logo,0,0,128,25);
Kann mir da jemand auf die Sprünge helfen?

Gruß,
 Tobias
OP Persönliche Seite #1251246
Lesenswert?

Klaus Wachtler schrieb:
> neben char* wie erwähnt wirst du ja nicht den Zeiger ausgeben wollen,
> sondern das, worauf er zeigt, oder?
> Also ein Sternchen dazu (vermute ich): display_write(*bitmap++,DATA)

Das ist korrekt ;-)

Leider kommen dann auch nur wirre Zeichen am LCD an...

wieso klappt es mit "display_write(logo[zhl++])" und nicht mit pointer?

Gruß,
 Tobias
OP Persönliche Seite #1251263
Lesenswert?

Oliver schrieb:
>>const int8 Logo[]
> und
>>display_bitmap(int16 *bitmap...
>
> passt nicht zusammen.
>
> Was sagt er denn zu
>
1
display_bitmap(const int8 *bitmap...
>
> Wenn es mit dem const Probleme gibt, lass es halt weg.
>
> Oliver

Das const einfach weglassen? Das ist ja auch keine Lösung, dann habe ich 
unnötig RAM verschwendet - der sowieso schon sehr klein ist.
#1251279
Lesenswert?

Deine Funktion muss so aussehen
1
void display_bitmap( const int8 *bitmap,
2
                     unsigned char x, unsigned char y,
3
                     unsigned char dx, unsigned char dy)
4
{
5
  unsigned char i, j;
6

7
  for(j = 0; j < dy / 8; j++) {
8
    display_goto(x,y + j);
9
    for(i = 0; i < dx; i++) {
10
      display_write(*bitmap++,DATA);
11
    }
12
  }
13
}
Gast #1251291
Lesenswert?

>Das ist ja auch keine Lösung, dann habe ich
>unnötig RAM verschwendet - der sowieso schon sehr klein ist.

Aha...

Ich kenne den CCS-Compiler und dessen Umgang mit der 
AVR-Harvard-Architektur nicht, aber das könnte eine Ursache des Problems 
sein (abgesehen vom sowieso falschen Pointer-Typ). Was sagt den die 
Compiler-Doku, wie man mit FLASH-Pointern umzugehen hat? Landet jedes 
const automatisch im FLASH?

Oliver
OP Persönliche Seite #1251324
Lesenswert?

Das gleiche habe ich auch gerade im Manual gelesen...
dort steht aber noch folgendes:
1
Placing a string into ROM
2
const char cstring[6]={"hello"}
3
Creating pointers to constants
4
const char *cptr;
5
cptr = string;

Leider funktioniert das bei mir nicht...
Er sagt für die Zeile "const char *cptr" immer "Expecting ="


Sollte eine Lösung meines Problems wirklich nicht möglich sein?
#1251360
Lesenswert?

Tobias John schrieb:
> Sobald ich das "const" vor "int8 *bitmap" schreibe bekomme ich über 40
> Fehlermeldungen "Expecting a close paren" vom CCS

Was ist mit
1
void display_bitmap( const unsigned char *bitmap,
2
                     unsigned char x, unsigned char y,
3
                     unsigned char dx, unsigned char dy)
4
{
5
  ...
6
}

um mal die 'Unbekannte' int8 wegzubekommen.
OP Persönliche Seite #1251403
Lesenswert?

Karl heinz Buchegger schrieb:
> Tobias John schrieb:
>> Sobald ich das "const" vor "int8 *bitmap" schreibe bekomme ich über 40
>> Fehlermeldungen "Expecting a close paren" vom CCS
> Was ist mit
>
1
> void display_bitmap( const unsigned char *bitmap,
2
>                      unsigned char x, unsigned char y,
3
>                      unsigned char dx, unsigned char dy)
4
> {
5
>   ...
6
> }
7
>
> um mal die 'Unbekannte' int8 wegzubekommen.

Gibt genau die gleichen Fehler...
#1251469
Lesenswert?

Die Funktion "display_write" übernimmt die fraglichen Daten "by value"
wie das Funktionieren der auskommentierten Zeile zeigt.
In der Zeile

 display_write(bitmap++,DATA);

wird der Zeiger einfach weitergeschaltet, ohne Arraydaten an die 
Funktion zu übergeben. Wie schon erwähnt, sollte die Zeile

 display_write(*bitmap++,DATA);

lauten.
Falls das Problem weiterhin besteht, ist es einen Versuch wert, mit 
einem
temporären Zeiger zu arbeiten:

void display_bitmap(int16 *bitmap,....)
{  int16 *t;
   .
   .
  t=bitmap;
   .
  display_write(*t++, DATA);
   .
  usw
}

mfg
#1251480
Lesenswert?

Tobias schrieb:
> Hat niemand eine Idee wie ich ein Bitmap mit dem CCS-Compiler aus dem
> ROM auslesen kann? Das muss doch gehen!

Doku lesen.
Du verlässt hier den Pfad dessen, was mit Standard-C Mitteln abgedeckt 
wird. Laut C-Standard ist

> void display_bitmap( const unsigned char *bitmap,
>                      unsigned char x, unsigned char y,
>                      unsigned char dx, unsigned char dy)
> {
>   ...
> }

richtig.
Allerdings dürfte dein Compiler const irgendwie speziell behandeln. Also 
bleibt dir nichts anderes übrig als die Doku zu studieren, was sich die 
Compilerbauer dabei gedacht haben.

Oder aber es findet sich zufällig jemand, der diesen Compiler benutzt 
und da schon mal durchgegangen ist.
Gast #1251496
Lesenswert?

>Hat niemand eine Idee wie ich ein Bitmap mit dem CCS-Compiler aus dem
>ROM auslesen kann? Das muss doch gehen!

Das Problem ist ja nicht das bitmap im Rom, sondern dessen Übergabe als 
Funktionsparameter.

Was sagt der Comiler denn hierzu:
1
void display_bitmap(const int8 bitmap[], unsigned char x, unsigned char y, unsigned char dx, unsigned char dy) {
2
  unsigned char i, j;
3
  int16 zhl = 0;
4
  for(j = 0; j < dy / 8; j++) {
5
    display_goto(x,y + j);
6
    for(i = 0; i < dx; i++) {
7
       display_write(bitmap[zhl++],DATA);
8
    }
9
  }
10
}
Gast #1251525
Lesenswert?

Oh mann...

Die CCS-Doku ist ja unterirdisch. Jede Menge Text, aber nicht zu 
verstehen, und sinnlose Minimal-Beispiele. Das oben gezeigte ist so 
eins, Schreibfehler drin (string != cstring), und anscheinend lässt es 
sich ja noch nicht mal kompilieren.

Egal, vermutlich geht das mit dem Rom-Zugriff über ein Kombination von 
label_adress(...) und read_program_memory(...). Vielleicht aber auch 
ganz anders, die Doku ist da mehr als kryptisch.

Oliver
OP Persönliche Seite #1251835
Lesenswert?

Hab die LÖSUNG!

Eine Tabelle vom Typ "char ROM" mit den Daten des Bitmaps.
1
char ROM Logo[25][16] = {
2
0xF8, 0xFC, 0xFE, 0xFE, 0xFE, 0xFE,.... }

Die Funktion zum Bitmap schreiben sieht dann so aus:
1
void display_bitmap(char ROM *bitmap, unsigned char x, unsigned char y, unsigned char dx, unsigned char dy) {
2
  unsigned char i, j;
3
  for(j = 0; j < dy / 8; j++) {
4
    display_goto(x,y/8 + j);
5
    for(i = 0; i < dx; i++) {
6
      display_write(*(bitmap++),DATA);
7
    }
8
  }
9
}

Der Aufruf sieht nun so aus:
1
display_bitmap(Logo,0,20,128,25);


Gruß,
 Tobias

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