Forum: Mikrocontroller und Digitale Elektronik EEPROM vertauscht Werte.


von S. L. (goldencue)


Lesenswert?

Hallo.

Hab lang gelesen und nix gefunden zum Problem.

System:
Atmega 16
AVR-Studio

Code ist:
______________________________________________________________________ 
_

globals.h:

uint8_t A1TimeOn[1], A1TimeOff[1], A2TimeOn[1], A2TimeOff[1], 
A3TimeOn[1], A3TimeOff[1], A4TimeOn[1], A4TimeOff[1];

______________________________________________________________________ 
_
main.c:

#include <avr/eeprom.h>
#include "globals.h"

int main(){
A1TimeOn[0] = 0;A1TimeOn[1] = 0;A1TimeOff[0] = 0;A1TimeOff[1] = 
0;A2TimeOn[0] = 0;A2TimeOn[1] = 0;A2TimeOff[0] = 0;A2TimeOff[1] = 
0;A3TimeOn[0] = 0;A3TimeOn[1] = 0;A3TimeOff[0] = 0;A3TimeOff[1] = 
0;A4TimeOn[0] = 01;A4TimeOn[1] = 0;A4TimeOff[0] = 0;A4TimeOff[1] = 0;

get_A1TimeOn_EEdata();
get_A1TimeOn_EEdata();
get_A1TimeOff_EEdata();
get_A2TimeOn_EEdata();
get_A2TimeOff_EEdata();
get_A3TimeOn_EEdata();
get_A3TimeOff_EEdata();
get_A4TimeOn_EEdata();
get_A4TimeOff_EEdata();

while (1)
{
hier ist dann z.B. die Ausgabe der EEPROM-Werte
}
______________________________________________________________________ 
__
eeprom.c:

uint8_t eeFooByte1 EEMEM;    //TurnSW
uint8_t eeFooByte2 EEMEM;    //A1syn_0
uint8_t eeFooByte3 EEMEM;    //A1syn_1
uint8_t eeFooByte4 EEMEM;    //A2syn_0
uint8_t eeFooByte5 EEMEM;    //A2syn_1
uint8_t eeFooByte6 EEMEM;    //A3syn_0
uint8_t eeFooByte7 EEMEM;    //A3syn_1
uint8_t eeFooByte8 EEMEM;    //A4syn_0
uint8_t eeFooByte9 EEMEM;    //A4syn_1
uint16_t eeFooByte10 EEMEM;    //A1IVOn
uint16_t eeFooByte11 EEMEM;    //A1IVOff
uint16_t eeFooByte12 EEMEM;    //A2IVOn
uint16_t eeFooByte13 EEMEM;    //A2IVOff
uint16_t eeFooByte14 EEMEM;    //A3IVOn
uint16_t eeFooByte15 EEMEM;    //A3IVOff
uint16_t eeFooByte16 EEMEM;    //A4IVOn
uint16_t eeFooByte17 EEMEM;    //A4IVOff
uint8_t eeFooByte18 EEMEM;    //A1TimeOn
uint8_t eeFooByte19 EEMEM;    //A1TimeOn
uint8_t eeFooByte20 EEMEM;    //A1TimeOff
uint8_t eeFooByte21 EEMEM;    //A1TimeOff
uint8_t eeFooByte22 EEMEM;    //A2TimeOn
uint8_t eeFooByte23 EEMEM;    //A2TimeOn
uint8_t eeFooByte24 EEMEM;    //A2TimeOff
uint8_t eeFooByte25 EEMEM;    //A2TimeOff
uint8_t eeFooByte26 EEMEM;    //A3TimeOn
uint8_t eeFooByte27 EEMEM;    //A3TimeOn
uint8_t eeFooByte28 EEMEM;    //A3TimeOff
uint8_t eeFooByte29 EEMEM;    //A3TimeOff
uint8_t eeFooByte30 EEMEM;    //A4TimeOn
uint8_t eeFooByte31 EEMEM;    //A4TimeOn
uint8_t eeFooByte32 EEMEM;    //A4TimeOff
uint8_t eeFooByte33 EEMEM;    //A4TimeOff

Beispielfunktionen:

void get_A1TimeOn_EEdata()
{
  uint8_t v = 0;
  cli();
  v = eeprom_read_byte(&eeFooByte18);
  if (v > 23)v = 0;
  A1TimeOn[0] = v;
  v = 0;
  v = eeprom_read_byte(&eeFooByte19);
  if (v > 59)v = 0;
  A1TimeOn[1] = v;
  sei();
}

void set_A1TimeOn_EEdata()
{
  cli();
  eeprom_write_byte(&eeFooByte18, A1TimeOn[0]);
  eeprom_write_byte(&eeFooByte19, A1TimeOn[1]);
  sei();
}

______________________________________________________________________ 
__

So und jetzt mal zum Verhalten des Ganzen:

Ich habe also 33 EEPROM-Speichervariablen benannt und es funktioniert 
auch soweit alles. Alle 41 Bytes werden beschrieben und ordnungsgemäß 
ausgelesen. Nur &eeFooByte19 vertauscht seinen Wert mit &eeFooByte27. 
Besser gesagt wird nicht der Wert von &eeFooByte27 in &eeFooByte27 
gespeichert, sondern A3TimeOn[1] ( was den Wert von &eeFooByte27 
übernehmen soll ) nimmt den von &eeFooByte19??? Alle anderen Werte sind 
korrekt und die Routinen sind alle gleich geschrieben. Deshalb verstehe 
ich nicht, weshalb es immer nur bei diesen zwei Werten hapert.

Kennt das Problem jemand? bitte helft mir, da ich keine Erklärung hab 
und vieles schon versucht; So z.B. die Speicheradressen fest zu 
benennen. Das Prob ist das Gleiche.

Vielen Dank

von holger (Gast)


Lesenswert?

uint8_t A1TimeOn[1]

A1TimeOn[0] = 0;A1TimeOn[1] = 0;

Ich lach mich gleich tot.
Versuch mal

uint8_t A1TimeOn[0] ;)

