Forum: Mikrocontroller und Digitale Elektronik EEPROM TINY85 und RFM12 verhält sich merkwürdig


von Oddel (Gast)


Lesenswert?

Moin,

ich benutze seit einiger Zeit den TINY85 in Verbindung mit dem RFM12.
Im EEPROM speichere ich an die Adressen 1 und 2 Parameter ab.
Der Tiny sendet über den RFM12 Werte und legt sich dann über 
SLEEP_MODE_PWR_DOWN für 2 Minuten schlafen.

Ich habe hier einen von 5 Sensoren bei dem hat sich der EEPROM Inhalt 
verschoben und ich habe keine Ahnung warum. Ich finde es schon 
merkwürdig das dieser Fehler nur bei einem Sensor auftritt. Hat da der 
TINY85 einen schlag oder wodurch kann so etwas passieren ? 
Programmfehler ?

so sehen meine Zugriffe aus :
1
asm("cli");
2
EEPROM_write(1,Wake); // Parameter 2
3
sei()
4
5
....
6
7
asm("cli");
8
ID    = EEPROM_read(0);                            // Workaround
9
Wake  = EEPROM_read(1);                            // Workaround
10
sei();


und hier die Routinen :
1
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
2
{
3
/* Wait for completion of previous write */
4
while(EECR & (1<<EEPE))
5
;
6
/* Set up address and data registers */
7
EEARL = uiAddress;
8
EEDR = ucData;
9
/* Write logical one to EEMWE */
10
EECR |= (1<<EEMPE);
11
/* Start eeprom write by setting EEWE */
12
EECR |= (1<<EEPE);
13
}
14
15
unsigned char EEPROM_read(unsigned int uiAddress)
16
{
17
/* Wait for completion of previous write */
18
while(EECR & (1<<EEPE))
19
;
20
/* Set up address register */
21
EEARL = uiAddress;
22
/* Start eeprom read by writing EERE */
23
EECR |= (1<<EERE);
24
/* Return data from data register */
25
return EEDR;
26
}


und hier noch der EEPROM Inhalt wie er am Anfang ist:
1
:100000000E09FFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
2
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
3
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
4
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
5
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
6
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
7
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
8
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
9
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
10
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
11
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
12
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
13
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
14
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
15
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
16
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
17
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB
18
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
19
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
20
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
21
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
22
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
23
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
24
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
25
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
26
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
27
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
28
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
29
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
30
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
31
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
32
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
33
:00000001FF

und hier als der Sensor ausgestiegen ist :
1
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
2
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
3
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
4
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
5
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
6
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
7
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
8
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
9
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
10
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
11
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
12
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
13
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
14
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
15
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
16
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
17
:100100000E04FFFFFFFFFFFFFFFFFFFFFFFFFFFFEB
18
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
19
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
20
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
21
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
22
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
23
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
24
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
25
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
26
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
27
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
28
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
29
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
30
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
31
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
32
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
33
:00000001FF

von M.K. B. (mkbit)


Lesenswert?

Hallo Oddel,

ich vermute, dass dir Interrupts Probleme machen.

Hier im Tutorial unter 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Speicher gibt es 
eine Erklärung zum EEPROM. Beim Schreiben gibt es ein Zeitfenster, dass 
eingehalten werden muss. In der Regel werden dazu die Interrupts für 
eine kurze Zeit deaktiviert.

Da bei dir nur ein Chip Probleme zeigt, könnte dies ein Fehler im Chip 
sein. Das von mir vermutete Problem ist jedoch stark von der Zeit der 
Interrupts abhängig, tritt also sehr zufällig auf und könnte auch auf 
anderen Chips auftreten.

von Oddel (Gast)


Lesenswert?

Hallo Mk Bit,

ist es aber nicht so, dass ich mit cli und sei die Interrupts aus- und 
einschalte ?

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.