www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tabelle ins RAM


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Adresse_von_Konstante_(Nummer)=StartAdresse_von_Konstante_0 + Nummer

Diese list du und schreibst die danach wieder.

Wo ist da das Problem ?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das hilft mir!
Frohes Fest wünscht auch der Hans!

Autor: Nilspeter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nilspeter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@philipp:

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

gruss np

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.