Forum: Mikrocontroller und Digitale Elektronik wie mehr variblen?


von raoul (Gast)


Lesenswert?

hallo,
ich arbeite mit assembler und avr's. in bascom und c hat man so schön
viele verschiedene variablen und in assembler muss man sich mit 32
registern (mit den unteren 16 kann ich net arbeiten, weil ich nich weiß
wie das geht :( ) abmühen. gibt es in asm vielleicht auch solche
variablen die dann im flash gespeichert werden? wann ja wie geht das
dann und wenn das nicht geht wie kann ich mit den unteren 16 registern
arbeiten?

mfg raoul

von Christian Zietz (Gast)


Lesenswert?

Klar kann man mit den unteren 16 Registern arbeiten, nur nicht mit
Instruktionen mit "immediate"-Addressierung, d.h. die das Register
mit einer Konstante verknüpfen. Für Rechenoperationen zwischen zwei
Registern oder als MOV-Ziel sind die unteren Register durchaus
geeignet.
Und klar kann man Variablen anlegen (normalerweise im RAM) und mit
ld(s) bzw. st(s) darauf zugreifen.
Du solltest Dir mal die Assemblerbefehlsübersicht für AVRs angucken.

von Rolf Magnus (Gast)


Lesenswert?

> viele verschiedene variablen und in assembler muss man sich mit 32
> registern (mit den unteren 16 kann ich net arbeiten, weil ich nich
> weiß wie das geht :( ) abmühen.

Die unteren 16 Register können halt nicht mit jedem Befehl genutzt
werden. Sonst da nichts spezielles dran. Die Befehle, die auch
immediate-Werte annehmen (ldi, cpi, ...) gehen z.B nicht, weil da zu
wenig Bits übrig sind für die Registernummer.

> gibt es in asm vielleicht auch solche variablen die dann im flash
> gespeichert werden?

Müssen die unbedingt im Flash stehen? Warum nicht ins RAM?

von Hannes L. (hannes)


Lesenswert?

Vielleicht, weil die AVRs bedeutend mehr Flash als SRAM haben und man
den Unterschied der verschiedenen Speicherarten noch nicht richtig
kennt?

;-)

...

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Wo Variablen gespeichert werden sollte vom Verwendungsweck,
Zugriffgeschwindigkeit und Lebensdauer der Variabalen (soweit man in
Assembler von Variablen sprechen kann) abhängen. Ausserdem ist der der
Speicherbedarf zu beachten.
Beispiele:
Große Datenmenge: Speicherort RAM und mit Pointer(X,Y,Z) zugreifen
Daten, die nach Ausschalten erhalten bleiben sollen:
  Speicherort: EEPROM, evtl. Kopie bei Programmstart in RAM laden und
  nur bei Veränderung im EEPROM speichern.
Übergabe an Unterprogramme (wenige,kleinere Variablen)
  Übergabe in Registern (vorzugsweise r16-r31) je nach Badarf mit
  push/pop sichern und restaurieren.

.......

Fazit: Wie 'Variablen' in Assembler angelegt werden hängt von vielen
Faktoren und auch vom Programmierstil ab.

MfG HG

von Thomas K. (thkais)


Lesenswert?

Manch aktuelle µController haben wesentlich weniger Register... Da ist
man mit den 32 Registern des AVR ziemlich verwöhnt.

Schau Dir mal die Befehle LD und ST an.
"Variablen" im Flash sind keine Variablen, sondern Konstanten - d.h.,
sie lassen sich nicht verändern.

von Rolf Magnus (Gast)


Lesenswert?

Um das alles mal zusammenzufassen:

Es gibt drei Arten von Speicher im AVR, Flash, RAM und EEPROM.

Im Flash steht primär der Programmcode. AVRs können Programmcode nur
aus diesem Speicher heraus ausführen. Dieser Speicher kann auch für
Daten genutzt werden, aber diese sind dann nur lesbar (schreiben geht
zwar bei den meisten AVRs auch, aber das ist etwas umständlicher,
langsam, und die Zahl an Schreibvorgängen ist stark begrenzt). Das
eignet sich für fixe Tabellen und Konstanten. Der Flash ist bei AVRs
immer der größte Speicher. Der Zugriff darauf erfolgt in Assembler mit
lpm bzw. elpm.

RAM ist der eigentliche Datenspeicher. Er kann sehr schnell und
beliebig oft gelesen und geschrieben werden. Er verliert allerdings
seinen Inhalt, wenn die Stromversorgung abgestellt wird. Er kann mit
ld, ldd, lds gelesen und mit st, std, sts geschrieben werden.

EEPROM ist der Speicher, um sich Daten über das Aus-/Einschalten hinweg
zu merken. Er ist aber relativ langsam, vor allem beim Schreiben, und
auch bei ihm ist die Zahl an Schreibzyklen begrenzt.
Der Zugriff auf diesen erfolgt über I/O-Register und ggf. Interrupts
(wird ausgelöst, wenn ein Schreibzugiff fertig ist).

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.