Я всегда в EWAVR вот такой скелет использую. Только вектор прерывания меняю и тело переписываю. А когда в главной программе обращаюсь к переменной, используемой в прерывании, это прерывание временно запрещаю.
Код
//* Обработчик прерывания PCINT0 */
name EXT_PCINT0
#include "iom88pa.h"
extern PCINT0_ISR
common INTVEC(1) ; Code in interrupt vector segment
org PCINT0_vect ; Place code at interrupt vector
rjmp PCINT0_ISR ; Jump to assembler interrupt function
endmod
name PCINT0_ISR
#include "iom88pa.h"
extern count; внешняя переменная
public PCINT0_ISR
rseg CODE ; This code is relocatable, RSEG
PCINT0_ISR:
st -Y,R16 ; Push used registers on stack
in R16,SREG ; Read status register
st -Y,R16 ; Push Status register
lds R16,count
inc R16
sts count,R16
ld R16,Y+ ; Pop status register
out SREG,R16 ; Store status register
ld R16,Y+ ; Pop Register R16
reti
end