Forum: Mikrocontroller und Digitale Elektronik EEprom AVR-DA (avr128da32)


von Wilhelm M. (wimalopaan)


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!

von Andreas B. (bitverdreher)


Lesenswert?

Wilhelm M. schrieb:
> Zumindest funktioniert Code für den mega4808 auf dem avr128da32 nicht
> mehr korrekt.

Warum sollte er auch? Ist ja ein anderer uC.

Beitrag #6563489 wurde von einem Moderator gelöscht.
von S. Landolt (Gast)


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

von Wilhelm M. (wimalopaan)


Lesenswert?

Interessant ist, das die avr-libc für die avrmega0-Serie (4808) 
funktioniert, und für die DA nicht. Der NVMCTRL ist doch gleich ... aber 
wohl nur fast.

von S. Landolt (Gast)


Lesenswert?

> Der NVMCTRL ist doch gleich ... aber wohl nur fast.

Die Tabelle für NVMCTRL_CTRLA ist doch völlig anders.

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Nachtrag

von Wilhelm M. (wimalopaan)


Lesenswert?

Jupp, danke!

Wo Du Recht hast, hast Du Recht! Das habe ich übersehen ...

von Wilhelm M. (wimalopaan)


Lesenswert?

Eine template-spezialisierung weiter hat die DA/DB/(DD) nun wieder 
dieselbe Schnittstelle ;-) Schade nur, dass die avr-libc auch an dieser 
Stelle veraltet.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

darf man fragen was an der avr-libc veraltet sein soll?

von Axel S. (a-za-z0-9)


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).

von Tom (Gast)


Lesenswert?

S. Landolt schrieb:
> Zu C kann ich nichts sagen, aber aus Assembler-Sicht höchst
> simpel:
>
> lesen: wie SRAM auch, mit ld (0x1400..15FF)

Kannst Du mir sagen wo das offiziell vermerkt ist? Bin das Datenblatt 
rauf und runter aber finde zu diesem EEPROM-Lesezugriff keinen Beleg!

von S. Landolt (Gast)


Lesenswert?

Zum Beispiel:
http://ww1.microchip.com/downloads/en/Appnotes/Migration-from-megaAVR-to-AVR-DxMCU-Fam-DS00003731A.pdf

'2.3.2 SRAM and EEPROM Memories':
The EEPROM is located in the Data space for the AVR Dx devices. That 
allows a linear addressing of the entire area and faster access using 
the LD/ST instructions:

von S. Landolt (Gast)


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.
von S. Landolt (Gast)


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'.

von Tom (Gast)


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.

von S. Landolt (Gast)


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).

von S. Landolt (Gast)


Lesenswert?

PS:
Und dies funktioniert eben nicht (im Gegensatz zu .dseg):
1
.eseg  ; EEPROM
2
;**********************
3
;.org EEPROM_START
4
EEdistance:      .byte 32
5
EEtestaddress:   .byte 1

von Tom (Gast)


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.

von S. Landolt (Gast)


Lesenswert?

> ... AS7 ...
Nun, dies tangiert mich nicht, da ich (festhalten) mit dem AVR Studio 
4.11 arbeite; und mit den maximal zwei Warnungen kann ich leben.

> Ich verstehe nicht ...
Da sind wir schon zu zweit.

von Tom (Gast)


Lesenswert?

S. Landolt schrieb:
> da ich (festhalten) mit dem AVR Studio 4.11 arbeite

Erstaunlich. Da hätte ich Bedenken, daß die neuesten AVRs nicht mehr 
(vollumfänglich) unterstützt werden!

von S. Landolt (Gast)


Lesenswert?

?
Benötigt man als Assemblerprogrammierer mehr als den neuesten Assembler? 
Und auch den nur, wenn die Warnung "Unrecognized core version: V4S" 
stört.

von c-hater (Gast)


Angehängte Dateien:

Lesenswert?

S. Landolt schrieb:

> 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):

Hoffe, das hilft.

von S. Landolt (Gast)


Lesenswert?

Prima - vielen Dank, c-hater!

von Tom (Gast)


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.

von Tom (Gast)


Lesenswert?

Berichtigung: Hinter EE_VAR fehlte der Doppelpunkt

.ESEG
EE_VAR: .DB 7,8,9

von c-hater (Gast)


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.

von c-hater (Gast)


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.

von Tom (Gast)


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.

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.