mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Xmega Interrupt SERG Register


Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. N. (netbandit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich mache das per in/out, da SREG ja 0x3f ist:
  in r0, 0x3f
  push r0
  pop r0
  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 :)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R--- S--- (rene66)
Datum:

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

Autor: R--- S--- (rene66)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Deine ersten Programmierversuche?

MfG Spess

Autor: R--- S--- (rene66)
Datum:

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

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So geht es wen es Interessiert
ISR:
  PUSH R0
  IN R0,CPU_SREG   
  PUSH R0
  IN R0,CPU_RAMPD
  PUSH R0
       ; ....
       ;und zurück mit:

  POP R0
  OUT CPU_RAMPD,R0
  POP R0
  OUT CPU_SREG,R0
  POP R0
  reti


Autor: A. N. (netbandit)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. N. (netbandit)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach nur Vorsorglich und siehe da es geht.

Autor: A. N. (netbandit)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. N. (netbandit)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. N. (netbandit)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.