Forum: Mikrocontroller und Digitale Elektronik Wertespeicher


von Tobias (Gast)


Lesenswert?

Hallo
Ich möchte mit einem ATMega8515 in Assembler Messwerte speichern um
später auf diese zurückgreifen zu können.
Ist dies auf folgende Art und Weise möglich bzw.sinnvoll?

.org 0x500
Wertespeicher:

loop:
(CODE)

ldi  ZL,(Wertespeicher*2)
ldi  ZH,(Wertespeicher*2)
st   Z+,r15
st   Z+,r16
rjmp loop

Meine Messwerte liegen nach der Messung jeweils in r15:r16
Nun möchte ich eben erstmal 10 Messungen machen und danach mit dem
Durchschnittswert dieser Messungen weiter rechnen.

Falls umständlich:
Wie kann ich Werte fortlaufend speichern ohen groß Register zu
verschwenden und später wieder auf diese Werte zurückgreifen?

Vielen Dank schonmal für eure Hilfe!

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Messwerte gleich aufaddieren, später durch 10 teilen.

Das SRAM ist doch 8bit-weise orgenisiert, nur Tabellen im Flash
brauchen die 16Bit-Adressumrechnung mit "Wertespeicher*2" oder habe
ich das falsch in Erinnerung?

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

das muß doch low(Wertespeicher) und high(Wertespeicher heißen oder so
ähnlich

von Jadeclaw D. (jadeclaw)


Lesenswert?

Grundsätzlich geht das so, aber es fehlt noch was:
Aus:

.org 0x500
Wertespeicher:

loop:
(CODE)

ldi  ZL,(Wertespeicher*2)
ldi  ZH,(Wertespeicher*2)
st   Z+,r15
st   Z+,r16
rjmp loop

machen wir:
.cseg
loop:
(CODE)

ldi  ZL,(Wertespeicher*2)
ldi  ZH,(Wertespeicher*2)
st   Z+,r15
st   Z+,r16
rjmp loop

.dseg
.org 0x500
Wertespeicher: .byte 128

.dseg sagt dem Assembler, dass dieses Label
im SRAM liegt, und das 128bytes dafür reserviert sind.
Es geht auch ohne .byte, nur hat man dann die Labels alle ohne Abstand
hintereinandersitzen
0x500 ist übrigens vieeeeel zu hoch für diesen Controller, es sei denn,
du hast externen Speicher dran (XRAM)

.cseg sagt dem Assembler: Hier ist Code.

Gruss
Jadeclaw.

von johnny.m (Gast)


Lesenswert?

Christoph hat recht. Wenn Du ne Mittelwertbildung machen willst, addiere
direkt die Werte auf. Nimm dann aber für den Mittelwert besser (wenns
geht) nicht 10 Werte sondern eine Potenz von 2 (also 8 oder 16 Stück).
Dann kannste die Division am Ende direkt durch einen Right Shift machen
(spart Rechenzeit und Programmieraufwand).

von Jadeclaw D. (jadeclaw)


Lesenswert?

@Christoph: Du hast Recht, und wer Recht hat, gibt einen aus. ;-)
Jetzt aber richtig.
.cseg
loop:
(CODE)

ldi  ZL,(Wertespeicher)
ldi  ZH,(Wertespeicher)
st   Z+,r15
st   Z+,r16
rjmp loop

.dseg
.org 0x500
Wertespeicher: .byte 128

Gruss
Jadeclaw.

von Tobias (Gast)


Lesenswert?

Vielen Dank soweit!
Werds mal versuchen!

von Jadeclaw D. (jadeclaw)


Lesenswert?

Letzter Versuch. (Wann kommt endlich die Editiermöglichkeit hier?!?!?)
Jetzt aber richtig.
.cseg
loop:
(CODE)

ldi  ZL,low(Wertespeicher)
ldi  ZH,high(Wertespeicher)
st   Z+,r15
st   Z+,r16
rjmp loop

.dseg
.org 0x500
Wertespeicher: .byte 128

Gruss
Jadeclaw.

von Thomas O. (Gast)


Lesenswert?

da ich auch viele Werte zwischenspeichern muss und die Register da
schnell aufgebraucht sind, setze ich das ganze auch ins SRAM ich mache
es dann so.

.DSEG  ;Reserve jeweils 1 Byte im SRAM
Steuerbyte1:  .byte 1
Steuerbyte2:  .byte 1
ADCWert1:     .byte 1
ADCWert2:     .byte 1
ADCWert3:     .byte 1
ADCWert4:     .byte 1
ADCWert5:     .byte 1

.cseg       ;weiter Codesegment sonst Fehlermeldung
.....
.....

im Programm kann ich dann ganz einfach was daraus Laden oder Speichern
ohne mich um die Speicherzelle kümmern zu müssen.

lds temp, ADCWert1    ;Lade gespeicherten ADCWert1 nach temp
sts ADCWert1, temp    ;Speichere temp nach ADCWert1

Es muss aber auch irgendwie mit 2 Pointern gehen da ja nur die kleinen
AVRs 256 Byte SRAM haben der sich mit 8Bit adressieren liesse.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

So langsam kommen wir der Lösung näher...

"Über die allmähliche Verfertigung der Gedanken beim Reden"
Heinrich von Kleist (1805)
http://gutenberg.spiegel.de/kleist/erzaehlg/gedanken.htm

von Jadeclaw D. (jadeclaw)


Lesenswert?

ROTFLMAO! Gab ja schon eine Menge hier, aber Kleist ist ein Novum.
Zurück zum Thema:
@Thomas:
Zum Ablegen von Einzelwerten macht man es so.
Will man aber mehrere Werte auf einmal abladen, kann man das erste
Label ins Z-Indexregister laden und dann alle weiteren über
ST Z+, temp erreichen.
Nochwas, auch bei nur 256byte braucht man beide Teile eines
Index-Registers, da der frei nutzbare SRAM-Bereich bei 0x0060 beginnt.
Deshalb brauchts auch dort 9 Bit.
Bei einigen neueren/grösseren Controllern noch später, siehe
Datenblatt.
Der Bereich davor ist zwar auch über ST/LD erreichbar, aber die
Portregister taugen nicht zum Daten ablegen.

Gruss
Jadeclaw.

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.