von S. L. (goldencue)


Lesenswert?

das ist doch nicht das Problem!

von holger (Gast)


Lesenswert?

>das ist doch nicht das Problem!

Wieso nicht? Du schreibst in Speicherbereiche
die nicht reserviert wurden. Was erwartest
du da dann noch vom restlichen Programm?

von S. L. (goldencue)


Lesenswert?

könnt ihr beiden mir mal sagen was ihr hier eigendlich wollt? nur dummes 
gequatsche! nix - aber garnix - produktives. ihr geht mir vielleicht 
aufn sack. Und woher nimmt sigmund das recht mich zu beleidigen? aus was 
für nem loch bist du denn gerobt? wenn du nichts anderes zu sagen hast, 
dann verp..dich einfach.

ich danke allen die produktive vorschläge haben!

von (prx) A. K. (prx)


Lesenswert?

Holgers Beitrag war nicht höflich aber richtig.

Da der Groschen offenbar nicht fiel: Deine Arrays haben durchweg nur ein 
Element, werden vor dir aber so behandelt als hätten sie zwei.

von S. L. (goldencue)


Lesenswert?

Das kenne ich. Nur hilft ein ...[2] auch nicht und bei allen anderen ist 
alles ok?!

Also - daran liegts nicht!

von Captain S. (captainsubtext)


Lesenswert?

In globals.h definiserst du Arrays mit einer Breite von einem Element ( 
xyTimeOn[1] ), greifst aber auf zwei Elemente ( TimeOn[0] und TimeOn[1] 
) zu.
Das ist ein üblicher Anfängerfehler.

Schreib in globals.h statt xyTimeOn[1] überall xyTimeOn[2], dann sehen 
wir weiter.

von Eeprommer (Gast)


Lesenswert?

>Also - daran liegts nicht!

Da hast du recht. Der Fehler ist nicht leicht zu finden, aber unsere 
halbe Entwicklungsabteilung wurde einmal darauf angesetzt, ein ähnliches 
Problem zu lösen. Es ist eigentlich ganz einfach: du musst ausschließen, 
dass 0 auftritt in Zeile ^W

>dann verp..dich einfach.

Ach so. Dann mach ich das mal. Man kann trotz Unwissen auch freundlich 
bleiben.

von Captain S. (captainsubtext)


Lesenswert?

Sorry, der Post kommt etwas spät, der Tab war im Hintergrund schon ein 
paar Minuten offen. :-)

von S. L. (goldencue)


Lesenswert?

das ist wirklich nett und ich kenne das wirklich. xxx[2] hat zwei 
Elemente.; Also [0] und [1]. Aber wie gesagt - ich hatte es und das 
Problem ist nicht kausal!!! Alle anderen Arrays mit xxx[1] funktionieren 
wie erwartet!

Was könnte es noch sein?

von Knigge (Gast)


Lesenswert?

>Was könnte es noch sein?

Dein Umgangston???

von S. L. (goldencue)


Lesenswert?

Fantastisch Eeprommer - Jedenfalls was deine Hilfsbereitschaft angeht! 
Vielen Dank!

