Im Anhang mein bisheriges Werk, es funktioniert (wahrscheinlich) nur mit einem myAVR-Board aber die Funktion sollte ersichtlich sein: Es wird über TWI an einem LM75 die Temperatur zum AtMega8L übertragen und danach an einem LCD ausgegeben bzw. das SOLLTE passieren. Wenn man nun in der Funktion twi_readTemp direkt (!) die Ausgabe programmiert (über lcd_out() ) dann funktioniert alles, sobald man aber die ausgelesene Temperatur als char zurückgibt und in der main() an das LCD schicken will funktioniert nichts mehr bzw. das LCD zeigt nichts an. Habe ich etwa im Bereich C/C++ etwas falsch verstanden oder gibt es in Bezug auf avr-gcc etwas bestimmtes beim Zurückgeben von Werten zu beachten?
Ich glaube, du solltest das Kapitel über Datentypen in irgendeinem Grundlagenwerk zu C nocheinmal durchlesen. twi_readTemp() liefert ein char zurück, lcd_out() erwartet einen Zeiger auf char. &t ist die Speicheradresse der Variablen t. Strings werden in C mit \0 beendet.
> lcd_out() erwartet einen Zeiger auf char. &t ist die > Speicheradresse der Variablen t. Strings werden in C mit \0 beendet. Schön. Und jetzt? Soll mir das helfen? Tut es nicht, du gibst nur wahllos Fakten wieder ...
gep0wnter N00b wrote: > du gibst nur > wahllos Fakten wieder ... nö, da steht ziemlich genau (d)ein Fehler in deinem Programm
>Wenn man >nun in der Funktion twi_readTemp direkt (!) die Ausgabe programmiert >(über lcd_out() ) dann funktioniert alles Soviel zum Thema "Adressoperator hat nichts mit Pointer zu tun", hm? :-)
Kann mir sonst noch jemand helfen? Vorzugsweise jemand der weiss was Pointer & Adressoperatoren sind und wie sie funktionieren? :-)
>Habe ich etwa im Bereich C/C++ etwas falsch verstanden Ja. >oder gibt es in >Bezug auf avr-gcc etwas bestimmtes beim Zurückgeben von Werten zu >beachten? Nein. (avr-)gcc spricht reines C. >Kann mir sonst noch jemand helfen? Vorzugsweise jemand der weiss was >Pointer & Adressoperatoren sind und wie sie funktionieren? :-) Steht doch schon alles weiter oben. Dein Problem sind nicht Pointer und Operatoren, sondern die Darstellung von Strings in C. Oliver
du versucht eine String (mehre Zeichen) in ein zeichen zu speichern und überschreibst dir damit den Stack: char zahl = twi_receive(0); itoa((int)zahl, &zahl, 10);
> du versucht eine String (mehre Zeichen) in ein zeichen zu speichern und > überschreibst dir damit den Stack: Nö. Das ist genau EIN Zeichen, 8 Bit; exakt ausgedrückt: eine vorzeichenbehaftete, 1 Byte lange Zahl im Wertebereich zwischen -50 und +150. Ich kapiere nicht was ihr immer mit Strings wollt, ich benutze NIRGENDSWO Strings. lcd_out() kann zwar durch einen String iterieren, aber dabei wird auch jedes Zeichen einzeln (!) rausgehauen, und das sogar noch im 4Bit-Modus. Wenn man die Temperatur in twi_readTemp direkt an das LCD sendet FUNKTIONIERT ES! Es hat nichts mit Strings zu tun denn ansonsten würde es ja auch nicht funktionieren. Es muss irgendein Problem bei der Werteübergabe sein
Ich versuche es noch einmal zu erklären: char zahl = twi_receive(0); damit hat die variable zahl die größe von einem byte kann also werte von 0-255 aufnehmen (oder auch -127 - +127) dann willst du mit itoa((int)zahl, &zahl, 10); das ganze in ein String umwandlen. Doku zum itoa The itoa function convert the digits of the given value argument to a null-terminated character string. Das heist die funktion will einen string an die speicherstelle von &zahl speichern der MINDESTENS als 2 zeichen besteht. Wenn Zahl 0 ist dann erzeugt itoa einen string mit '0' + 0x0 bei 150 sind es dann schon 4 Zeichen '1' + '5' + '0' + 0x0 Da aber in Zahl nur für ein Zeichen platz ist überschreibst du den STack. Nochetwas: Mit ((int)zahl Sagst du den Compiler das zahl eine int - also 2byte gross ist, dann versucht er auch 2byte von zahl zu lesen, was zu einem falschen ergebniss führt weil zahl ja nur 1byte gross ist.
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.