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
uint8_t A1TimeOn[1] A1TimeOn[0] = 0;A1TimeOn[1] = 0; Ich lach mich gleich tot. Versuch mal uint8_t A1TimeOn[0] ;)
>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?
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!
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.
Das kenne ich. Nur hilft ein ...[2] auch nicht und bei allen anderen ist alles ok?! Also - daran liegts nicht!
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.
>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.
Sorry, der Post kommt etwas spät, der Tab war im Hintergrund schon ein paar Minuten offen. :-)
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?
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?
>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.
>Hab ich da nen Denkfehler?
Nein, Denkfehler machst du bestimmt nicht. Du schimpfst ja nur rum,
statt zu denken.
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?!
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.
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
>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.
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. |
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.
Recht lange kannst du ja nicht gelesen haben, zumindest nicht das Datenblatt.
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!
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!!!
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...
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.