Forum: Mikrocontroller und Digitale Elektronik GCC-Assembler und EEPROM


von Peter (Gast)


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

von hans (Gast)


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?

von Peter (Gast)


Lesenswert?

Ich habe den Fehler gefunden (vorletzte Zeile):

in      r16, EEDR
-->
in      r16, _SFR_IO_ADDR(EEDR)

Danke an Alle!

von Peter (Gast)


Lesenswert?

hans schrieb:
> Verstehe nicht was "vorbelegen" sein soll.

Naja, ich kann doch beim Flashen schon was reinschreiben - also 
vorbelegen - oder?

Gruß Peter

von Christian S. (roehrenvorheizer)


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Schau halt, welchen Code avr-gcc erzeugt, und dann schreib ab :-)

>    in      r17, _SFR_IO_ADDR(SREG)
>    cli
>    ...
>    sei <-- hä?
>    out     _SFR_IO_ADDR(SREG), r17

von Peter (Gast)


Lesenswert?


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.