Hallo Leute,
ich bin gerade auf einen sehr merkwürdiges Verhalten der GCC Bibliothek
<avr/eeprom.h> gestoßen. Schreiben und Lesen des EEPROMS an einer
bestimmten Speicherstelle innerhalb einer Funktion geht. Werden das
lesen/schreiben in eine Unterfunktion ausgelagert, geht es nicht mehr.
Randdaten: AVR-Studio 4.14, GCC 20080411, ATmega8535
Beispielprogramm welches das Verhalten an den Tag legt (Die Ausgabe, bei
mir RS232, muß man sich halt nochmal selbst anpassen):
1 | #include <avr/io.h>
|
2 | #include <avr/eeprom.h>
|
3 | //#include "RS232.h"
|
4 |
|
5 | //Prototyp:
|
6 | void write(uint8_t, uint8_t);
|
7 |
|
8 | int main(void)
|
9 | {
|
10 | // RS232_init(9600);
|
11 |
|
12 | uint8_t addr=0x04;
|
13 | uint8_t value=102;
|
14 |
|
15 | //So funktioniert es:
|
16 | //-------------------
|
17 | // eeprom_write_byte (&addr, value); //Wert in EEPROM an Addresse schreiben
|
18 | // RS232_write("Daten wurden geschrieben: %i \r",value);
|
19 | // value=0; //Wert löchen
|
20 | //value = eeprom_read_byte (&addr); //Wert aus EEPROM an Adresse lesen
|
21 | // RS232_write("Daten wurden gelesen: %i \r",value);
|
22 |
|
23 | //So funktioniert es nicht:
|
24 | //-------------------------
|
25 | write(addr, value);
|
26 | value=0;
|
27 | value = eeprom_read_byte (&addr);//Hier ist value "255" ???
|
28 | //RS232_write("Daten wurden gelesen: %i \r",value);
|
29 |
|
30 | while(1);
|
31 | return 0;
|
32 | }
|
33 |
|
34 | void write(uint8_t addr, uint8_t value){
|
35 | eeprom_write_byte (&addr, value); //Wert in EEPROM an Addresse schreiben
|
36 | //RS232_write("Daten wurden geschrieben in Fkt: %i \r",value);
|
37 | value=0; //Wert löchen
|
38 | value = eeprom_read_byte (&addr); //Wert aus EEPROM an Adresse lesen
|
39 | //hier ist value noch "102"
|
40 | //RS232_write("Daten wurden gelesen in Fkt: %i \r",value);
|
41 | }
|
Jemand eine Idee?
- Ich meine es geht zum Beispiel auch wenn ich sowohl addr und value
als Pointer übergebe... nettes Workaround, aber für mich nicht
praktikabel.
- Im Tutorial steht man sollte den gesamten EEPROM als ein großes Array
definieren, und die einzelnen Elemente dann als Adresse
interpretieren... Auch ein nettes Workaround, wahrscheinlich werde ich
es nun auch so machen.
Aber gibt es eine logische oder bekannte Erklärung für diesen "Fehler",
sofern es einer ist...
Gruß
Ralf