Forum: Compiler & IDEs Fragen zu den eeprom Funktionen aus der AVRLIB


von Tobias W. (tobiasw)


Lesenswert?

Servus zusammen,

ich versuche gerade herauszufinden woran es scheitert, dass ich bei 
meinen AVRs (atTiny24 und atMega88PA) keine werte erfolgreich ins EEPROM 
schreiben und später auslesen kann.

Ich hab mir dann jetzt mal das .lss-file genauer angeschaut und bin nun 
soweit euch ein paar Fragen stellen zu müssen.

Für die eine Frage zitiere ich mal aus dem lss-file:
1
  uint16_t tmp = spi_rx_buf[1];
2
  94:  60 91 6c 00   lds  r22, 0x006C
3
  eeprom_write_word( &ee_temp_high, tmp );
4
  98:  80 e0         ldi  r24, 0x00  ; 0
5
  9a:  90 e0         ldi  r25, 0x00  ; 0
6
  9c:  55 d1         rcall  .+682      ; 0x348 <__eewr_word_tn24a>
1
00000348 <__eewr_word_tn24a>:
2
 348:  11 d0         rcall  .+34       ; 0x36c <__eewr_byte_tn24a>
3
 34a:  27 2f         mov  r18, r23
4
 34c:  10 c0         rjmp  .+32       ; 0x36e <__eewr_r18_tn24a>
1
0000036c <__eewr_byte_tn24a>:
2
 36c:  26 2f         mov  r18, r22
3
4
0000036e <__eewr_r18_tn24a>:
5
 36e:  e1 99         sbic  0x1c, 1  ; 28
6
 370:  fe cf         rjmp  .-4        ; 0x36e <__eewr_r18_tn24a>
7
 372:  1c ba         out  0x1c, r1  ; 28
8
 374:  1f ba         out  0x1f, r1  ; 31
9
 376:  8e bb         out  0x1e, r24  ; 30
10
 378:  2d bb         out  0x1d, r18  ; 29
11
 37a:  0f b6         in  r0, 0x3f  ; 63
12
 37c:  f8 94         cli
13
 37e:  e2 9a         sbi  0x1c, 2  ; 28
14
 380:  e1 9a         sbi  0x1c, 1  ; 28
15
 382:  0f be         out  0x3f, r0  ; 63
16
 384:  01 96         adiw  r24, 0x01  ; 1
17
 386:  08 95         ret
beim Versuch zu verstehen, was da passiert, fiel mir auf, dass da ein 
cli steht, aber kein sei ?! ich hab im ganzen lss-file gesucht und es 
gibt nur ein "sei" und das steht am Ende der Initialisierung. Hat 
schonmal jemand etwas ähnliches beobachtet, und/oder eine Lösung parat? 
Denn ich brauche die Interrupts definitiv, und die sollten auch wirklich 
nicht länger als irgendwie nötig blockiert sein!

Zum Anderen hänge ich bei folgender Frage:
worin liegt der Unterschied zwischen eeprom_write_<xyz>() und 
eeprom_update_<xyz>()? Die Dokumentationen, die ich zu den diesen 
Funktionen finde, gehen kaum über die Funktionsdeklaration hinaus und 
auch die Funktionsdefinitionen bleiben mir irgendwie verborgen. Ich 
komme hier igendwie auch nicht so recht weiter.

Wäre schön wenn mir der ein oder andere Wissende ein paar Hinweise oder 
Tips geben könnte.
Vielen Dank
Tobi

von Andreas B. (andreas_b77)


Lesenswert?

1
 37a:  0f b6         in  r0, 0x3f  ; 63

Hier wird das SREG ausgelesen.
1
 37c:  f8 94         cli

Hier wird das Interrupt-Bit im SREG gelöscht.
1
 382:  0f be         out  0x3f, r0  ; 63

Hier wird der vorherige Zustand von SREG wiederhergestellt.

Dieses Konstrukt wird verwendet, wenn man nicht weiß, ob Interrupts 
aktiv sind. Ein sei würde einfach Interrupts aktivieren, auch wenn sie 
vorher nicht aktiv gewesen wären.

von Tobias W. (tobiasw)


Lesenswert?

Oh man, heute bin ich echt blind. Gerade im Moment habe ich auch 
herausgefunden, was der unterschied zwischen update und write ist.
beim Update werden erst die Daten gelesen und verglichen und nur im 
Bedarfsfall werden die überschrieben...

Danke Andreas

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.