Forum: Mikrocontroller und Digitale Elektronik Xmega Interrupt SERG Register


von Rene (Gast)


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.

von A. N. (netbandit)


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 :)

von spess53 (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

@Spess: r0 kann auch benutzt werden, aber wie du schon angemerkt hast, 
muss das Register selbst natürlich vorher auch gepusht werden :D

von spess53 (Gast)


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

von R--- S. (rene66)


Lesenswert?

also per in und out.
wieso sichert Ihr die Register nochmal? Nur um Sie frei zu haben?

von R--- S. (rene66)


Lesenswert?

und gibt es Irgendwelche Besonderheiten im vergleich vom den Xmega zur 
mega Baureihe. Speziell was Push und pop angeht.

von spess53 (Gast)


Lesenswert?

Hi

>wieso sichert Ihr die Register nochmal? Nur um Sie frei zu haben?

Deine ersten Programmierversuche?

MfG Spess

von R--- S. (rene66)


Lesenswert?

Nee eigentlich nicht aber beim Xmega scheint einiges anders zu sein was 
die Register angeht.

von R--- S. (rene66)


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.

von R--- S. (rene66)


Lesenswert?

So geht es wen es Interessiert
1
ISR:
2
  PUSH R0
3
  IN R0,CPU_SREG   
4
  PUSH R0
5
  IN R0,CPU_RAMPD
6
  PUSH R0
7
       ; ....
8
       ;und zurück mit:
9
10
  POP R0
11
  OUT CPU_RAMPD,R0
12
  POP R0
13
  OUT CPU_SREG,R0
14
  POP R0
15
  reti

von A. N. (netbandit)


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?

von A. N. (netbandit)


Lesenswert?

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?

von R--- S. (rene66)


Lesenswert?

Einfach nur Vorsorglich und siehe da es geht.

von A. N. (netbandit)


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.

von spess53 (Gast)


Lesenswert?

Hi

Also bevor du weiter herumstocherst, solltest du dir vielleicht doch mal 
das Manual A und das zugehörige Datenblatt in Ruhe durchlesen.

MfG Spess

von A. N. (netbandit)


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.

von spess53 (Gast)


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

von A. N. (netbandit)


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?

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.