Tabelle ins RAM

Gast #134540
Lesenswert?

Guten Tag!

Habe eine allgemeine Frage! Ich möchte gerne in Assembler im Programm
eine Tabelle mit Konstanten definieren, etwa 200 Werte. Diese Werte
sind  ja dann im Datenspeicher vom AVR. Nun möchte ich all diese Werte
einmal während des Programm-Ablaufes ins RAM laden und mit den
Konstanten arbeiten, sie laden und evtl. ändern und wieder ins RAM
zurück speichern.
Wie kriegt man sowas am besten auf die Reihe? Vorallem möchte ich gerne
wild, nicht der Reihe nach auf die Werte zugreiffen. Das heisst im
Programmablauf möchte ich z.B. die Konstante Nr. 120 im RAM laden,
verändern un wieder an ihrem Platz zurückspeichern.
Grüesse, Hans.
Gast #134543
Lesenswert?

Hi...

Du kannst keine "Konstanten" ändern...
Denn dann sind es ja bereits "Variable"... ;-D

Zu Programmbeginn in einer Schleife die gesamte Tabelle mittels LPM
r0,z+ und st y+,r0 aus dem Flash ins SRAM übertragen. Dann nur noch
SRAM-Zugriffe per LD/ST, LDS/STS, LDD/STD...

Frohen Rest vom Fest...
...HanneS...
Gast #134544
Lesenswert?

Das, was Hannes grad gesagt hat. Das mit den 200-mal ist etwas Quick and
Dirty, aber solange du nicht mehr als 255x das machst geht das.. sonst
noch nen high-Byte Vergleich.

LDI yl, low(wohin)
LDI yh, high(wohin)
LDI zl, low(woher*2)
LDI zh, high(woher*2)

Label1:
 CPI yl, low(wohin+200)
 BREQ Label2
 LPM r16, z+
 ST y+, r16
 RJMP Label1

Label2:
 ....

dave
Gast #134547
Lesenswert?

Weil der Programmspeicher in 16-Bit-Worten organisiert sind, d.h. das
Label verweist auf die Wortnummer z.B. $40. In diesem Wort befinden
sich also die Bytes $80 und $81. Für den byteweisen Zugriff mit LPM muß
also das Label mit 2 multipliziert werden.

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