Ну что-нибудь типа такого
Код
#pragma diag_suppress=Ta006
__interrupt void DoADC(void)
{
UREG m;
UREG b;
asm("MOVW R17:R16,R31:R30");
asm("IN R30,0x32");
asm("SUBI R30,0x14");
asm("ANDI R30,15");
asm("CLR R31");
asm("SUBI R30, LOW((-(NOP_LIST/2) & 0xFFFF))");
asm("SBCI R31, (-(NOP_LIST/2) & 0xFFFF) >> 8");
asm("IJMP");
asm("NOP_LIST: NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("MOVW R31:R30,R17:R16");
.....
.....
.....
}
#pragma diag_default=Ta006
#pragma vector=TIMER0_COMP_vect
__raw __interrupt void INTERRUPT_DISPATCH(void)
{
((void(*)(void))DoADC)();
if (USART_LOCK) return;
USART_LOCK=1;
__enable_interrupt();
((void(*)(void))UsartRx)();
__disable_interrupt();
USART_LOCK=0;
}
На самом деле можно выбросить код, который для работы со вложенными прерываниями (при этом откорректировав число в asm("SUBI R30,0x14") ). Закопипастил просто с рабочего проекта.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин