Hi, ich habe bis jetzt das gewünschte Ergebnis noch nicht erzielen können obwohl es einfach scheint. Ich habe zuerst ein Problem mit einem Interuppt (external interuppt). Er wird durch eine Taste eingelöst und ich möchte es anwenden um das Speichern der Werte im EEPROM zu bewirken. Das Speichern der Werte klappt auch nur halbs Weg wenn ich etwas speichere, bekomme ich beim Lesen nur die 4 letzten Charater. kann jemand mir sagen wie ich es besser hinbekommen kann.
Wie wär´s denn, wenn Du uns erstmal verrätst, um welchen Controller es sich handelt. Weiterhin tausche doch bitte in der englischen Unterbrechung ein 'p' gegen ein 'r' und rücke dieses vor das 'u' .
Es handelt sich hier um einen Mikrocontroller von Analog Devices ADuC7060. ich dachte, ich hätte es vorher erwähnt. Sorry
Ich habe versucht einen externen Interrupt zu benutzen um das Speichern von einem Wert auszulösen aber der Interrupt scheint nicht so zu wirken wie ich es mir gewünscht habe. Ich habe den Quellcode oben angehangt. danke...
Selbst wenn du jemanden hier im Forum findest, der sich mit diesem Controller auskennt, glaube ich nicht, dass er sich deinen Kraut und Rüben Source Code antun wird.
Und poste dein ganzes Programm. Nimm das C File so wie es ist und hänge es als Attachment an. Die Forensoftware weiß schon, was man mit *.c Files macht. Es gibt keinen Grund da ein *.txt draus zu machen. Wie gesagt: konmplettes Programm, damit man auch die Teile sieht, die du nicht zeigst. Wie zb: volatile definierte Variablen. Schwachsinn: Eine Variable namens i, die als Schleifenzähler benutzt wird, macht man nicht global. Die Gefahr ist viel zu groß, dass man sich damit selbst ins Knie schiesst, wenn Funktionen andere Funktionen in einer Schleife aufrufen die dann auch wieder dasselbe i verwenden.
1 | for ( i = 0; i < 2; i++) |
2 | {
|
3 | FEEADR = addr + 2 * i; |
4 | FEEDAT = value; //*((unsigned long*)0xFFFF051C); |
Dir ist schon bewusst, dass du hier dieselben Daten 2 mal hintereinander um 2 Bytes versetzt ins EEPROM knüdelst (Vorausgesetzt in FEEADR schreibt man eine Byteadresse rein). Da ein unsigned long auf deinem System höchst wahrscheinlich nicht 2 Bytes lang ist, überschreibst du dir mit dem 2. Schreibvorgang Teile des vorher geschriebenen Wertes.
Sorry solche Durcheinander verursacht zu haben. Eigentlich möchte ich einen Wert aus dem ADC-Register (ADC0DAT) ins EEPROM schreiben und das Problem ist der Wert ist 24bit codiert und der Flash/EEPROM Register nur 16bit aufnehmen kann. Ich habe die Adresse hochzählen wollen ( FEEADR = addr++) aber es hat nicht so geklappt deswegen habe ich dann so versucht wie du jetzt im Quellcode siehst. Wie kann ich den Wert in zwei aufteilen MSB und LSB damit ich es ins EEPROM rein bringen kann? Danke... mfg
patrick schrieb: > 16bit aufnehmen kann. Ich habe die Adresse hochzählen wollen ( FEEADR = > addr++) aber es hat nicht so geklappt deswegen habe ich dann so versucht > wie du jetzt im Quellcode siehst. Die Adresse hochzählen ist schon ok. Aber du musst dir aus dem unsigned long auch die jeweiligen 16 Bit herausholen, die du brauchst. Du musst den unsigned long in 2 unsigned int zerlegen, die dann nacheinander geschrieben werden > Wie kann ich den Wert in zwei aufteilen MSB und LSB damit ich es ins > EEPROM rein bringen kann? Dazu gibts viele Möglichkeiten. Eine ist zb so
1 | union convert |
2 | {
|
3 | unsigned long value; |
4 | unsigned int words[2]; |
5 | };
|
6 | |
7 | ....
|
8 | |
9 | convert Converter; |
10 | |
11 | Converter.value = value; |
12 | // schreibe Converter.words[0]
|
13 | // schreibe Converter.words[1]
|
eine andere ist
1 | .....
|
2 | |
3 | // schreibe das High-Word von value
|
4 | |
5 | .... = value >> 16; |
6 | |
7 | // schreibe das Low-Word von value
|
8 | |
9 | .... = value & 0xFFFF; |
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.