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
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.
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.
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
ldir26,$60
und in meiner Schleife verwende ich dann einfach
1
stx+,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
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
Thomas O. schrieb:> Ich habe jetzt zu Beginn den X Pointer auf $60 gesetzt>>
1
ldir26,$60
>> und in meiner Schleife verwende ich dann einfach>>
1
stx+,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.
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
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.
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
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.