Forum: Compiler & IDEs AVR DS1820 temperaturen vergleichen


von Johannes (Gast)


Angehängte Dateien:

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

von Stefan E. (sternst)


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_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F

von Stefan E. (sternst)


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.

von Johannes (Gast)


Angehängte Dateien:

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 .

von Stefan E. (sternst)


Lesenswert?

Ok, dein wichtigster Denkfehler dürfte das hier sein:
1
temp1 = s;
2
...
3
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:
1
temp1 = temp;
2
...
3
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.

von Johannes (Gast)


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

von Johannes (Gast)


Lesenswert?

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

von Jan (Gast)


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

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
Noch kein Account? Hier anmelden.