Xmega Interrupt SERG Register

Gast #1250501
Lesenswert?

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.
#1250513
Lesenswert?

Also ich mache das per in/out, da SREG ja 0x3f ist:
1
  in r0, 0x3f
2
  push r0
1
  pop r0
2
  out 0x3f, 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 :)
Gast #1250523
Lesenswert?

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
Gast #1250539
Lesenswert?

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
#1250670
Lesenswert?

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.
#1250821
Lesenswert?

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?
#1250833
Lesenswert?

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.
#1250864
Lesenswert?

@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.
Gast #1250927
Lesenswert?

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
#1250946
Lesenswert?

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?

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