Forum: Mikrocontroller und Digitale Elektronik Variablen im Ram?


von Frank R. (gniddle)


Lesenswert?

Hallo zusammen,
ich bin grade dabei mir ein wenig das Mikrocontrollern beizubringen
.... als Sprache hab ich veroert Assembler gewählt.

Naja und jetzt hab ich doch glatt mal ne 'Anfänger'-frage....
Ich habe grad eine Anwendung zur Lautstärkereglung und mache grad
Leaning by doing incl. Tial and Error.

Ich 'speichere' meine Variablen (z.B. VOL) zur Zeit in Registern
(R16-R25). Mittlerweile wird der Platz von Registern knapp.

1.Wäre es nicht sinnvoller Varable ins RAM zu schreiben und von dort
auszugeben als in einem Register? Unter dem Gesichtspunkt das man die
register ja eher für sofortige Sachen 'braucht'.

2.Der Stack liegt ja im RAM.... oder?(so les ich das aus dem Tutorial)
In welchen Adressbereich kann ich werte schreiben ohne das ich den
Stack inhalt gefährde....?

Wäre für kleine Hinweise und Tipps sehr dankbar.

MfG
Frank

von Daniel N. (bip)


Lesenswert?

Von wo bis wo Du den Ram beschreiben darfst, findest Du im jeweiligem
Datenblatt Deines µCs. Beim ATmega8 ist es z.B. ab 0x0060.
Es ist natürlich ein bisschen aufwendiger in den Speicher zu
schreiben/lesen als nur mit Registern zu arbeiten.

Gruß,
Daniel

von crazy horse (Gast)


Lesenswert?

du setzt den SP ans Ende des Rams, deine Variablen an den Anfang,
steigend. So hast du den max. Platz für den Stack - was aber nicht
heisst, dass die sich nicht in die Quere kommen, Speicherschutz gibt es
nicht. Wenn also dein stack so tief kommt, überschreibt er gnadenlos
Variable.
Adressieren kannst du direkt, also Speicheradresse wird im Befehl
angegeben (lds, sts), oftmals besser geeignet ist die indirekte
Adressierung mit den Indexregistern x,y und z, insbesondere, wenn die
Variable aus mehreren Bytes besteht oder Arrays verwaltet werden. (ld,
ldd, st, std in verschiedenen Varianten.

von Frank R. (gniddle)


Lesenswert?

Hallo Daniel,

erstmal danke für Deine Antwort.
Ich wollte mir das Mit dem AVR anhand eines kompletten Projekts
vornehmen.
Bisher benutze ich einen Inkrementalgeber mit Tastfunktion und einen
Volume-Regler (serielle Programmierung) von TI.

Da das ganze ja irgendwann mal ein Vollverstärker werden soll will ich
noch einige Funktionen mehr realisieren.
-Balance Anpassung
-Eingangswahl
-LCD-Anzeige
-Klicki-Bunti Beleuchtungseffekte

Also ne menge firlefanz zum üben :-)

Naja und da werden mir wohl die Register nicht reichen denke ich mal.

von Rolf Magnus (Gast)


Lesenswert?

> 1.Wäre es nicht sinnvoller Varable ins RAM zu schreiben und von
> dort auszugeben als in einem Register?

Man muß sie halt immer erst ins RAM kopieren und wenn man sie braucht,
denn jegliche Änderung und Verwendung des Wertes kannst du nicht direkt
im RAM, sondern nur in einem Register machen.

> Unter dem Gesichtspunkt das man die register ja eher für sofortige
> Sachen 'braucht'.

Naja, bei 32 Registern braucht man selten alle gleichzeitig. Aber wenn
sie knapp werden, sind natürlich Variablen im RAM eine Möglichkeit.

> 2.Der Stack liegt ja im RAM.... oder?(so les ich das aus dem
> Tutorial)

Ja, außer bei denen, die kein RAM haben.

> In welchen Adressbereich kann ich werte schreiben ohne das ich den
> Stack inhalt gefährde....?

Das kommt drauf an. Üblich ist, den Stack ans Ende zu legen. Wie groß
dein Bereich des RAM ist, den du für Variablen nutzen kannst, hängt
dann aber immer noch davon ab, wie weit der Stack wächst, also von der
maximalen Tiefe der Funktionsaufrufe und der Anzahl an Registern, die
du auf den Stack "push"st.
Frank

von Rolf Magnus (Gast)


Lesenswert?

> Man muß sie halt immer erst ins RAM kopieren und wenn man sie
> braucht,

... wieder zurückkopieren, ...

> denn jegliche Änderung und Verwendung des Wertes kannst du nicht
> direkt im RAM, sondern nur in einem Register machen.

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.