Цитата(IF_P @ Aug 31 2013, 14:37)

Так я ведь никаких функций в обработчике не вызываю. Всего лишь запись значения таймера в массив, анализ и модификация счетчика. Компилятор на этапе компиляции уже знает какие р-ры он будет использовать.
У Вас в листинге видно вызов функции умножения
Код
27 ADC_7741[N_chan_7741][step7741]=TCNT1;
\ 00000026 B5AC IN R26, 0x2C
\ 00000028 B5BD IN R27, 0x2D
\ 0000002A 9140.... LDS R20, (addr_byte + 3)
\ 0000002E E050 LDI R21, 0
\ 00000030 E208 LDI R16, 40
\ 00000032 E010 LDI R17, 0
\ 00000034 .... [b]RCALL ?S_EC_MUL_L02[/b]
Надо подумать как оптимизировать все ваши манипуляции с N_chan_7741 и т.п. переменными.
Ещё Вы самостоятельно сохраняете SREG в то врем я как IAR заботится об этом сам. Это видно из листинга.
Если Вам нужно вызывать прерывание с постоянным периодом, то посмотрите на режим работы таймера CTC (clear to compire).
Я с M8535 давно работал, поэтому не подскажу сразу есть ли в ней у Т0 такой режим работы.
У Вас по обработчику прерываний видно что 1 цикл это 20 мС - т.е. Вам раз в 20 мС необходимо сохранять значение TCNT1 в буффер
По меркам МК это довольно большой период. Вы можете разделить процесс получения данных и сохранения результата в буффер. В обработчике прерывания взводите флаг прерывания и сохраняйте значение TCNT1 в промежуточный регистр. А восновном цикле мониторте флаг прерывания и манипулируйте с сохранёнными данными.
Код
volatile unsigned char tc0_int_flag;
unsigned int tcnt1_val;
#pragma vector=TIMER0_OVF_vect
__interrupt void Timer0_Interrupt(void)
{
tc0_int_flag= 1;
tcnt1_val= TCNT1;
TCNT1 = 0;
}
В основном цикле программы опрашивайте флаг tc0_int_flag
Код
if(tc0_int_flag)
{
__disable_interrupt();
tc0_int_flag = 0;
//тут вставить манипуляции с сохранением результата tcnt1_va
__enable_interrupt();
}
Если Вам нужна быстрая реакция на возможные прерывания, то измените так:
Код
if(tc0_int_flag)
{
unsigned int temp;
__disable_interrupt();
tc0_int_flag = 0;
temp = tcnt1_val;
__enable_interrupt();
//тут вставить манипуляции с сохранением результата temp
}
И не забудьте сменить режим работы таймера на СТС чтобы он генерировал прерывание и самостоятельно сбрасывал свой счётный регистр.