Wie kann ich das SREG auf den Stack kopieren?

Gast #135225
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
Gast #135226
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
Gast #135227
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
Gast #135229
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...
Gast #135230
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.