Forum: Mikrocontroller und Digitale Elektronik [Pic] C18 Probleme mit Strings


von Sebastian M. (noobuntu)


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

von Lehrmann M. (ubimbo)


Lesenswert?

Welcher Compiler?
Besitzt dieser Compiler auch die entsprechende String library oder heißt 
sie da vll. anderst. ?

von blub (Gast)


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?

von Sebastian M. (noobuntu)


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.

von Michael H. (morph1)


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.

von Sebastian M. (noobuntu)


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.

von Michael H. (morph1)


Lesenswert?

Ja leider, das ist einer der Hauptgründe wieso ich von den 18ern weg 
bin.

Du kannst höchstens vorm Aufruf eine der prog2mem copy Funktionen 
aufrufen und den String ins RAM holen.

Die 24er haben dank PSV und GCC-Compiler keinerlei Probleme mehr mit 
sowas.

von blub (Gast)


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.

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.