Ja beim Start steht in allen Zellen ja 255. Wenn ich dann das erste Mal 
beschreibe, verwende ich als Default Minimum mal 0 als Ascii 48 bzw. Hex 
0x30. Das sind alles keine Nullen im Sinne von 0x00. Hab ich da nen 
Denkfehler?

von S. L. (goldencue)


Lesenswert?

wie NETT hättest du es denn gern? Bin nett zu netten Leuten!

Danke

von holger (Gast)


Lesenswert?

>Alle anderen Arrays mit xxx[1] funktionieren
>wie erwartet!

Genau genommen sind das dann gar keine Arrays.
Und funktionieren tun sie nur wenn du mit xxx[0] = x
darauf zugeifst. Bei xxx[1] = x schreibst du irgendwo
in den Speicher. Und das gibt dann mehr oder weniger
lustige Nebeneffekte. Aber ich mach vom Acker.
Er weiss es ja besser.

von Eeprommer (Gast)


Lesenswert?

>Hab ich da nen Denkfehler?

Nein, Denkfehler machst du bestimmt nicht. Du schimpfst ja nur rum, 
statt zu denken.

von S. L. (goldencue)


Lesenswert?

Ich verstehe deine Laune nicht Eeprommer. Markier mir bitte den Satz, in 
dem ich über dich geschimpft hab. Dann weiß ichs einfach für die 
Zukunft.

Was spricht dagen, dass ich nicht alles weiß und frage? Mit Array[2] das 
habe ich alles schon programmiert. Aber das Problem ist nicht weg 
deshalb. Ist doch nicht so als würde ich eure Vorschläge in den Wind 
schlagen?!

von S. L. (goldencue)


Lesenswert?

na Danke euch! Ich bin ja begeistert!

von 900ss (900ss)


Lesenswert?

Matthias T. schrieb:
> Nur hilft ein ...[2] auch nicht

Trotzdem ist es ein Fehler den du machst wenn du nur ein array mit

uint8_t bla[1];

definierst und es mit

x = bla[1];

ansprichst.

Der Zugriff ist definitiv falsch (auch wenn es dein oben benanntes 
Problem nicht lösen mag).
holger und andere war oben so nett(!) und haben dich schon drauf 
hingewiesen und du pubst sie an. Ich weiß nicht, ob das die richtige Art 
ist, sich Hilfe zu holen.

von 900ss (900ss)


Lesenswert?

Matthias T. schrieb:
> Ich bin ja begeistert!

Und wir erst ;-)

von S. L. (goldencue)


Lesenswert?

So! Nach dem ihr mir alle so super geholfen habt, bin ich euch natürlich 
ne Antwort schuldig, woran es jetzt wirklich lag; falls mal wieder 
jemand das Problem hat.

Also am Array[1] lags NICH! (aber das hatte ich ja weiter oben schon 
dreimal erwähnt).

Im obigen Code ist zu sehen, dass der Kontroller direkt mit der main() 
(und damit zu arbeiten) beginnt. Und genau da hatte der Frosch die 
Locken. Der Eeprom braucht volle Betriebsspannug um ordnungsgemäß 
arbeiten zu können, sonst wirds Wirrwarr. Nachdem ich in Folge dieser 
Erkenntnis (kam nicht von mir!) nen _delay_ms(150); direkt nach main() 
eingefügt hatte lief alle stabil. ...und wenn er nich stirbt...!


Schade dass mir kein kluger Kopf hier das sagen konnte. Klar - waren ja 
alle mit Array[1] beschäftigt, anstatt wirklich mal zu überlegen!

Bye

von holger (Gast)


Lesenswert?

>Nachdem ich in Folge dieser
>Erkenntnis (kam nicht von mir!) nen _delay_ms(150); direkt nach main()
>eingefügt hatte lief alle stabil. ...und wenn er nich stirbt...!

Das man das EEPROM nicht ohne BOD Fuse enabled betreiben
sollte ist ein alter Hut.

>Schade dass mir kein kluger Kopf hier das sagen konnte. Klar - waren ja
>alle mit Array[1] beschäftigt, anstatt wirklich mal zu überlegen!

Wenn man so offensichtliche Fehler im Programm sieht
denkt man eben an das naheliegendste.

von Oliver (Gast)


Lesenswert?

Matthias T. schrieb:
> Schade dass mir kein kluger Kopf hier das sagen konnte.

