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 | 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 :)
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
@Spess: r0 kann auch benutzt werden, aber wie du schon angemerkt hast, muss das Register selbst natürlich vorher auch gepusht werden :D
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
also per in und out. wieso sichert Ihr die Register nochmal? Nur um Sie frei zu haben?
und gibt es Irgendwelche Besonderheiten im vergleich vom den Xmega zur mega Baureihe. Speziell was Push und pop angeht.
Hi
>wieso sichert Ihr die Register nochmal? Nur um Sie frei zu haben?
Deine ersten Programmierversuche?
MfG Spess
Nee eigentlich nicht aber beim Xmega scheint einiges anders zu sein was die Register angeht.
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.
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 |
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.
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
@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?
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.