Forum: Mikrocontroller und Digitale Elektronik SRAM Speicherort automatisch um 1 erhöhen?


von Thomas (kosmos)


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

von spess53 (Gast)


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

von Thomas (kosmos)


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.

von chris (Gast)


Lesenswert?

warum willst du das denn so machen??

du kannst doch von $0060-$0063 vollschreiben und liest das ding 
rückwärts aus mit

ld rxy,-Y

von Thomas (kosmos)


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

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

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

ja schon geht aber nicht muss  ld   -x heißen :-P

von spess53 (Gast)


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

von Karl H. (kbuchegg)


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.

von Thomas (kosmos)


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

von Thomas (kosmos)


Lesenswert?

Ja wie rum ich das auslese spielt ja eigentlich keine Rolle ich wollte 
es nur mit möglichst wenig Befehlen bewerkstelligen.

Also Danke nochmal an alle.

von chris (Gast)


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

von chris (Gast)


Lesenswert?

Nachtrag Beispiel

.equ $0060 = identifier
.def temp0 = r16

ldi   yl,low(identifier)
ldi   yh,high(identifier)

start:
   ldi   temp0,$ff
   st    y+,temp0
   cpi   yl,identifier+4
   brne  start

von Thomas (kosmos)


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

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.