Hallo zusammen,
habt ihr eine Erklärung dafür, warum sich der Wert meiner globalen
Variable myByte1 ändert, wenn die Funktion Temperaturmessung aufgerufen
wird???
anfangs hat der EEPROMWert myByte einen Wert von 479. Den kann ich auch
innerhalb meines Programmablaufs ändern, speichern und am LCD wieder
anzeigen lassen, das geht.
Sobald aber die Funktion Temperaturmessung aufgerufen wird, wird
Mybtyte1 auf den jeweils aktuell berechneten Temperaturwert gesetzt.
z.B. auf den Wert 37!
Wie kann denn sowas bitte sein?
Ich bin noch ein programmieranfänger, das seht ihr auch an meinem
unaufgeräumten Programmcode. Auch die Headeranweisung ist wohl noch
völlig falsch.
Mit den Variablendeklarationen und den Speicherbereichen kenne ich mich
auch noch nicht so aus.
Ich würde mich über ein paar Tipps zur Verbesserung meines programmcodes
freuen und auch zur Lösung meines aktuellen problems.
Bei weiteren Fragen stehe ich umgehend zur Verfügung.
Viele Grüße,
Matthias.
Du überschreibst in der Funktion den Variablenbereich.
> uint32_t temperatur[5];
^
> temp_wert_LCD=temperatur[i_temp];> i_temp++;> if (i_temp>6) i_temp=0;
^ max. 4 für Index erlaubt!
Solche Fehler kann man vermeiden, wenn man statt mit magischen Zahlen
mit Defines arbeitet.
Hallo Euch beiden,
vielen vielen Dank Euch beiden für Eure Hilfe! Jetzt hats gleich auf
Anhieb geklappt. Der Wert bleibt stabil, super
Ich habe schon über zwei Stunden lang den Fehler gesucht.
Den Fehler hätte ich noch eine lange Zeit nicht gefunden.
Das liegt aber auch daran, weil ich mit dem Debugger nicht umgehen kann.
Ich weiß gerade mal ihn zu starten und eine einzelne Anweisung nach der
anderen durchzugehen. Dabei kann ich mir die Portzustände anschauen. Auf
Veränderungen dieser meinerseits hat der Debugger wohl nicht reagiert.
Könnt ihr mir noch bitte sagen wo ich mir die Werte meiner ganzen
Variablen anzeigen lassen und diese verändern kann?
Ich habe mal ein Bildschirmfoto als Aufhängepunkt für Euch gemacht. An
dieser Stelle habe ich bis jetzt gesucht und probiert.
Unten im Fenster stehen schon locals. Hatte auch mal andere Variablen
anzeigen lassen, da stand dann aber immer nur der Wert 0 und diesen
konnte ich nicht verändern.
Viele Grüße
und noch einen schönen Tag wünscht
Matthias.
Matthias H. schrieb:> Ich würde mich über ein paar Tipps zur Verbesserung meines programmcodes> freuen
Das Programm sollte man ausdrucken und dir um die Ohren hauen!
Besorg' dir dringend ein C-Buch und arbeite das von ANFANG AN durch.
Insbesondere die Strukturierung von C-Programmen und die Verwendung von
Headerdateien.
Du machst so ziemlich alles falsch, was man falsch machen kann.
Mit ein paar Tips ist das leider nicht getan.
mfg.
Thomas Eckmann schrieb:> Matthias H. schrieb:>> Ich würde mich über ein paar Tipps zur Verbesserung meines programmcodes>> freuen>> Das Programm sollte man ausdrucken und dir um die Ohren hauen!>> Besorg' dir dringend ein C-Buch und arbeite das von ANFANG AN durch.> Insbesondere die Strukturierung von C-Programmen und die Verwendung von> Headerdateien.>> Du machst so ziemlich alles falsch, was man falsch machen kann.>> Mit ein paar Tips ist das leider nicht getan.>> mfg.
Hallo Thomas,
danke für Deinen Tipp!
Ich sehe das genauso, das ich so ziemlich alles falsch mache was man
falsch machen kann.
Habe auch ein kleines C-Buch zur Hand und sollte mir das jetzt mal zu
Gemüte führen.
Ich war nur so motiviert meinen Code weiter zu schreiben ohne mir das
Buch durchzulesen, denn soweit funktioniert es ja einigermaßen.
Ich werde jetzt aber mal eine Pause machen und keinen weiteren Code für
mein Projekt erzeugen, sondern den bestehenden nach C-Standrards
optimieren. :-)
Viele Grüße,
Matthias.
Matthias H. schrieb:> Den Fehler hätte ich noch eine lange Zeit nicht gefunden.>> Das liegt aber auch daran, weil ich mit dem Debugger nicht umgehen kann.
Falsch.
Das liegt daran, dass du ein paar Grundregeln nicht beherzigst. Eine
davon (wurde schon angesprochen) lautet: keine magischen Zahlen im Code.
Mit dem Debugger hat das nichts zu tun.
Du hättest das so formulieren sollen
1
#define NR_TEMPERATUR 5
2
uint32_ttemperatur[NR_TEMPERATUR];
und
1
i_temp++;
2
if(i_temp>=NR_TEMPERATUR)
3
i_temp=0
und schon KANN dir dieser Fehler nicht mehr passieren. Abgesehen davon,
dass jetzt die if-Abfrage eine kleine Geschichte erzählt. Bei if
(i_temp>6) fragt sich jeder: 6, wieso 6? Was steckt hintern den 6, wo
kommen die her?
In der 'verbesserten' Form frag ich mich das möglicherweise auch aber
wenn ich dann den Code untersuche, wo denn das NR_TEMPERATUR herkommt,
dann finde ich die Stelle im Header File direkt bei der Array-Definition
und plötzlich ist alles sonnenklar, dass hier ein Index-Überlauf
abgefangen wird.
Das alles fällt unter den Titel: Wie formuliere ich meinen Code so, dass
ich mir selbst die Sache erleichtere?
Denn eines steht auch fest: Wenn du dein Array größer machst, musst du
den ganzen Code absuchen, wie sich die Änderung auswirkt. Wenn ich das
Array größer mache, dann ändere ich im #define die Zahl, und der
Compiler passt den Rest vom Code für mich an. Und der macht das
zuverlässiger als ich :-)
i_temp++;// erhöhe die Zählvariable von Null beginnend um 1
2
if(i_temp>6)i_temp=0;//hiermit wird die Zählvariable wieder auf Null gesetzt
mit
1
// den nächsten Eintrag im temperatur Array bestimmen, an den
2
// der nächste Messwert geschrieben wird. Wenn alle
3
// Einträge aufgebraucht sind, fang wieder vorne im Array an
4
i_temp++;
5
if(i_temp>=NR_TEMPERATUR)
6
i_temp=0
Vergleich mal die Aussagen der Kommentare. Was erzählen dir deine
Kommentare, was du nicht auch im Code selber siehst?
i_temp++;
Das hier eine Variable um 1 erhöht wird, das sehe ich auch im Code. Das
brauchst du nicht kommentieren. Wer nicht sieht, das ++ eine Erhöhung
ist, der sollte erst mal seine Hausaufgaben machen und C lernen, ehe er
ein Projekt angeht. ++ ist C-Kurs: Lektion 2 oder 3.
Das hier
if (i_temp>6) i_temp=0;
gegebenenfalls die Variable wieder auf 0 gesetzt wird ... auch das sehe
ich im Code. Das steht genau so dort.
In Summe wiederholen deine Kommentare also nur das, was auch im Code
selber steht. Damit kriege ich aber von den Kommentaren keine neue
Information - lösche ich sie weg, weiß ich deshalb nicht mehr oder
weniger, was hier an dieser Stelle vor sich geht.
Denn die Frage lautet: WARUM?
Warum wird da eine Variable um 1 erhöht und warum wird sie
möglicherweise auf 0 gesetzt? Was ist die Bedeutung davon?
Kommentiere nicht das WIE, sondern kommentiere das WARUM! Denn das Wie,
das steht ohnehin im Code. Der Kommentar soll mir erzählen, worum es an
dieser Stelle geht, was die generelle Idee ist, welche Sonderfälle es
gibt etc. Und der Code implementiert dann dieses Idee.
Deine Kommentare sind wie rote Joghurtbecher, auf die der Designer die
Worte: "Diese Becher sind rot" drauf geschrieben hat. Das der rot ist,
das sehe ich auch so. Aber warum ist der rot? Hat das eine spezielle
Bedeutung? Was unterscheidet einen roten Becher von einem blauen? Ist in
dem einen Himmbeer und im anderen Heidelbeer? All das verschweigst du um
statt dessen das offensichtliche auf den Becher schreiben zu lassen.
Guten Abend,
danke für Deine Hinweise bezüglich des Kommentieres.
Das habe ich ja bisher völlig falsch gemacht. :-)
Werde mir in Zukunft angewöhnen sinnvoller zu kommentieren.
Viele Grüße,
Matthias.