Forum: Mikrocontroller und Digitale Elektronik Tabelle ins RAM


von Hans (Gast)


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.

von Benedikt (Gast)


Lesenswert?

Adresse_von_Konstante_(Nummer)=StartAdresse_von_Konstante_0 + Nummer

Diese list du und schreibst die danach wieder.

Wo ist da das Problem ?

von Hans (Gast)


Lesenswert?

Danke für die Antwort!
Wenn die Konstanten im Ram sind werde ich wohl so operieren, laden
ändern und wieder zurück ins RAM.
Aber wie kriege ich die Werte vom Datenspeicher elegant ins RAM?

von ...HanneS... (Gast)


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

von dave (Gast)


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

von Hans (Gast)


Lesenswert?

Danke, das hilft mir!
Frohes Fest wünscht auch der Hans!

von Nilspeter (Gast)


Lesenswert?

@dave:

bin grad an ähnlicher Aufgabe dran und mich interessiert, warum das
"woher" mit 2 multipliziert ist.......
>LDI zl, low(woher*2)
>LDI zh, high(woher*2)

danke
nilspeter

von Philipp (Gast)


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.

von Nilspeter (Gast)


Lesenswert?

@philipp:

danke...habs verstanden...und das RAM in 8-Bit-Worten....
alles klar

gruss np

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.