avr-gcc Funktions-Rückgabewerte

Gast #1193147
Lesenswert?

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?
Angehängte Dateien:
Gast #1193164
Lesenswert?

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.
Gast #1193170
Lesenswert?

> 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 ...
Gast #1193181
Lesenswert?

>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? :-)
Gast #1193252
Lesenswert?

>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
Gast #1193270
Lesenswert?

> 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
Gast #1193279
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren