EEprom AVR-DA (avr128da32)

OP #6563471
Lesenswert?

Hallo zusammen,

bin gerade darüber gestolpert, dass der EEProm-Zugriff via 
eeprom_read_block(), etc. aus der AVR-libc bei der DA-Familie 
(scheinbar) nicht korrekt funktioniert.

Zumindest funktioniert Code für den mega4808 auf dem avr128da32 nicht 
mehr korrekt.

Hat das jemand schon mit Erfolg getestet?

Danke!
Beitrag #6563489 wurde von einem Moderator gelöscht.
Gast #6563529
Lesenswert?

Zu C kann ich nichts sagen, aber aus Assembler-Sicht höchst simpel:

- lesen: wie SRAM auch, mit ld (0x1400..15FF)
- schreiben: z.B. NVMCTRL_CTRLA mit 0x13 (EEERWR: EEPROM Erase and Write 
Enable) laden, danach mit st byte-weise schreiben
#6564950
Lesenswert?

Veit D. schrieb:
> darf man fragen was an der avr-libc veraltet sein soll?

Nichts. Er nennt das nur so. Weil er sich nicht vorstellen kann, daß 
manche Leute anderes (und wichtigeres) zu tun haben, als in ihrer 
Freizeit und ehrenamtlich Unterstützung für den neuesten ScheiXX in die 
avr-libc zu hacken. Deshalb liest er auch nicht die Dokumentation 
(zumindest die unterstützten µC).
Gast #6714709
Lesenswert?

> ... wo das offiziell vermerkt ist? Bin das Datenblatt ...

Ob das irgendwo explizit im Datenblatt 'AVR® DA Family' steht, kann ich 
auf die Schnelle nicht sagen.
  Implizit folgt es aus '7.2 Memory Map' unter 'Data space' und 'AVR® 
Instruction Set Manual' unter z.B. 'LD – Load Indirect from Data Space' 
&c.
Beitrag #6715067 wurde von einem Moderator gelöscht.
Gast #6715089
Lesenswert?

> ...?...?...?...?...

Das sind mir denn doch zu viele Fragen auf einmal - ich schlage vor, es 
selbst auszuprobieren.
  Nur so viel: "Cycle time for data memory access assumes internal RAM 
access, and are not valid for access to NVM. A minimum of one extra 
cycle must be added when accessing NVM. The additional time varies 
dependent on the NVM module implementation. See the NVMCTRL section in 
the specific devices data sheet for more information" aus dem 'AVR® 
Instruction Set Manual' unter 'LD'.
Gast #6715141
Lesenswert?

Danke für die Info zur Zugriffszeit! Also ist der EEPROM Lesezugriff 
etwas langsamer.

S. Landolt schrieb:
> ich schlage vor, es selbst auszuprobieren

Habe leider gerade nicht die Möglichkeit dazu.
Das System mit den (in den Datenraum eingeblendeten) richtigen EEPROM 
Adressen zu verstehen wär mal recht aufschlussreich. Denn zwischen Mega, 
XMega und AVR128 gibts da wohl gewisse Unterschiede. Da der 
(Lese-)Zugriff beim AVR128Dx nun maximal vereinfacht wurde kann man 
hoffentlich davon ausgehen, daß die Adresse nun ebenso simpel wie beim 
.DSEG SRAM verwendet wird.
Gast #6715308
Lesenswert?

> Beitrag #6715067 wurde von einem Moderator gelöscht.
Nanu? Warum das denn?


Lesen von EEPROM: ld 3, lds 4 Takte.

> Eventuell ist ja für die Daten im .ESEG Segment
> noch ein .org 1400$ fällig?

