Hallo,
ich habe ein längeres Programm geschrieben, in welchem unter anderem ein
Zufallszahlengenerator zum Einsatz kommt. Damit nicht nach jedem Reset
usw. die gleichen Zufallszahlen geliefert werden lese ich beim Start
jeweils einen Seed aus dem EEPROM aus und schreibe die nächste erzeugte
Zufallszahl ins EEPROM zurück. Ursprünglich benötigte ich nur 8-Bit
Zufallszahlen, hier klappte das Ganze wunderbar mit "eeprom_read_byte"
bzw. "eeprom_write_byte". Nun benötige ich aber 16-Bit Zufallszahlen,
und hier funktioniert das Speichern mittels "eeprom_write_word"
überhaupt nicht mehr, bei jedem Reset/Neustart wird wieder die gleiche
Sequenz erzeugt. Ich habe das Ganze dann im Simulator nachvollzogen, und
auch hier ist es so, dass ich bis zu "eeprom_write_word" steppen kann
und der Simulator anschließend in einer Art Endlosschleife landet. Da
ich auch den Watchdog usw. nutze habe ich das Programm nun auf das
Nötigste abgespeckt (u.a. auch wieder den
Standard-Zufallszahlengenerator), und auch hier funktioniert das
Schreiben ins EEPROM nicht. Hat jemand eine Idee, was schief gehen kann?
Anbei mein minimales Testprogramm, Der Inhalt der Header-Datei
entspricht den ersten drei Zeilen. Entwickelt habe ich für einen
Attiny44A mit AtmelStudio 6. Compiler-Optimierungen waren ursprünglich
auf "-Os", bei der Fehlersuche habe ich sie jedoch auf "-O0" gesetzt.
1 | #define F_CPU 8000000UL
|
2 | #include <avr/eeprom.h>
|
3 | #define EEPROM_SEED_ADDRESS 0U
|
4 |
|
5 | uint16_t random;
|
6 |
|
7 | static void initRng(void) {
|
8 | seed= eeprom_read_word((uint16_t *)EEPROM_SEED_ADDRESS);
|
9 | srand(seed);
|
10 | eeprom_write_byte((uint16_t *)EEPROM_SEED_ADDRESS, rand()); // klappt!
|
11 | eeprom_write_word((uint16_t *)EEPROM_SEED_ADDRESS, rand());// klappt nicht, der Debugger scheint in einer Schleife o.ä. zu hängen!
|
12 | srand(seed); // nur da zum Pausieren beim Steppen
|
13 | }
|
14 |
|
15 | int main(void)
|
16 | {
|
17 | initRng();
|
18 |
|
19 | while(1) {}
|
20 | }
|
Viele Grüße,
Sven