Forum: Mikrocontroller und Digitale Elektronik Wie kann ich das SREG auf den Stack kopieren?


von Horst (Gast)


Lesenswert?

Hallo zusammen,

mal ne allgemeine Frage zum AVR Controller:

Wenn ein Timer Interrupt aufgerufen wird, so wird das Prog an der
aktuellen Stelle unterbrochen und die Interrupt Service Routine
aufgerufen. Gibt es eine Möglichkeit Das SREG auf den Stack zu legen
und danach wieder zu holen?
Beim Z80 Habe ich immer PUSH AF und POP AF werwendet.
Oder ist es bessser in der Interrupt Routine nur irgend ein Flag zu
setzten und es dann Später im Programm abzuarbeiten? Dann hätte man
aber gleich auf das ganze Interrupt Zeug verzichten können und die
Flags in eine Schleife abfragen.

Viele Grüße
Horst

von Dirk B (Gast)


Lesenswert?

So mach ich das beim Atmega 128 bei einer Interruptroutine in
Assembler:


SREG    = 0x3F

.macro  PUSHSREG
                in      r16,SREG
                push  r16
.endm

.macro  POPSREG
                pop    r16
                out    SREG,r16
.endm

von dave (Gast)


Lesenswert?

Vergiss aber nicht, r16 davor zu PUSHen und danach wieder (blödes Wort)
zu POPen, sonst bringt das mit SREG auch nicht allzu viel, weil man ja
r16 oft für was andres noch verwendet.

dave

von Horst (Gast)


Lesenswert?

Ok alles klar - dankeschön!

Muß mich noch dran gewöhnen, das bei dem Ding alles mit IN/OUT Befehlen
funzt.

Grüße Horst

von ...HanneS... (Gast)


Lesenswert?

Bei kleineren oder zeitkritischen Projekten kann es auch sinnvoll sein,
ein Register exclusiv für das SREG zu nutzen. Das erspart die
Stackzugriffe, die bei einigen Tinys mangels SRAM sowiso nicht möglich
sind. Es bleibt also bei einem IN srkopie,sreg und einem
OUT sreg,srkopie und kostet zwar ein Register Exclusiv, aber nur 2
Takte...

Guten Rutsch...
...HanneS...

von crazy horse (Gast)


Lesenswert?

richtig, und dafür kann man prima eins der sonst eher weniger
verwendeten unteren Register nehmen.
Und solange man keine verschachtelten Ints benutz, reicht ein Register,
um das sreg in allen ISRs zu sichern.

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.