Fragen zu den eeprom Funktionen aus der AVRLIB

#2999622
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
#2999650
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren