mikrocontroller.net

Forum: Compiler & IDEs avr-gcc Funktions-Rückgabewerte


Autor: gep0wnter N00b (Gast)
Datum:
Angehängte Dateien:

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

Autor: Marco S (Gast)
Datum:

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

Autor: gep0wnter N00b (Gast)
Datum:

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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gep0wnter N00b wrote:

> du gibst nur
> wahllos Fakten wieder ...

nö, da steht ziemlich genau (d)ein Fehler in deinem Programm

Autor: gep0wnter N00b (Gast)
Datum:

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

Autor: gep0wnter N00b (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir sonst noch jemand helfen? Vorzugsweise jemand der weiss was 
Pointer & Adressoperatoren sind und wie sie funktionieren? :-)

Autor: Oliver (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: gep0wnter N00b (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: gep0wnter N00b (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, eben ging mir ein Licht auf, danke.

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.