www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wertespeicher


Autor: Tobias (Gast)
Datum:

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

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

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

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

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

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

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

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank soweit!
Werds mal versuchen!

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

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

Autor: Thomas O. (Gast)
Datum:

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

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

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

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

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

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.