Hallo, ich versuche grade per GCC-Assembler auf das EEPROM zuzugreifen. Das harkt aber noch irgendwo, weshalb ich gerne die erste Addresse im EEPROM vorbelegen möchte. Bei Daten aus dem Flash geht das ja so:
1 | .data |
2 | |
3 | .global my_data |
4 | .type my_data, @object |
5 | .size my_data, 1 |
6 | my_data: |
7 | .byte 0x11 |
Weiß jemand wie man das beim EEPROM macht? Hier meine Funktionen:
1 | EEPROM_write: |
2 | sbic _SFR_IO_ADDR(EECR), EEPE ; prüfe ob der letzte Schreibvorgang beendet ist |
3 | rjmp EEPROM_write ; wenn nein, nochmal prüfen |
4 | |
5 | out _SFR_IO_ADDR(EEARH), ZH ; Adresse schreiben |
6 | out _SFR_IO_ADDR(EEARL), ZL |
7 | out _SFR_IO_ADDR(EEDR), r16 ; Daten schreiben |
8 | in r17, _SFR_IO_ADDR(SREG) ; SREG sichern |
9 | cli ; Interrupts sperren, die nächsten |
10 | ; zwei Befehle dürfen NICHT |
11 | ; unterbrochen werden |
12 | |
13 | sbi _SFR_IO_ADDR(EECR),EEMPE ; Schreiben vorbereiten |
14 | sbi _SFR_IO_ADDR(EECR),EEPE ; Und los ! |
15 | sei |
16 | out _SFR_IO_ADDR(SREG), r17 ; SREG wieder herstellen |
17 | ret |
18 | |
19 | EEPROM_read: |
20 | sbic _SFR_IO_ADDR(EECR), EEPE ; prüfe ob der vorherige Schreibzugriff |
21 | ; beendet ist |
22 | rjmp EEPROM_read ; nein, nochmal prüfen |
23 | |
24 | out _SFR_IO_ADDR(EEARH), ZH ; Adresse schreiben |
25 | out _SFR_IO_ADDR(EEARL), ZL |
26 | sbi _SFR_IO_ADDR(EECR), EERE ; Lesevorgang aktivieren |
27 | in r16, EEDR ; Daten in CPU Register kopieren |
28 | ret |
Gruß Peter