Forum: Mikrocontroller und Digitale Elektronik c pointer / array problem bei GLCD


von Tobias J. (tobiasjohn) Benutzerseite


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

von Peter (Gast)


Lesenswert?

test mal mit:

void display_bitmap( const int16 *bitmap, ...

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Peter schrieb:
> test mal mit:
>
> void display_bitmap( const int16 *bitmap, ...

Dann gibt es eine ganze Reihe von Fehlermeldungen vom Compiler...
"Expecting a close paren"

von Klaus W. (mfgkw)


Lesenswert?

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)

von Oliver (Gast)


Lesenswert?

>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

von Tobias J. (tobiasjohn) Benutzerseite


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

von Tobias J. (tobiasjohn) Benutzerseite


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.

von Karl H. (kbuchegg)


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
}

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

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

von Oliver (Gast)


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

von Oliver (Gast)


Lesenswert?

Und alles zurück :-)

Ist ja gar kein AVR, sondern ein PIC. Wobei, die Problematik bleibt. 
Zugriff ins FLASH statt ins RAM.

Oliver

von Oliver (Gast)


Lesenswert?


von Benedikt K. (benedikt)


Lesenswert?

Sehe ich das richtig, dass der CCS keine Pointer auf Werte im Flash kann 
da er die Zugriffe auf den Flash zur Compilezeit erkennt und 
entsprechend umsetzt, womit obige Lösung nicht möglich wäre?

von Tobias J. (tobiasjohn) Benutzerseite


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?

von 12er Dude (Gast)


Lesenswert?

Hallo,

da kann ich mit dem Compiler fühlen.

Besser ist
1
...
2
const char *cptr = string;

Tschü Dude

von Karl H. (kbuchegg)


Lesenswert?

12er Dude schrieb:
> Hallo,
>
> da kann ich mit dem Compiler fühlen.

Nicht wirklich.
Aus C-Sicht ist daran nichts falsches.

von Karl H. (kbuchegg)


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.

von Tobias J. (tobiasjohn) Benutzerseite


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

von G. O. (aminox86)


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

von Tobias (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


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
}

von Oliver (Gast)


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

von Tobias J. (tobiasjohn) Benutzerseite


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

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.