Hallo, Ich habe einige Funktionen zur Ansteuerung eines HD4470-kompatiblen (KS0070B) Displays geschrieben. Soweit funktioniert auch erstmal alles in der Hinsicht, Initialisierung, Screen löschen, Cursorposition setzen etc. Dazu habe ich jetzt eine Funktion lcd_print(), die einen nullterminierten String byteweise an das LCD schicken soll. Diese funktioniert allerdings nicht wie gewünscht, nach der Diskussion im IRC scheint alles darauf hinauszulaufen, dass der Pointer zum String auf irgendeine Weise "kaputtgeht". Auf dem LCD sehe ich statt der Zeichenkette nur Datenmüll, da der Pointer anscheinend nicht auf den String zeigt klappt's mit der Nullterminierung natürlich auch nur irgendwann zufallsweise. Kann jemand dazu was sagen? Es handelt sich hier um avr-gcc 3.4.3 mit AT Tiny 2313 bzw. dem älteren AT90S2313 (kein Unterschied festzustellen bei diesem Problem). Die Sourcen habe ich inkl. Makefile angehängt. Zusätzlich stehen sie noch online unter http://rafb.net/paste/results/URBZ2673.html .
Mit dem AVR-GCC habe ich (noch) keine Erfahrung, also nicht böse sein, wenn ich dummschwafele. Reduziert aufs wesentliche... ------- void lcd_print(char *str); void lcd_print(char *str) { while(*str) lcd_data(*str++); } void main(void) { lcd_print("Hello World!"); } ------- 1/ Sollte der Prototyp nicht void lcd_print(const char *str); sein, weil die Zeichenkette "Hello World!" read-only ist? 2/ Hast du schon probiert ein Assemblerfile zu erstellen? Dort sollte man genau sehen, was passiert. Mit dem normalen GCC geht das mit der Kommandooption -s (statt -o für Objektfile bzw. fertigem Programm). 3/ Hast du vielleicht ein Stackproblem (Größe?) bei der Übergabe als Funktionsargument? Probiere es mal ohne Stackübergabe... static char *s = "Hello World!"; void main(void) { lcd_print(s); }
Ja, so einen Fehler soll es geben. Probiere mal, das lcd_data(*str++) in 2 Zeilen (also str++ und lcd_data(*str)) zu schreiben. Gruß, Matthias
Ich würde mich MNR anschließen. Ne Anweisung wie lcd_data(*str++) ist gefährlich. Weisst du sicher, welcher Operator da Vorrang hat, der * oder das ++ ? Wird der Pointer inkrementiert oder der Inhalt der Speicherstelle? Es ist wesentlich sicherer, das in zwei Befehle zu zerlegen. Ausserdem machts den Code übersichtlicher. Tom
Da reichen "Angstklammern", um dem Compiler mitzuteilen, was man genau will: lcd_data(*(str++));
Ich beziehe mich auf dieses Problem: http://www.mail-archive.com/avr-gcc-list@nongnu.org/msg02248.html Das *str++ per se ok ist, ist schon klar. Allerdings bezieht sich obiges auf 3.4.5, es war auch nur eine Idee, was man probieren könnte. Gruß, Matthias
Jetzt gibt's was zu lachen. Das Problem hat sich nämlich erledigt, aber auf eine ziemlich lustige Weise. :-) Nichts mit GCC-Bugs, etc. Ich hatte nur vergessen, per objcopy die .data-section in mein .bin zu kopieren! Das erkennt man auch schön am Makefile - nur .text wird dort kopiert. Danke für den Hilfeversuch trotzdem an alle!
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.