An Stelle von drei Tagen planlosem posten im Forum und der 
programmierung völlig blödsinniger delays hättest du mal lieber das 
Datenblatt lesen sollen.
1
EEPROM data corruption can easily be avoided by following this design recommendation:
2
Keep the AVR RESET active (low) during periods of insufficient power supply voltage. 
3
This can be done by enabling the internal Brown-out Detector (BOD). 
4
If the detection level of the internal BOD does not match the needed detection level, 
5
an external low VCC Reset Protection circuit can be used. 
6
If a reset occurs while a write operation is in progress, 
7
the write operation will be completed provided that the power supply voltage is sufficient.

von gaast (Gast)


Lesenswert?

Matthias T. schrieb:
> Schade dass mir kein kluger Kopf hier das sagen konnte. Klar - waren ja
> alle mit Array[1] beschäftigt, anstatt wirklich mal zu überlegen!

Vielleicht solltest du nächstes mal einfach vermeiden, im Forum zu 
fragen. Schließlich sitzen hier sowieso nur Idioten, die nicht richtig 
überlegen, sondern einfach mal die offensichtlichen Fehler aufzeigen.

von gaast (Gast)


Lesenswert?

Recht lange kannst du ja nicht gelesen haben, zumindest nicht das 
Datenblatt.

von 900ss (900ss)


Lesenswert?

Matthias T. schrieb:
> Also am Array[1] lags NICH!

Du hattest es erwähnt, ich hatte das gelesen und auch verstanden.
Trotzdem habe ich (und andere) dich netterweise auf diesen 
offensichtlichen Fehler (der nicht zu deinem eigentlichen Problem 
gehört, ja) hingewiesen.
Dieser Fehler wird dir an anderer Stelle Problem machen.

Das du hier jetzt darüber rumpöbelst, dass man dich auf den Fehler 
hingewiesen hat, ist schlicht eine Frechheit!

von S. L. (goldencue)


Lesenswert?

Zunächst: Das Array[1]-Ding war von Anfang an ein Kopierfehler von mir, 
den ich hätte beseitigen sollen, BEVOR ich hier poste. Ich bin nicht 
darauf eingegangen, weil es nicht das Problem geklärt hätte. Natürlich 
ist es richtig und ich habe es auch nicht ernsthaft in meinen 
Programmablauf angewandt. Also - um mal darauf einzugehen auf die ganze 
Diskussion ums Array ( damit das hoffentlich mal vom Tisch ist ) - 
Diesbezüglich habt ihr recht und ich habe das nie bezweifelt. Nur - wenn 
der Motor am Auto nicht funktioniert, muss ich nicht über fehlende 
Reifen am Fahrzeug diskutieren. Sicher fährt das Auto so nicht. Aber den 
Motor macht diese Diskussion auch nicht ganz.

Zum Motzen, Pöppeln, oder wie ihr es auch nennt: Leider wurden genau 
diese Beiträge wieder aus dem Thread genommen, weshalb ich mich aufregte 
am Anfang. Da wurde ich beleidigt ganz dunkel, ohne dass etwas 
konstruktives rüber kam. Ohne diese Beiträge kann hier natürlich keiner 
mehr nachvollziehen, weshalb es dazu kam. Ich möchte mich davor 
bewahren, denen, die mir echt zu helfen versuchten, vor den Latz zu 
kacken. Im Gegenteil! Denen danke ich im Nachhinein noch einmal sehr!!! 
Bitte fühlt euch also nicht alle angesprochen, wenn ich gemotzt hab. Es 
galt einzig jenen, die mich Anfangs als Volltrottel betitelten und jetzt 
ihre Beiträge wieder gelöscht haben.

Ich hoffe also - Ärger vom Tisch und Danke für eure Hilfe!!!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wenn aber die Fehlerbeschreibung ist:
1
Auto fährt nicht
und du siehst das keine Reifen montiert sind, was würdest du demjenigem 
raten?

Dann kommt als Entgegnung:
1
Ich hatte die Reifen ja mal montiert, 
2
hat aber auch nicht geholfen, daran liegts nicht.

Du schaust hin: Nur ein Reifen montiert.

Auf erneutes Nachfragen wird dann gesagt die Reifen könne ja garnicht 
das Problem sein.

Etwas später dann die Auflösung:
1
Vergesen in der Bedienungsanleitung zu lesen das man das Auto
2
mit Benzin betanken muß, jetzt geht alles es kann also nicht an den
3
Reifen gelegen haben.

Es kommt der Hinweis das die Reifen trotzdem montiert werden müssen
1
Ach ja übriegens, das Auto ist garnicht das welches ich eigentlich
2
meinte...

Kann ja mal passieren...

von S. L. (goldencue)


Lesenswert?

REMIS :)

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.