Hallo,
Am besten erstmal einfach compilieren, und dann zB. mit AVR-Studio das Hexfile öffnen, und schauen welche Register verwendet wurden !
Hallo,
ich möchte in einer Interruptroutine mit Nosave eine Bytevariable mit incr hochzählen, welche Register muss ich sichern?
Hallo,
Am besten erstmal einfach compilieren, und dann zB. mit AVR-Studio das Hexfile öffnen, und schauen welche Register verwendet wurden !
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.
wird so pauschal leider nicht gehen, da Bascom intern
die Register verwaltet werden. Der Weg übers Studio wird der
einfachere sein![]()
Vor den Erfolg haben die Götter den Schweiß gesetzt
Hallo Rohbotiker,
probier 'mal dies. Getestet für das Hochzählen einer Word-Variable.
Gruß DirkCode: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
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:
Hinweis: In ASM gibt es ADD mit einer Konstanten nur für Word (ADIW), deshalb SUBI.Code: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
Lesezeichen