Код:
interrupt [EXT_INT0] void ext_int0() {
#asm
.EQU DDRC=0x14
.EQU DDRB=0x17
.EQU DDRD=0x11
.EQU PORTB=0x18
.EQU PORTC=0x15
.EQU PORTD=0x12
; Сохраняем флаги
IN R28, 0x3F ; 1 SREG
PUSH R28 ; 2
; Если DDRC в режиме записи, то переходим ниже
IN R28, DDRC ; 1
CPI R28, 0 ; 1
BRNE _v2 ; 2
; *** ВАРИАНТ 1 ***
; PORTB = c2b[(unsigned char)PINC];
IN R28, 0x13 ; 1 PINC
CPI R28, 0x3F ; 1
BREQ _v12 ; 2
LDI R29, 2 ; 1
LD R28, Y ; 2
OUT 0x18, R28 ; 1 PORTB
; PORTD = (PORTD | 0x33) & c2d[(unsigned char)PINC];
IN R28, 0x13 ; 1 PINC
SUBI R28, -64 ; 1
LD R28, Y ; 2
IN R29, 0x12 ; 1 PORTD
ORI R29, 0x33 ; 1
AND R29, R28 ; 1
OUT 0x12, R29 ; 1 PORTD
; Выход
POP R28
OUT 0x3F, R28 ; SREG
RETI
; *** ВАРИАНТ 1.2 ***
_v12: ; Переводим порты B,D в режим чтения
; Переводим порт C в режим записи
CLR R28
OUT DDRB, R28
SER R28
OUT PORTB, R28
OUT DDRC, R28
IN R28, DDRD
ANDI R28, ~0x33
OUT DDRD, R28
IN R28, PORTD
ORI R28, 0x33
OUT PORTD, R28
; PORTC = b2c[PINB] & d2c[PIND & 0x33];
IN R28, 0x16 ; 1 PINB
LDI R29, 1 ; 1
LD R28, Y ; 2
OUT 0x15, R28 ; 1 PORTC
IN R28, 0x10 ; 1 PIND
ANDI R28, 0x33 ; 1
LDI R29, 2 ; 1
SUBI R28, -128 ; 1
LD R28, Y ; 2
IN R29, 0x15 ; 1 PORTC
AND R28, R29 ; 1
OUT 0x15, R28 ; 1 PORTC
; Выход
POP R28
OUT 0x3F, R28 ; SREG
RETI
; *** ВАРИАНТ 2 ***
_v2:
; PORTC = b2c[PINB] & d2c[PIND & 0x33];
IN R28, 0x16 ; 1 PINB
LDI R29, 1 ; 1
LD R28, Y ; 2
OUT 0x15, R28 ; 1 PORTC
IN R28, 0x10 ; 1 PIND
ANDI R28, 0x33 ; 1
CPI R28, 0x33 ; 1
BREQ _v21_x ; 2
LDI R29, 2 ; 1
SUBI R28, -128 ; 1
LD R28, Y ; 2
IN R29, 0x15 ; 1 PORTC
AND R28, R29 ; 1
OUT 0x15, R28 ; 1 PORTC
_v21_q:
POP R28
OUT 0x3F, R28 ; SREG
RETI
; Дополнителная проверка
_v21_x:
IN R28, 0x16 ; 1 PINB
CPI R28, 0xFF ; 1
BRNE _v21_q ; 2
; *** ВАРИАНТ 2.1 ***
; Переводим порт C в режим чтения
; Переводим порты B,D в режим записи
CLR R28
OUT DDRC, R28
SER R28
OUT PORTC, R28
OUT DDRB, R28
IN R28, DDRD
ORI R28, 0x33
OUT DDRD, R28
; PORTB = c2b[(unsigned char)PINC];
IN R28, 0x13 ; 1 PINC
LDI R29, 2 ; 1
LD R28, Y ; 2
OUT 0x18,R28 ; 1 PORTB
; PORTD = (PORTD | 0x33) & c2d[(unsigned char)PINC];
IN R28, 0x13 ; 1 PINC
SUBI R28, -64 ; 1
LD R28, Y ; 2
IN R29, 0x12 ; 1 PORTD
ORI R29, 0x33 ; 1
AND R29, R28 ; 1
OUT 0x12, R29 ; 1 PORTD
; Выход
POP R28
OUT 0x3F, R28 ; SREG
#endasm
}
Может быть МК не успевает. А может быть я ошибся где то.