www.mikrocontroller.net

Forum: Compiler & IDEs AVR DS1820 temperaturen vergleichen


Autor: Johannes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte mir eine Heizungssteuerung bauen.
Dazu verwende ich den AVR Net-IO Bausatz von Pollin mit einem Atmega32.
Um die Temperaturen der verwendeten DS1820 Temperatursensor auszulesen, 
benutze ich die Routine von Peter Dannegger (Build mit -xc).

Zu Testzwecken verwende ich 2 DS1820 die beide erkannt und per UART 
ausgegeben werden.
Um am LCD die beiden Temperaturen anzuzeigen verwende ich eine if 
Schleife, die bei der jeweiligen ID des Sensors die Temperatur an 
unterschiedlichen Stellen am Display ausgibt.
(entweder durch temp1 oder temp2 | siehe Anhang TEMPMEAS.C)

Soweit funktioniert alles einwandfrei.


Doch sobald ich die Variablen temp1 mit temp2 vergleichen möchte,
dann komme ich nicht weiter.

Mir ist aufgefallen, dass wenn ich temp1 und temp2
hintereinander ausgebe (am Ende von TEMPMEAS.C),
dass beide den gleichen Wert haben.

Woran liegt das, bzw. wie kann ich das ändern
und warum wird am LCD-Display jeweils der korrekte Wert ausgegeben?

Womöglich ist die Unterscheidung durch die letzte ID-Stelle sehr 
umständlich,
allerdings bin ich durch meine C Einsteigerkenntnisse nicht weiter 
gekommen.

Erstmals Danke fürs Durchlesen!

mfg
Johannes

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Prototyp von uputs ist zwar nirgendwo zu sehen, aber ich wette, dass 
diese Funktion einen String erwartet. Du kannst der Funktion nicht 
einfach einen int geben, und dann eine sinnvolle Ausgabe erwarten. Du 
musst den int erst in einen String umwandeln.

http://www.mikrocontroller.net/articles/FAQ#Wie_ka...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, ich sehe ja jetzt erst, dass du diese beiden ints als Zeiger 
"missbrauchst". Stört es dich gar nicht, vom Compiler mit Warnungen 
überschüttet zu werden?

PS: Und du bekommst den selben Output, weil beide "Zeiger" auf den 
selben Speicherbereich zeigen.

Autor: Johannes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ja, uputs erwartet einen String.

In der Tat gibt das LCD und die UART das selbige aus, wenn ich wie Peter 
Dannegger anstatt temp1 und temp2 weiterhin s benutze.

Allerdings konnte ich beim Vergleichen schlecht s mit s vergleichen und 
habe deshalb durch die if Schleifen temp1 und temp2 "definiert", um die 
an der Stelle, an der s zu temp1 wird, die Temperatur 
"zwischenzuspeichern".

Allerdings funktioniert das Zwischenspeichern nicht, woran ich 
mittlerweile 3 Tage herumteste (was auch nicht geschadet hat), da wie du 
schreibst beide "Zeiger" auf den selben Speicherbereich zeigen.

Allerdings reichen meine C Kenntnisse nicht aus um ohne Schubs voran zu 
kommen.

Zu den Warnungen...
Ja, diese wurden immer mehr, aber ich konnte mir daraus nichts 
erschließen.
Inzwischen weiß ich das pointer Zeiger heißt, aber ich dachte immer dass 
die temp's nur geschrieben werden wenn das Programm in der Schleife 
abläuft .

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dein wichtigster Denkfehler dürfte das hier sein:
temp1 = s;
...
temp2 = s;
s ist ein Array und enthält die Temperatur als String. Mit den 
Zuweisungen wird nicht die Temperatur als Zahl in temp1/2 gespeichert. 
Was du in temp1/2 speicherst, ist die Adresse des Arrays, damit werden 
die beiden ints zu Quasi-Pointern (nur deshalb produziert das uputs 
später überhaupt sinnvolle Ausgaben).

1. Schritt:
Mach aus den ints uints, und schreibe dann:
temp1 = temp;
...
temp2 = temp;

2. Schritt:
Nimm die temp1/2 aus den ganzen sprintf, uputs und lcd_puts raus, und 
setze dort s ein.

3. Schritt:
Um temp1/2 auszugeben, wandle sie in Strings um (wieder in s).

4. Schritt (und am wichtigsten):
Schnapp dir ein C-Buch und mache dich etwas mehr mit den Grundlagen 
vertraut, insbesondere Pointer und Strings.

Und noch was Grundsätzliches:
Ignoriere die Warnungen nicht. Insbesondere als Anfänger solltest du 
alle Warnungen wie Fehler betrachten.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die ausführliche und schnelle Hilfe!

Jetzt werden die beiden Temperaturen angezeigt und
das Vergleichen funktioniert auch gleich mit.

mfg Johannes

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.:
Schritt 4 wird beherzigt, da dieses Kapitel in meiner C++ 
Downloadversion nur knapp angeschnitten wird.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johannes...

Kannst Du vielleicht den Tempmeas.c in " Fertig" posten ?
Bei mir geht immer noch nicht, obwohl ich die Änderungen hier 
vorgenommen habe....

Mit freundlichen Grüßen
Jan

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.