Ja, das scheint so zu sein; falls da jemand eine gute Lösung weiß, wäre 
ich dankbar (auch wenn ich das EEPROM sehr selten nutze):
1
.eseg  ; EEPROM
2
;**********************
3
.org EEPROM_START   ; sic! trotz Warnung
4
EEdistance:      .byte 32
5
EEtestaddress:   .byte 1
bringt zwei Warnungen "... beyond end of memory at 0x1ff" mit avrasm2 
('AVR macro assembler 2.2.8).
Gast #6715395
Lesenswert?

S. Landolt schrieb:
> bringt zwei Warnungen "... beyond end of memory at 0x1ff"

Vor allem aber lässt es sich mit dem AS7 Device Programming so nicht ins 
EEPROM programmieren: "File contents does not map to any valid device 
memory for programming EEPROM"

Die funktionierende Lösung ist so umständlich wie zuvor:  Man muß zu den 
Adressen im .ESEG jeweils EEPROM_START addieren um sie dann via LDx 
richtig anzusprechen. Ich verstehe nicht warum das weiter so unintuitiv 
und anders als im .DSEG SRAM gehandhabt wird.
Gast #6715869
Lesenswert?

c-hater schrieb:
> Hoffe, das hilft.

Ja ganz nett mit EEMAP Macro Krücke für dieses theorerisch besser 
lösbare Problem. Bin aber absolut kein Freund solcher 
Macro-Programmierung weil sie meist Code in Gänze schwerer durchschaubar 
macht und neue Fehler provoziert. Mir ist die Extra-Zeile

.ESEG
EE_VAR .DB 7,8,9
...

.EQU EEMM_VAR = EE_VAR+EEPROM_START
...

zum LDx Zugriff wesentlich lieber (MM= MemoryMapped). Zumal das nicht 
die Zeilenanzahl erhöht da die Macro-Variante zusätzlich zu ihrer 
Definition auch 2 Zeilen pro .ESEG Variablendefinition benötigt. EEWAIT 
ist leider auch nicht der Weisheit letzter Schluss, zumal in Interrupts. 
Code kann ja während dem EEPROM-Schreiben weiterlaufen.
Gast #6715908
Lesenswert?

Tom schrieb:

> Mir ist die Extra-Zeile
> zum LDx Zugriff wesentlich lieber

Dann mach's so. Es wird ja niemand gezwungen, meine Macros zu verwenden.

> Zumal das nicht
> die Zeilenanzahl erhöht da die Macro-Variante zusätzlich zu ihrer
> Definition auch 2 Zeilen pro .ESEG Variablendefinition benötigt.

Wenn das dein ganzes Problem ist: Man könnte das Macro auch ändern, das 
ist ja nicht in Granit gemeisselt.
1
;->@0: name of the the label to set to access mapped EEPROM
2
;  @1: one single deklaration or definition for eseg
3
.MACRO EEMAP
4
@0_EEP:
5
 .EQU @0=@0_EEP+EEPROM_START
6
 @1
7
.ENDMACRO
8

9
.ESEG
10
EEMAP InitializedTestdata, .DW $4711
11
EEMAP NotInitializedTestdata, .BYTE 2




 EEWAIT
> ist leider auch nicht der Weisheit letzter Schluss, zumal in Interrupts.
> Code kann ja während dem EEPROM-Schreiben weiterlaufen.
Gast #6715915
Lesenswert?

c-hater schrieb:

>  EEWAIT
>> ist leider auch nicht der Weisheit letzter Schluss, zumal in Interrupts.
>> Code kann ja während dem EEPROM-Schreiben weiterlaufen.

Hier war ich noch nicht fertig. Die Sache hier ist: EEWAIT stellt erst 
sicher, dass er weiterläuft. Ein Schreibzugriff auf's EEPROM bei einem 
noch laufenden vorigen Schreibzugriff hält ihn nämlich komplett an, u.U. 
für etliche ms. Siehe Datenblatt...

Wenn man das interruptbasiert abwickelt, benutzt man das Macro einfach 
nicht und gut isses.
Gast #6715946
Lesenswert?

Egal ob Interrupt oder im Hauptprogramm: EEWAIT hält den Programmlauf 
grundsätzlich unnötig auf wenn noch ein Schreibzugriff läuft. Das 
lässt sich schlauer programmieren- am besten mit EEREADY Interrupt, denn 
wozu ist der da?!

c-hater schrieb:
> Man könnte das Macro auch ändern, das ist ja nicht in Granit gemeisselt.

Gut. Das schaut so schon etwas besser aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren