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
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
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.
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 .
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.
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
P.S.: Schritt 4 wird beherzigt, da dieses Kapitel in meiner C++ Downloadversion nur knapp angeschnitten wird.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.