www.mikrocontroller.net

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


Autor: Sebastian M. (noobuntu)
Datum:

Bewertung
0 lesenswert
nicht 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:
void T6963_writeString(int x, int y, unsigned char* text) {
  int i,j;
  T6963_setAdresspointer(GLCD_TEXT_BASE+GLCD_TEXT_ROWS*y+x);
  for (i=0; text[i]!= '\0'; i++);
  for (j=0; j<i; j++) {
    T6963_writeData(text[j]-0x20);  
    T6963_writeCommand(0xC0);  
  }
}
Folgende Codebeispiele
unsigned char text[5] = {'T', 'e', 's', 't', '\0'};
unsigned char string[] = "Noch ein Test";

T6963_writeString(0,5, string); //Auf dem Display wird "Noch ein Test" angezeigt
T6963_writeString(0,6, text);   //Auf dem Display wird "Test" angezeigt
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

Autor: Lehrmann Michael (ubimbo)
Datum:

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

Autor: blub (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das ist die Routine:
>
> void T6963_writeString(int x, int y, unsigned char* text) {
>   int i,j;
>   T6963_setAdresspointer(GLCD_TEXT_BASE+GLCD_TEXT_ROWS*y+x);
>   for (i=0; text[i]!= '\0'; i++);
>   for (j=0; j<i; j++) {
>     T6963_writeData(text[j]-0x20);
>     T6963_writeCommand(0xC0);
>   }
> }
> 
Du machst dir das Leben schwer...
//....
while(text[i])
{
     T6963_writeData(text[i]-0x20);
     T6963_writeCommand(0xC0);
     i++;
}
//...
(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?

Autor: Sebastian M. (noobuntu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian M. (noobuntu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: blub (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.