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!
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?
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.
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).
@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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.