SRAM Speicherort automatisch um 1 erhöhen?

OP #3558996
Lesenswert?

Hallo,

ich programmiere gerade einen Empfangspuffer in den 24 Bits eingetaktet 
werden, der Takt wird durch einen Timer erzeugt. Habe jetzt folgendes 
Problem nachdem 8 Bits eingetaktet sind würde ich die gerne im SRAM 
ablegen und fürs nächste mal die Speicherstelle im SRAM um eins erhöhen.
Da ich mir einzelne Bytes im SRAM reserviert habe und diese einen Namen 
besitzen frage ich mich wie genau ich das machen soll.

Ich denke das ich auf das komplette Programmlisting verzichten kann da 
ja keine Fehler gesucht werden. Im Prinzip gehe ich so vor nach dem 
Startbit starte ich den Timer der mir alle 104µSek einen Pinzustand 
einließt und einen Zähler von 7 runter zählt. Danach speichere ich die 
Daten ins SRAM setzte den Zähler wieder auf 7 ein weiterer Zähler macht 
das ganze 4 mal für die 4 Bytes. Ich würde jetzt aber gerne ohne viele 
Prüfungen ob Byte1 schon gespeichert wurde... einfach bei jedem 
Durchgang die Speicherstelle um 1 erhöhen.

IdentifierH:  .byte  1
IdentifierL:  .byte  1
Nachricht:    .byte  1
Checksumme:   .byte  1

sts IdentifierH, Empfangsbuffer
beim nächsten Durchlauf soll es dann in IdentifierL landen...

Ich benötige doch dazu den Y Pointer, da der aber für 16Bit gedacht weiß 
ich nicht wie ich vorgehen muss.

Der SRAM beginnt bei $0060 = ATTiny26
Gast #3559023
Lesenswert?

HI

>Ich benötige doch dazu den Y Pointer, ...

Du kannst auch X oder Z benutzen.

>..., da der aber für 16Bit gedacht weiß >ich nicht wie ich vorgehen muss.

Na und.
1
 ldi YL, Low(IdentifierH)
2
 ldi YH,high(IdentifierH)
3

4
 st Y+, rxy  -> zeigt danach auf IdentifierL

MfG Spess
OP #3559035
Lesenswert?

hier muss ich doch die Daten schon in 2 verschiedenen Registern 
vorhalten?

Ich verwende aber nur ein ein Register = Empfangsbuffer

dieses möchte ich erst nach $0060 speichern/kopieren und beim nächsten 
mal nach $0061...-$0063

ich muss etwas auf die Codegröße achten deswegen würde mit einfach ein 
speichern und um 1 erhöhen schon reichen.
OP #3559062
Lesenswert?

ich habe es jetzt hinbekommen, hatte nicht gesehen das es im 
Instruction_Set ne 2te Seite zu dem st Befehl gab.

Ich habe jetzt zu Beginn den X Pointer auf $60 gesetzt
1
ldi r26, $60

und in meiner Schleife verwende ich dann einfach
1
st x+, Empfangspuffer

so werden meine gewünschten Stellen in SRAM mit meinen Daten befüllt.

ok mit ld x- könnte ich Sie dann natürlich wieder rückwärts auslesen.

Danke
Gast #3559081
Lesenswert?

Hi

>Ich habe jetzt zu Beginn den X Pointer auf $60 gesetzt

>ldi r26, $60

Das ist sehr fehlerträchtig.

>und in meiner Schleife verwende ich dann einfach
>st x+, Empfangspuffer
>so werden meine gewünschten Stellen in SRAM mit meinen Daten befüllt.
>ok mit ld x- könnte ich Sie dann natürlich wieder rückwärts auslesen.

Beachte aber, das

st X+, Register     erst speichert und dann incrementiert, aber

ld Register,-X      erst decrementiert und dann lädt.

MfG Spess
#3559086
Lesenswert?

Thomas O. schrieb:

> Ich habe jetzt zu Beginn den X Pointer auf $60 gesetzt
>
>
1
ldi r26, $60
>
> und in meiner Schleife verwende ich dann einfach
>
>
1
st x+, Empfangspuffer
>
> so werden meine gewünschten Stellen in SRAM mit meinen Daten befüllt.
>
> ok mit ld x- könnte ich Sie dann natürlich wieder rückwärts auslesen.

Könntest du.
Du könntest aber auch, wenn alle 4 Bytes gespeichert sind, den X-Pointer 
wieder auf $60 setzen und von vorne beginnend auslesen.
OP #3559088
Lesenswert?

ok danke nochmal für den Hinweis. Wichtig war mir eigentlich das 
speichern. Auslesen will ich es eigentlich mit meinen definierten Namen.

Wie meinst du das mit Fehlerträchtig, evtl. bei µC wechsel wegen der 
unterschiedlichen RAM Größe
was würdest du anstatt
1
ldi r26, $60
 schreiben
Gast #3559094
Lesenswert?

Thomas O. schrieb:
> ldi r26, $60

der spess meint das die register r26/r27 den Y-Pointer darstellen. 
r26=Ylow und r27=Yhigh diese sind in der controllerdatei schon 
festgelegt das heißt du kannst

ldi   yl,low(xxx)
ldi   yh,high(xxx) direkt schreiben und kommst in der programmierung 
nicht durcheinander
OP #3559236
Lesenswert?

ok habe schon verstanden das es etwas eleganter wäre, mir gings hier 
aber hauptsächlich um kleinen Code. Ich setze nun einmal die Adresse und 
erhöhe diese beim Schreiben um eins und das eben 4 mal. kurzer und 
schneller wirds kaum gehen.

Wie beschrieben hatte ich schonmal etwas in dieser Richtung gemacht.
1
ldi temp,  low(3600)      ;Teiler für Auflösung = 0,1°
2
ldi temp2, high(3600)      ;= 10 0E

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren