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
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
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
Ok alles klar - dankeschön! Muß mich noch dran gewöhnen, das bei dem Ding alles mit IN/OUT Befehlen funzt. Grüße Horst
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.