GCC-Assembler und EEPROM

Gast #5221198
Lesenswert?
• ▲
▼
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
Gast #5221245
Lesenswert?
• ▲
▼
Verstehe nicht was "vorbelegen" sein soll.

Das EEprom ist hardwaretechnisch aufgebaut, deine Adresse wo du was hin 
speichern möchtest muß im Doppleregister ZH und ZL vorliegen wenn du 
"out  _SFR_IO_ADDR(EEARH), ZH" und " out     _SFR_IO_ADDR(EEARH), ZL" 
verwendest und das Datenbyte muß im Register r16 liegen wenn du " out 
_SFR_IO_ADDR(EEDR), r16" verwendest. Dann die Interrupts ausschalten und 
den "Brennvorgang" einleiten.

Also dein Code ist soweit dann richtig!
Was also willst du noch anderes machen?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.