Hat sich jemand mal angesehen, wieviel länger der Lesezugriff auf ein Byte im EEPROM im Vergleich zum Zugriff aufs RAM dauert? Ich habe im Datenblatt gefunden, dass auf jeden Fall 4 Zyklen Pause ist, aber was "kosten" die Routinen aus der AVR Bibliothek?
Einfach mal ein Blick in die Quellen werfen:
1 | /* uint8_t eeprom_read_byte (uint8_t EEMEM *addr); |
2 | */ |
3 | |
4 | #define ret_lo r24 |
5 | #define ret_hi r25 |
6 | |
7 | ENTRY eeprom_read_byte |
8 | |
9 | #if __AVR_XMEGA__ /* -------------------------------------------- */ |
10 | |
11 | rcall eeprom_mapen |
12 | ld ret_lo, Z |
13 | clr ret_hi |
14 | ret |
15 | |
16 | ENTRY eeprom_mapen |
17 | |
18 | ; Load base address of NVM. |
19 | ldi ZL, lo8(NVM_BASE) |
20 | ldi ZH, hi8(NVM_BASE) |
21 | |
22 | ; Wait until NVM is not busy. |
23 | 1: ldd r19, Z + NVM_STATUS - NVM_BASE |
24 | sbrc r19, NVM_NVMBUSY_bp |
25 | rjmp 1b |
26 | |
27 | ; Enable EEPROM mapping into data space. |
28 | ldd r19, Z + NVM_CTRLB - NVM_BASE |
29 | ori r19, NVM_EEMAPEN_bm |
30 | std Z + NVM_CTRLB - NVM_BASE, r19 |
31 | |
32 | ; Load Z with correct EEPROM address to read from data space. |
33 | movw ZL, addr_lo |
34 | subi ZL, lo8(-MAPPED_EEPROM_START) |
35 | sbci ZH, hi8(-MAPPED_EEPROM_START) |
36 | |
37 | ret |
38 | |
39 | #else /* -------------------------------------------- */ |
40 | |
41 | 1: sbic _SFR_IO_ADDR (EECR), EEWE |
42 | rjmp 1b |
43 | # ifdef EEARH |
44 | # if E2END > 0xFF |
45 | out _SFR_IO_ADDR (EEARH), addr_hi |
46 | # else |
47 | ; This is for chips like ATmega48: the EEAR8 bit must be cleaned. |
48 | out _SFR_IO_ADDR (EEARH), __zero_reg__ |
49 | # endif |
50 | # endif |
51 | out _SFR_IO_ADDR (EEARL), addr_lo |
52 | sbi _SFR_IO_ADDR (EECR), EERE |
53 | clr ret_hi |
54 | in ret_lo, _SFR_IO_ADDR (EEDR) |
55 | ret |
56 | |
57 | #endif /* -------------------------------------------- */ |
58 | |
59 | ENDFUNC |
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html Nicht viel Info: Beitrag "Geschwindigkeit von EEPROM Operationen" Vllt. hat ja jemand Lust mal die Takte zu zählen, die eeprom_read_byte(const uint8_t *__p) braucht? :-)
Ach ja, das ist ja schon alles ASM. Ich habe keinen XMEGA aber 4k EEPROM, also EEARH. Damit sieht es wohl so aus:
1 | #define ret_lo r24 |
2 | #define ret_hi r25 |
3 | |
4 | ENTRY eeprom_read_byte |
5 | 1: sbic _SFR_IO_ADDR (EECR), EEWE |
6 | rjmp 1b |
7 | |
8 | # if E2END > 0xFF |
9 | out _SFR_IO_ADDR (EEARH), addr_hi |
10 | # else |
11 | ; This is for chips like ATmega48: the EEAR8 bit must be cleaned. |
12 | out _SFR_IO_ADDR (EEARH), __zero_reg__ |
13 | # endif |
14 | |
15 | out _SFR_IO_ADDR (EEARL), addr_lo |
16 | sbi _SFR_IO_ADDR (EECR), EERE |
17 | clr ret_hi |
18 | in ret_lo, _SFR_IO_ADDR (EEDR) |
19 | ret |
20 | |
21 | ENDFUNC |
also vermutlich: sbic rjmp out out sbi clr in ret Was macht das?
sbic 1..3 rjmp 2 out 1 out 1 sbi 2 clr 1 in 1 ret 4 -------- 13..15 (+ 4 pause?) Also bei 16 MHz 0,875 µs
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.