PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Byte mit Nosave hochzählen lassen



Rohbotiker
20.07.2008, 17:42
Hallo,

ich möchte in einer Interruptroutine mit Nosave eine Bytevariable mit incr hochzählen, welche Register muss ich sichern?

linux_80
20.07.2008, 17:57
Hallo,
Am besten erstmal einfach compilieren, und dann zB. mit AVR-Studio das Hexfile öffnen, und schauen welche Register verwendet wurden !

Rohbotiker
20.07.2008, 18:03
AVR Studio habe ich nicht auf dem Rechner, und will es jetzt auch nicht unbedingt aufspielen, wäre schon, wenn jemand die Register im Hinterkopf hätte und sie mal kurz schreiben könnte.

Vitis
20.07.2008, 22:39
wird so pauschal leider nicht gehen, da bascom intern
die Register verwaltet werden. Der Weg übers Studio wird der
einfachere sein :(

Dirk
21.07.2008, 05:48
Hallo Rohbotiker,

probier 'mal dies. Getestet für das Hochzählen einer Word-Variable.

Tim1_isr: 'NOSAVE
$asm
push r24 'total 15 cycles
PUSH r25
PUSH r26
PUSH r27
push r30
push r31
IN r24,SREG
PUSH r24
$end Asm
Timer1 = Startwert
Incr Word_var
$asm
POP r24 'always necessary
Out Sreg , R24
pop r31
pop r30
POP r27
POP r26
POP r25
POP r24
$end Asm
Return
Gruß Dirk

-tomas-
22.07.2008, 16:28
Hallo Dirk,

Deine Methode ist sehr heikel. Auch wenn Du mit AVR Studio die Register geprüft hast, weist Du nicht was Bascom in anderen Versionen zwischen "$end Asm" und "$asm" mit den Registern anstellt.

Darum gilt: Programmiere jede NoSave ISR immer(!!) durchgängig in ASM. Bei komplexen Aufgaben in der ISR nur ein Flag setzen und in der Main das Flag abarbeiten.

Hier mal der angefragte Code für die Byte Variable Zaehler:

isr_Zaehler:
$asm
PUSH R24 'save used registers
IN r24, SREG
PUSH R24

LDS R24,{Zaehler}
SUBI R24,&HFF 'Incr Zaehler
STS {Zaehler},R24


POP R24 'get content of SREG
!OUT SREG, R24
POP R24
$end Asm
Return

Hinweis: In ASM gibt es ADD mit einer Konstanten nur für Word (ADIW), deshalb SUBI.