[Pic] C18 Probleme mit Strings

OP #1926351
Lesenswert?

Hallo alle zusammen,

zur Zeit versuche ich ein Display mit t6968 Controller mit einem 
p18f4520 zum Laufen zu bringen.

Das Display anzusteuern funktioniert soweit einwandfrei. Das Problem ist 
das Anzeigen von Zeichenketten. Die write_String Funktion macht 
eigentlich auch das was sie soll, aber nur manchmal.

Das ist die Routine:
1
void T6963_writeString(int x, int y, unsigned char* text) {
2
  int i,j;
3
  T6963_setAdresspointer(GLCD_TEXT_BASE+GLCD_TEXT_ROWS*y+x);
4
  for (i=0; text[i]!= '\0'; i++);
5
  for (j=0; j<i; j++) {
6
    T6963_writeData(text[j]-0x20);  
7
    T6963_writeCommand(0xC0);  
8
  }
9
}
Folgende Codebeispiele
1
unsigned char text[5] = {'T', 'e', 's', 't', '\0'};
2
unsigned char string[] = "Noch ein Test";
3

4
T6963_writeString(0,5, string); //Auf dem Display wird "Noch ein Test" angezeigt
5
T6963_writeString(0,6, text);   //Auf dem Display wird "Test" angezeigt
6
T6963_writeString(0,7, "Schon wieder ein Test"); //Es werden nur wirre Zeichen auf dem Display angezeigt, außerdem beschwert sich der Compiler "suspicious pointer conversion".

Der selbe Code funktioniert auf einem Atmega ohne Probleme! Woran könnte 
das liegen?

mfg
sebastian
Gast #1926432
Lesenswert?

> Das ist die Routine:
>
1
> void T6963_writeString(int x, int y, unsigned char* text) {
2
>   int i,j;
3
>   T6963_setAdresspointer(GLCD_TEXT_BASE+GLCD_TEXT_ROWS*y+x);
4
>   for (i=0; text[i]!= '\0'; i++);
5
>   for (j=0; j<i; j++) {
6
>     T6963_writeData(text[j]-0x20);
7
>     T6963_writeCommand(0xC0);
8
>   }
9
> }
10
>
Du machst dir das Leben schwer...
1
//....
2
while(text[i])
3
{
4
     T6963_writeData(text[i]-0x20);
5
     T6963_writeCommand(0xC0);
6
     i++;
7
}
8
//...
(Kann man Code nur unpraktischerweise mit Leertaste einrücken?)

Wozu dienen "-0x20" und der Aufruf von writeCommand? (Ich kenne den Chip 
nicht.)

> Der selbe Code funktioniert auf einem Atmega ohne Probleme! Woran könnte
> das liegen?
Am Compiler? Wie heißt der?
OP #1926466
Lesenswert?

Lehrmann Michael schrieb:
> Welcher Compiler?
> Besitzt dieser Compiler auch die entsprechende String library oder heißt
> sie da vll. anderst. ?

Als Compiler verwende ich den MPLAB C18 C v3.36. Welche String Libraries 
sollte ich den includen?

> Du machst dir das Leben schwer...//....
> (Kann man Code nur unpraktischerweise mit Leertaste einrücken?)
> Wozu dienen "-0x20" und der Aufruf von writeCommand? (Ich kenne den Chip
> nicht.)

Ich weis. Zum Glück ist der Code nicht von mir... Ich versuche ihn nur 
auf Pic zu portretieren und zu vereinfachen.

Also die "-0x20" sind dafür, weil der Controller nicht die normalen 
ASCII Tabelle unterstützt und man deshalb 0x20 vom ASCII Wert abziehen 
muss, damit er das richtige anzeigt. Mit dem writeCommand(0xC0) springt 
er eine Speicheradresse weiter.
#1926469
Lesenswert?

das liegt am C18, der macht keinen Unterschied wo ne Variable liegt.

Der Controller aber schon, also musst du es dem Compiler mitteilen!

such in der Beschreibung des Compilers nach: "const rom", du musst 
Funktionen die statische Strings übernehmen mit diesem Typen als Pointer 
versehen.
OP #1926494
Lesenswert?

Michael H. schrieb:
> das liegt am C18, der macht keinen Unterschied wo ne Variable liegt.
>
> Der Controller aber schon, also musst du es dem Compiler mitteilen!
>
> such in der Beschreibung des Compilers nach: "const rom", du musst
> Funktionen die statische Strings übernehmen mit diesem Typen als Pointer
> versehen.

Vielen Dank. Es hat funktioniert. Aber d.h. das ich 2 Funktionen 
brauche, eine für statische Strings und die andere für nicht statische?

Den versuche ich jetzt ein nicht statischen String anzuzeigen werden nur 
komische Zeichen angezeigt.
Gast #1926515
Lesenswert?

> Also die "-0x20" sind dafür, weil der Controller nicht die normalen
> ASCII Tabelle unterstützt und man deshalb 0x20 vom ASCII Wert abziehen
> muss, damit er das richtige anzeigt. Mit dem writeCommand(0xC0) springt
> er eine Speicheradresse weiter.
Danke für die Info.

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