Forum: Mikrocontroller und Digitale Elektronik Register in EEPROM speichern 8515


von Sebastian F. (sebastianfrank)


Lesenswert?

Hallo,
ich hab mir schon ein paar Beiträge angesehen. Leider hab ich immer noch 
nicht
verstanden wie ich die Werte eines Registers ins EEPROM lade und beim 
Neustart wieder auslese.
Vllt kann mir jemand helfen. Ich habs so verstanden dass ich wenn ich 2 
register hab einfach 2 adressen einlese und dann die Werte an EEDR 
übergebe....
klappt aber leider nicht

von Otto (Gast)


Lesenswert?

Beim Schreiben darf nichts dazwischenfunken (Interrupts) und die 
Brown-Out-Detection muss aktiviert sein.

Schreib- und Leseroutinen sind hier zu finden.

Gruss Otto

von Otto (Gast)


Lesenswert?


von Sebastian F. (sebastianfrank)


Lesenswert?

Danke, ich habs mal abkopiert und umgeschrieben, ich verstehs zwar 
leider immer noch nicht aber es funzt ^^

von Sebastian F. (sebastianfrank)


Lesenswert?

ach es geht doch noch nicht ;_; vllt kann mir jemand mal schreiben was 
ich schreiben muss damit ein register gespeichert wird, bei mir wird 
irgentwie keine datei erzeugt die es speichert

von spess53 (Gast)


Lesenswert?

Hi

>ach es geht doch noch nicht ;_; vllt kann mir jemand mal schreiben was

Zeig doch mal, was du hast.

MfG Spess

von SebastianFrank (Gast)


Lesenswert?

ich hab das hier mal probiert:
.include "8515def.inc"

main:
    ;TEST

    ldi r16,low(ramend)
    out SPL, r16
    ldi r16,high(ramend)
    out sph,r16
    rcall eplesen
    ldi r17, 0xFF
    push r17
    ldi r17, 0xF0
    out portd, r17
    pop r17
    out portb, r17
    rcall epschreiben
    rjmp main

epschreiben:cli
      push r17
      ldi r17,low(ramend)
      out EEARL, r17;(1)
      ldi r17, high(ramend)
      out EEARH, r17(1)
      cbi EECR,EEWE
      out EEDR,r17(2)
      sei
      ret

eplesen:  cli
      ldi r17,low(ramend)
      out EEARL, r17
      ldi r17, high(ramend)
      out EEARH, r17
      cbi EECR,EEWE
      in r17,EEDR
      sei
      out Porta, r17
      ret
hab alle interrupts ausgeschaltet, ich habs mal so verstanden dass man 
hier bei (1) einfach die adresse übergibt und dann bei (2) den wert. 
Beim lesen hab ichs halt umgekehrt gemacht. vllt is das ne saudumme 
frage und ich habs wirklich net drauf ^^ aber unser professor hat mit 
uns noch nie programmiert und alle seine beispielprogramme laufen nicht 
;_;

von Otto (Gast)


Lesenswert?

"ramend" ist nicht die richtige Adresse !

(dient nur zur initialisierung des Stack!)

Otto

von spess53 (Gast)


Lesenswert?

Hi

1. Lass die Finger von 'ramend' (ausser bei der Stackinitialisierung). 
Wenn du dort etwas manipulierst wird das unweigerlich zu 
Programmabstürzen führen.

2.'ramend' zu EEPROM-Adressierung zu verwenden ist unsinnig, da RAM und 
EEPROM unterschiedliche Grösse haben können. Beim 8515 ausnahmsweise 
gleich.

3. 16-Bit Register (EEAR) werden in der Reihenfolge H-Register, 
L-Register beschtrieben.

4. Wenn du Speicher im EEPROM benutzen willst, dann besser so:

    .eseg

blabla:        .byte 1  (reseviert 1 Byte im EEPROM)

    . cseg

Programm

Zugriff mit:
      ....
      ldi r17,low(blabla)
      out EEARH, r17
      ldi r17, high(blabla)
      out EEARL, r17
      ....

MfG Spess

von Jörg G. (joergderxte)


Lesenswert?

>2.'ramend' zu EEPROM-Adressierung zu verwenden ist unsinnig, da RAM und
>EEPROM unterschiedliche Grösse haben können. Beim 8515 ausnahmsweise
>gleich.

'RAMEND' und 'EEPROMEND" (so vorhanden) sind aber auch bei gleichgroßem 
RAM und EEPROM unterschiedlich - die Register und die IO-Adressen liegen 
ja im RAM, werden aber nicht bei der Größe mitgerechnet.

/klugscheiß
, Jörg

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.