String übergeben mit Pointer

Gast #573197
Lesenswert?

Hallo liebe µC Gemeinde!

Ich schlage mich hier schon seit Stunden mit Pointern usw. rum, und 
hoffe jetzt auf Hilfe... Ich denke es ist ein ganz doofer Fehler...
Es geht um die Ausgabe von Text auf einem Display. Ich habe eine 
Funktion:

char putSPIByte(char c)

Ich schaffe es, einen einzelnen Buchstagen darüber auszugeben:

putSPIByte('A');

Jetzt dachte ich mir, weil ich das früher auf einem Atmel schon einmal 
gemacht hatte, ich erstelle folgende Funktion:

void PrintLCD(char* ptr)
{
    while(*ptr != 0)
    {
        putSPIByte(*ptr);
    }
}

und mache folgendes:

PrintLCD('Hello Word');

Nur tut sich da gar nichts... Kann mir jemand Helfen?

Hardware: PIC 18F6627
Software: MPLAB mit C18 Compiler

Danke für die Hilfe,
Gruß Steve
Gast #573202
Lesenswert?

Du musst den ptr auch erhöhen:
1
while ( *ptr ) {
2
        putSPIByte( *ptr++ );
3
}

Sonst hast du eine Endlosschleife.

Außerdem:
1
PrintLCD( "Hello World" );

Auf die Anführungszeichen achten. ' ist für char-Konstanten, " für char 
*-Konstanten.
Gast #573209
Lesenswert?

danke für die Antwort.

Den Pointer hatte ich auch erhöht, falsch hier reingetippt. Habe jetzt 
die ' durch " ersetzt, geht aber immer noch nicht. Der Compiler gibt mir 
auch eine Warnung aus:

type qualifier mismatch in assignment

Bezogen auf die Zeile PrintLCD( "Hello World" );

Noch eine Idee?
Gast #573219
Lesenswert?

Gut, dann hier mal der komplette Code:

char spiPutGetByte(char c) {
  char ret;
  unsigned char mask;

  SPI_CLK = 0;

  SPI_CS = 0;

  NOP();

  mask = 0x80;
  ret = 0;

  do {
    SPI_OUT = 0;
    if (c & mask) SPI_OUT = 1;
    SPI_CLK = 1;
    if (SPI_IN) ret |= mask;
    NOP();NOP();
    SPI_CLK = 0;
    mask = mask >> 1;
    NOP();NOP();
    } while (mask != 0);

  NOP();NOP();

  SPI_CS = 1;
  return ret;
}

Funktionieren tut hiermit:

spiPutGetByte('A');

Meine Idee:

void PrintLCD(char* ptr)
{
    while(*ptr != 0)
    {
      spiPutGetByte(*ptr++);
    }
}

Geht nicht:

PrintLCD("Hello World");

Die Warnung bezieht sich wirklich auf diese Zeile. Wenn ich die lösche, 
verschwindet auch die Warnung.

Steve
Gast #573227
Lesenswert?

Es fehlt immer noch der ganze Code. Es geht nicht um die einzelnen 
Funktionen. Damit man den Fehler im Compiler nachvollziehen kann, müsste 
man vor allen Dingen den Code um PrintLCD sehen...

In welchem Zusammenhang ruftst Du PrintLCD auf? Fehlt vielleicht ein 
Semikolon in der Zeile davor?
Gast #573236
Lesenswert?

OK, sorry.

Hier folgt nun der komplette Code. Das Programm klappt wie gesagt durch 
den direkten Aufruf von spiPutGetByte('H') (auf dem LCD erscheint in den 
ersten zwei Zeilen Hello und World. In der dritten Zeile sollte dann 
eigentlich Hello World stehen...
Beim compilieren kommt die Warnung:
Warning [2066] type qualifier mismatch in assignment (für die Zeile 
PrintLCD("Hello World"))



#include <p18f6621.h>
#include <compiler.h>
#include <string.h>
#include <stdlib.h>


/
#define SPI_OUT LATF6
#define SPI_IN LATF7
#define SPI_CLK LATF4
#define SPI_CS LATF5

char spiPutGetByte(char c) {
  char ret;
  unsigned char mask;

  SPI_CLK = 0;
  SPI_CS = 0;
  NOP();

  mask = 0x80;
  ret = 0;

  do {
    SPI_OUT = 0;
    if (c & mask) SPI_OUT = 1;
    SPI_CLK = 1;
    if (SPI_IN) ret |= mask;
    NOP();NOP();
    SPI_CLK = 0;
    mask = mask >> 1;
    NOP();NOP();
    } while (mask != 0);

  NOP();NOP();
  SPI_CS = 1;
  return ret;
}

void PrintLCD(char* ptr)
{
    while(*ptr != 0)
    {
      spiPutGetByte(*ptr++);
    }
}


void main(void)
{

  CMCON = 0x07;
  ADCON1 = 0x07;
  TRISF_RF4 = 0;
  TRISF_RF5 = 0;
  TRISF_RF6 = 0;

  spiPutGetByte(0xf5); //Sync byte
  spiPutGetByte(0x20); //Backlight aus

  spiPutGetByte(0xf5); //Sync byte
  spiPutGetByte(0x8C); //LCD löschen


  spiPutGetByte(0xf5); //Sync byte
  spiPutGetByte(0x80); //Command für Strings
  spiPutGetByte('H');
  spiPutGetByte('e');
  spiPutGetByte('l');
  spiPutGetByte('l');
  spiPutGetByte('o');
  spiPutGetByte(0x0a); //Command für nächste Linie
  spiPutGetByte('W');
  spiPutGetByte('o');
  spiPutGetByte('r');
  spiPutGetByte('l');
  spiPutGetByte('d');
  spiPutGetByte(0x0a); //Command für nächste Linie

  PrintLCD("Hello World");

while(1)
{
}

}
Gast #573248
Lesenswert?

Sind alle Kommentare sauber geschlossen? Oder vielleicht verschachtelt 
(und der Compiler kommt damit nicht zurecht)?

Gut wäre es, mal wirklich das Original-File (so wie Du es auch zum 
Kompilieren verwendest) als Attachment hier zu haben.
Gast #573282
Lesenswert?

DAAANKE vorFreudealleNachbarngeweckt

Vielen Dank! Die Warnung kommt zwar immer noch... aber was ist schon 
compilieren ohne Warnungen! Es klappt aber wunderbar!

Einen schönen Abend,
Grüße vom Bodensee

Steve

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