Цитата(777777 @ Aug 12 2010, 09:19)

Однако сейчас, отлаживая устройство, я обнаружил странную вещь - прерывание таймера не прерывается UART-ом. Обработка UART-а задерживается независимо от того, ставлю ли я sei в начале подпрограммы обработки таймера или не ставлю. Может ли такое быть или у меня глюки? И если может, то как разрешить прерывать таймер во время его обработки?
При разрешении прерываний внутри обработчика прерываний будут выполняться другие возникшие в этот момент прерывания. Но как Вам написали выше в кажом обработчике прерываний необходимо сохранять и восстанавливать состояние регистра SREG.
Снизу пример обработчика перываний от UART сгенерированный IARом. Он в каждом прерывании сохраняет и восстанавливает состояние SREG.
CODE
\ __nearfunc __version_3 __interrupt void USART0_RX_IRQ()
\ ??USART0_RX_IRQ:
\ 00000000 93FA ST -Y, R31
\ 00000002 93EA ST -Y, R30
\ 00000004 934A ST -Y, R20
\ 00000006 933A ST -Y, R19
\ 00000008 932A ST -Y, R18
\ 0000000A 931A ST -Y, R17
\ 0000000C 930A ST -Y, R16
\ 0000000E B74F IN R20, 0x3F //тут IAR сохраняет SREG
\ 00000010 910000C6 LDS R16, 198
\ 00000014 .... LDI R30, LOW(Rx0Head)
\ 00000016 .... LDI R31, (Rx0Head) >> 8
\ 00000018 8120 LD R18, Z
\ 0000001A 8131 LDD R19, Z+1
\ 0000001C 01F9 MOVW R31:R30, R19:R18
\ 0000001E .... SUBI R30, LOW((-(Rx0Buf) & 0xFFFF))
\ 00000020 .... SBCI R31, (-(Rx0Buf) & 0xFFFF) >> 8
\ 00000022 8300 ST Z, R16
\ 00000024 .... LDI R30, LOW(Rx0Head)
\ 00000026 .... LDI R31, (Rx0Head) >> 8
\ 00000028 8100 LD R16, Z
\ 0000002A 8111 LDD R17, Z+1
\ 0000002C 5F0F SUBI R16, 255
\ 0000002E 4F1F SBCI R17, 255
\ 00000030 8300 ST Z, R16
\ 00000032 8311 STD Z+1, R17
\ 00000034 8100 LD R16, Z
\ 00000036 8111 LDD R17, Z+1
\ 00000038 3400 CPI R16, 64
\ 0000003A E020 LDI R18, 0
\ 0000003C 0712 CPC R17, R18
\ 0000003E F010 BRCS ??USART0_RX_IRQ_1
\ 00000040 8320 ST Z, R18
\ 00000042 8321 STD Z+1, R18
\ ??USART0_RX_IRQ_1:
\ 00000044 BF4F OUT 0x3F, R20 //тут IAR восстанавливает SREG
\ 00000046 9109 LD R16, Y+
\ 00000048 9119 LD R17, Y+
\ 0000004A 9129 LD R18, Y+
\ 0000004C 9139 LD R19, Y+
\ 0000004E 9149 LD R20, Y+
\ 00000050 91E9 LD R30, Y+
\ 00000052 91F9 LD R31, Y+
\ 00000054 9518 RETI