www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variablen im Ram?


Autor: Frank Ritter (gniddle)
Datum:

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

Autor: Daniel Nöthen (bip)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Frank Ritter (gniddle)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

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.