Hallo,
wie sichert man in einem Interrupt und andere Register in einem Xmaga
das Serg Register mit:
in SREG_sich,CPU_SREG
push tempL
push temph
...
pop temph
pop tempL
out CPU_SREG, SREG_sich
oder mit:
lds SREG_sich,CPU_SREG
push tempL
push temph
...
pop temph
pop tempL
sts CPU_SREG, SREG_sich
und gibt es bei push und pop noch was zu beachten?
aus der Doku werde ich nicht so richtig schlau.
Also ich mache das per in/out, da SREG ja 0x3f ist:
1
inr0,0x3f
2
pushr0
1
popr0
2
out0x3f,r0
Du kannst alle Registeradresse bis 0xff mit in/out ansprechen. Danach
musste allerdings load/store-Befehle verwenden.
Aber wenn du dir nicht sicher bist, gib das einfach in den Assembler so
an wie du denkst, der meckert schon, wenn du versucht ne größere Adresse
als 0xff per in/out zu bearbeiten :)
Hi
>Also ich mache das per in/out, da SREG ja 0x3f ist:> in r0, 0x3f> push r0> pop r0> out 0x3f, r0
Besonders lustig, wenn das mit einer Multiplikation zusammenkommt.
Im einfachsten Fall:
push r16
in r16,SREG
push r16
....
pop r16
out SREG,r16
pop r16
reti
Statt r16 kann natürlich auch ein anderes Register benutzt werden
MfG Spess
Hi
>@Spess: r0 kann auch benutzt werden, aber wie du schon angemerkt hast,>muss das Register selbst natürlich vorher auch gepusht werden :D
Mir braucht er das nicht zu sagen. Aber wenn man auf die Frage eines
Anfängers antwortet, dann schon wenigstens halbwegs vollständig.
MfG Spess
zum Beispiel geht bei mir nicht
...
dec spalt
brne next_1
ret
der springt im betrieb nicht aus dem Unterprogramm sondern bleibt immer
in der schleife. Das AVR Studio sagt OK die "Praxis" nicht. Ich vernute
das hängt mit den Interrupts zusammen die zur Laufzeit des
Unterprogramms greifen. Ich vermute das es Probleme mit dem SERG
Register oder mit Push und Pop gibt das ich mit lds und sts gesichert
habe.
Kenn jemand ein IR Grundgerüst für den Xmega. Falls da was anders ist
als beim ATMega.
Klar muss das "Zwischenregister" vorher gesichert werden, war ja nicht
die Frage :)
Also in einer ISR bzw. in einem Unterprogramm musst du alle Register
sichern, die du in der Routine veränderst, auch das SREG, wenn du daran
was änderst (zum Beispiel durch Rechnungen). Ansonsten wüsste ich jetzt
nicht, was beim XMega anders laufen sollte als beim Mega.
Hast du mal ein Beispielprogramm wo du exemplarisch dieses von der
beschriebene "Verhalten" zeigen kannst?
René Schink schrieb:
> und zurück mit:>> POP R0> OUT CPU_RAMPD,R0> POP R0> OUT CPU_SREG,R0> POP R0> reti
Was machst du in der ISR, so dass RAMPD verändert wird? hast du mehr als
64KiB Speicher dran?
Eigenartig, RAMPD wird ja nur gebraucht, wenn man beim direkten
Speicherzugriff LDS/STS über die 64KiB Grenze zugreift. Für mich
bedeutet dies, dass sich RAMPD im Gegensatz zu RAMPX/Y/Z nicht
automatisch verändert...
Würde mich schon mal interessieren, warum dies bei dir zu Problemen
führt.
@spess
Nun ich kenne das Datenblatt dazu und es ist eben nicht ganz so
ausführlich wie man es manchmal gerne hätte. Aber deine Antwort lässt
mich vermuten, dass du des Rätsels Lösung kennst, nur raus damit... wann
wird das RAMPD Register implizit verändert? Ich lerne gerne dazu.
Hi
>Nun ich kenne das Datenblatt dazu und es ist eben nicht ganz so>ausführlich wie man es manchmal gerne hätte. Aber deine Antwort lässt>mich vermuten, dass du des Rätsels Lösung kennst, nur raus damit... wann>wird das RAMPD Register implizit verändert? Ich lerne gerne dazu.
Bisher habe ich nur das Datenblatt überflogen. Das RAMPD-Register dient
der Eweiterung des Adressierungsbereichs bei lds/sts. Der Einzige, der
das verändern kann bist du. Vom Controller wird das Register nicht
beeinflusst.
Grundsätzlich finde ich die XMegas nicht so verschieden von den AVRs.
Aber wenn ich deine Fragen so lese, würde ich vermuten, das du bei
beiden nicht sehr firm bist.
MfG Spess
spess53 schrieb:
> Bisher habe ich nur das Datenblatt überflogen. Das RAMPD-Register dient> der Eweiterung des Adressierungsbereichs bei lds/sts. Der Einzige, der> das verändern kann bist du. Vom Controller wird das Register nicht> beeinflusst.
Ja das ist doch genau das was ich in meinem Beitrag vom (04.05.2009
22:34) geschrieben habe oder?
Ich sehe es ja genauso und daher frage ich mich wie es sein kann, dass
Renes Programm läuft wenn er RAMPD in der ISR rettet, aber RAMPD
(Achtung das ist jetzt nur eine Annahme) offensichtlich nicht bewusst
verändert (Worauf meine vorhergehende Frage an ihn abzielte).
> Grundsätzlich finde ich die XMegas nicht so verschieden von den AVRs.> Aber wenn ich deine Fragen so lese, würde ich vermuten, das du bei> beiden nicht sehr firm bist.
Ich sammel halt auch gerade meine ersten Erfahrungen mit dem XMega, wenn
du als vermutlich absoluter Experte auf dem Gebiet, der Meinung bist,
dass ich dort nicht sehr firm bin, ja dann bitte. Ich maße mir zumindest
nicht an über die Kenntnisse anderer zu Urteilen sondern versuche nur
zur Problemlösung beizutragen.
Aber wenn wir schon einmal dabei sind könntest du mir ja noch einmal
erklären welcher Teil meiner Frage, dich zu dieser Vermutung führt?