Forum: Mikrocontroller und Digitale Elektronik globaler EEPromwert wird unerwünscht geändert, wieso bitte?


von Matthias H. (maethes26)


Angehängte Dateien:

Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

1
uint32_t   temperatur[5];    //Feld, damit 5 hintereinanderfolgende Tempwerte gespeichert werden können
Richtig, in dieses Array passen 5 Werte, mit den Indizes 0-4.

1
  temperatur[i_temp]=wert_temperatursensor*5000UL/1024;    // A/D-Wert in Spannung umrechnen (AREF=5V, 10 Bit A/D-Wandler: 2^10=1024)
2
...
3
i_temp++;            // erhöhe die Zählvariable von Null beginnend um 1
4
if (i_temp>6)  i_temp=0;      //hiermit wird die Zählvariable wieder auf Null gesetzt
Hier schreibst du aber 7 Werte in das Array, mit den Indizes 0-6.

von Helfer (Gast)


Lesenswert?

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.

von Matthias H. (maethes26)


Lesenswert?

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.

von Matthias H. (maethes26)


Angehängte Dateien:

Lesenswert?

hier das Bild dazu.

von Thomas E. (thomase)


Lesenswert?

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.

von Matthias H. (maethes26)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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_t   temperatur[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 :-)

von Karl H. (kbuchegg)


Lesenswert?

Noch was

Vergleich mal
1
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.

von Matthias H. (maethes26)


Lesenswert?

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.

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.