Forum: Mikrocontroller und Digitale Elektronik String übergeben mit Pointer


von Steve (Gast)


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

von Florian (Gast)


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.

von Steve (Gast)


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?

von Florian (Gast)


Lesenswert?

Was steht denn in der Zeile unmittelbar davor? Kannst Du mal den ganzen 
Code hier einfügen?

von PinkPanther (Gast)


Lesenswert?

> type qualifier mismatch in assignment
> Bezogen auf die Zeile PrintLCD( "Hello World" );

das ist keine zuweisung, der fehler muss irgendwo davor im code sein, du 
noob ;)

von Steve (Gast)


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

von Florian (Gast)


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?

von Steve (Gast)


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)
{
}

}

von Florian (Gast)


Lesenswert?

Was macht der Slash nach den Includes?

Das könnte es doch schon sein.

von Steve (Gast)


Lesenswert?

ich habe meine doch zeimlich ausführlichen Kommentare rausgenommen 
(damit es übersichtlicher wird), und da wohl einen vergessen...

von Florian (Gast)


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.

von egal (Gast)


Lesenswert?

probier es mal mit:

void PrintLCD(const char* ptr)
{
....

von Steve (Gast)


Angehängte Dateien:

Lesenswert?

War schon dabei, den Code "aufzuräumen".
Die angehängte Datei habe ich soeben noch einmal compiliert (Warnung wie 
beschrieben) und getestet (1. Zeile "Hello", 2. "World", 3. leer)

Danke für die Geduld.

von Steve (Gast)


Angehängte Dateien:

Lesenswert?

misst.. vor dem PrintLCD("Hello World") habe ich ein spiPutGetByte(0x0a) 
(für neue Zeile) gelöscht.

Ändert aber nichts am Ergebniss!

von Florian (Gast)


Lesenswert?

Da haben wir es:

http://ww1.microchip.com/downloads/en/devicedoc/MPLAB_C18_Users_Guide_51288j.pdf

2.7.3 String Constants

void PrintLCD( auto const rom char *ptr )

sollte helfen.

Alternativ, wenn Du diese String selbst aus dem Programm befüllen willst 
(später):

char s[ 20 ];

strcpy( s, "Hello World" );
PrintLCD( s );

Dann allerdings PrintLCD so lassen.

von Florian (Gast)


Lesenswert?

... dann natürlich strcpypgm2ram( s, "Hello World" );

von Steve (Gast)


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

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.