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.
1 | ldi YL, Low(IdentifierH) |
2 | ldi YH,high(IdentifierH) |
3 | |
4 | st Y+, rxy -> zeigt danach auf IdentifierL |
MfG Spess
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.
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
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
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
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 | 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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.