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
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.
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?
Was steht denn in der Zeile unmittelbar davor? Kannst Du mal den ganzen Code hier einfügen?
> 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 ;)
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
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?
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) { } }
Was macht der Slash nach den Includes? Das könnte es doch schon sein.
ich habe meine doch zeimlich ausführlichen Kommentare rausgenommen (damit es übersichtlicher wird), und da wohl einen vergessen...
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.
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.
misst.. vor dem PrintLCD("Hello World") habe ich ein spiPutGetByte(0x0a) (für neue Zeile) gelöscht. Ändert aber nichts am Ergebniss!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.