mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik String übergeben mit Pointer


Autor: Steve (Gast)
Datum:

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

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst den ptr auch erhöhen:
while ( *ptr ) {
        putSPIByte( *ptr++ );
}

Sonst hast du eine Endlosschleife.

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

Auf die Anführungszeichen achten. ' ist für char-Konstanten, " für char 
*-Konstanten.

Autor: Steve (Gast)
Datum:

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

Autor: Florian (Gast)
Datum:

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

Autor: PinkPanther (Gast)
Datum:

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

Autor: Steve (Gast)
Datum:

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

Autor: Florian (Gast)
Datum:

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

Autor: Steve (Gast)
Datum:

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

}

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht der Slash nach den Includes?

Das könnte es doch schon sein.

Autor: Steve (Gast)
Datum:

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

Autor: Florian (Gast)
Datum:

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

Autor: egal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier es mal mit:

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

Autor: Steve (Gast)
Datum:
Angehängte Dateien:

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

Autor: Steve (Gast)
Datum:
Angehängte Dateien:

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

Ändert aber nichts am Ergebniss!

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da haben wir es:

http://ww1.microchip.com/downloads/en/devicedoc/MP...

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.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... dann natürlich strcpypgm2ram( s, "Hello World" );

Autor: Steve (Gast)
Datum:

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

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.