Вот, пришлось снова вспоминать AVR Mega128. В частности его SPI. Написал простейший код (AVR Studio4.19):
CODE
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(SPI_STC)
{
SPDR = 8;
}
void main()
{
DDRB = (1<<PB2) | (1<<PB1) | (1<<PB0);
PORTB = (1<<PB0);
PORTD = 0xFF;
SPCR = (1<<SPIE) + (1<<SPE) + (1<<MSTR);// | 3;// | 1 << CPOL | 1 << CPHA;
SPSR = 0;
sei();
SPDR = 9;
while(1)
{
asm("wdr");
}
}
#include <avr/interrupt.h>
ISR(SPI_STC)
{
SPDR = 8;
}
void main()
{
DDRB = (1<<PB2) | (1<<PB1) | (1<<PB0);
PORTB = (1<<PB0);
PORTD = 0xFF;
SPCR = (1<<SPIE) + (1<<SPE) + (1<<MSTR);// | 3;// | 1 << CPOL | 1 << CPHA;
SPSR = 0;
sei();
SPDR = 9;
while(1)
{
asm("wdr");
}
}
Прерывание не генерится ни в железе ни в протеусе, программа циклически перезапускается, вываливается через нулевой адрес. Кусок листинга:
CODE
ms_c.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000013a 00000000 00000000 00000054 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .stab 000006cc 00000000 00000000 00000190 2**2
CONTENTS, READONLY, DEBUGGING
2 .stabstr 00000085 00000000 00000000 0000085c 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_aranges 00000020 00000000 00000000 000008e1 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_pubnames 00000027 00000000 00000000 00000901 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 00000092 00000000 00000000 00000928 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 0000005f 00000000 00000000 000009ba 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 0000011f 00000000 00000000 00000a19 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 00000030 00000000 00000000 00000b38 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 00000085 00000000 00000000 00000b68 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_pubtypes 0000001e 00000000 00000000 00000bed 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 46 00 jmp 0x8c; 0x8c <__ctors_end>
4: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
8: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
10: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
14: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
18: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
1c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
20: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
24: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
28: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
2c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
30: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
34: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
38: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
3c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
40: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
44: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
48: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
4c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
50: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
54: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
58: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
5c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
60: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
64: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
68: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
6c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
70: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
74: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
78: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
7c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
80: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
84: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
88: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
0000008c <__ctors_end>:
8c: 11 24 eor r1, r1
8e: 1f be out 0x3f, r1; 63
90: cf ef ldi r28, 0xFF; 255
92: d0 e1 ldi r29, 0x10; 16
94: de bf out 0x3e, r29; 62
96: cd bf out 0x3d, r28; 61
98: 0e 94 77 00 call 0xee; 0xee <main>
9c: 0c 94 9b 00 jmp 0x136; 0x136 <_exit>
000000a0 <__bad_interrupt>:
a0: 0c 94 00 00 jmp 0; 0x0 <__vectors>
000000a4 <SPI_STC>:
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(SPI_STC)
{
a4: 1f 92 push r1
a6: 0f 92 push r0
a8: 0f b6 in r0, 0x3f; 63
aa: 0f 92 push r0
ac: 00 90 5b 00 lds r0, 0x005B
b0: 0f 92 push r0
b2: 11 24 eor r1, r1
b4: 2f 93 push r18
b6: 8f 93 push r24
b8: 9f 93 push r25
ba: ef 93 push r30
bc: ff 93 push r31
be: df 93 push r29
c0: cf 93 push r28
c2: cd b7 in r28, 0x3d; 61
c4: de b7 in r29, 0x3e; 62
SPDR = 8;
c6: 8f e2 ldi r24, 0x2F; 47
c8: 90 e0 ldi r25, 0x00; 0
ca: 28 e0 ldi r18, 0x08; 8
cc: fc 01 movw r30, r24
ce: 20 83 st Z, r18
}
d0: cf 91 pop r28
d2: df 91 pop r29
d4: ff 91 pop r31
d6: ef 91 pop r30
d8: 9f 91 pop r25
da: 8f 91 pop r24
dc: 2f 91 pop r18
de: 0f 90 pop r0
e0: 00 92 5b 00 sts 0x005B, r0
e4: 0f 90 pop r0
e6: 0f be out 0x3f, r0; 63
e8: 0f 90 pop r0
ea: 1f 90 pop r1
ec: 18 95 reti
000000ee <main>:
void main()
{
ee: df 93 push r29
f0: cf 93 push r28
f2: cd b7 in r28, 0x3d; 61
f4: de b7 in r29, 0x3e; 62
DDRB = (1<<PB2) | (1<<PB1) | (1<<PB0);
f6: 87 e3 ldi r24, 0x37; 55
f8: 90 e0 ldi r25, 0x00; 0
fa: 27 e0 ldi r18, 0x07; 7
fc: fc 01 movw r30, r24
fe: 20 83 st Z, r18
PORTB = (1<<PB0);
100: 88 e3 ldi r24, 0x38; 56
102: 90 e0 ldi r25, 0x00; 0
104: 21 e0 ldi r18, 0x01; 1
106: fc 01 movw r30, r24
108: 20 83 st Z, r18
PORTD = 0xFF;
10a: 82 e3 ldi r24, 0x32; 50
10c: 90 e0 ldi r25, 0x00; 0
10e: 2f ef ldi r18, 0xFF; 255
110: fc 01 movw r30, r24
112: 20 83 st Z, r18
SPCR = (1<<SPIE) + (1<<SPE) + (1<<MSTR);// | 3;// | 1 << CPOL | 1 << CPHA;
114: 8d e2 ldi r24, 0x2D; 45
116: 90 e0 ldi r25, 0x00; 0
118: 20 ed ldi r18, 0xD0; 208
11a: fc 01 movw r30, r24
11c: 20 83 st Z, r18
SPSR = 0;
11e: 8e e2 ldi r24, 0x2E; 46
120: 90 e0 ldi r25, 0x00; 0
122: fc 01 movw r30, r24
124: 10 82 st Z, r1
sei();
126: 78 94 sei
SPDR = 9;
128: 8f e2 ldi r24, 0x2F; 47
12a: 90 e0 ldi r25, 0x00; 0
12c: 29 e0 ldi r18, 0x09; 9
12e: fc 01 movw r30, r24
130: 20 83 st Z, r18
while(1)
{
asm("wdr");
132: a8 95 wdr
}
134: fe cf rjmp .-4 ; 0x132 <main+0x44>
00000136 <_exit>:
136: f8 94 cli
00000138 <__stop_program>:
138: ff cf rjmp .-2 ; 0x138 <__stop_program>
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000013a 00000000 00000000 00000054 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .stab 000006cc 00000000 00000000 00000190 2**2
CONTENTS, READONLY, DEBUGGING
2 .stabstr 00000085 00000000 00000000 0000085c 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_aranges 00000020 00000000 00000000 000008e1 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_pubnames 00000027 00000000 00000000 00000901 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 00000092 00000000 00000000 00000928 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 0000005f 00000000 00000000 000009ba 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 0000011f 00000000 00000000 00000a19 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 00000030 00000000 00000000 00000b38 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 00000085 00000000 00000000 00000b68 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_pubtypes 0000001e 00000000 00000000 00000bed 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 46 00 jmp 0x8c; 0x8c <__ctors_end>
4: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
8: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
10: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
14: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
18: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
1c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
20: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
24: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
28: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
2c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
30: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
34: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
38: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
3c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
40: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
44: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
48: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
4c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
50: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
54: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
58: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
5c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
60: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
64: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
68: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
6c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
70: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
74: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
78: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
7c: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
80: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
84: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
88: 0c 94 50 00 jmp 0xa0; 0xa0 <__bad_interrupt>
0000008c <__ctors_end>:
8c: 11 24 eor r1, r1
8e: 1f be out 0x3f, r1; 63
90: cf ef ldi r28, 0xFF; 255
92: d0 e1 ldi r29, 0x10; 16
94: de bf out 0x3e, r29; 62
96: cd bf out 0x3d, r28; 61
98: 0e 94 77 00 call 0xee; 0xee <main>
9c: 0c 94 9b 00 jmp 0x136; 0x136 <_exit>
000000a0 <__bad_interrupt>:
a0: 0c 94 00 00 jmp 0; 0x0 <__vectors>
000000a4 <SPI_STC>:
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(SPI_STC)
{
a4: 1f 92 push r1
a6: 0f 92 push r0
a8: 0f b6 in r0, 0x3f; 63
aa: 0f 92 push r0
ac: 00 90 5b 00 lds r0, 0x005B
b0: 0f 92 push r0
b2: 11 24 eor r1, r1
b4: 2f 93 push r18
b6: 8f 93 push r24
b8: 9f 93 push r25
ba: ef 93 push r30
bc: ff 93 push r31
be: df 93 push r29
c0: cf 93 push r28
c2: cd b7 in r28, 0x3d; 61
c4: de b7 in r29, 0x3e; 62
SPDR = 8;
c6: 8f e2 ldi r24, 0x2F; 47
c8: 90 e0 ldi r25, 0x00; 0
ca: 28 e0 ldi r18, 0x08; 8
cc: fc 01 movw r30, r24
ce: 20 83 st Z, r18
}
d0: cf 91 pop r28
d2: df 91 pop r29
d4: ff 91 pop r31
d6: ef 91 pop r30
d8: 9f 91 pop r25
da: 8f 91 pop r24
dc: 2f 91 pop r18
de: 0f 90 pop r0
e0: 00 92 5b 00 sts 0x005B, r0
e4: 0f 90 pop r0
e6: 0f be out 0x3f, r0; 63
e8: 0f 90 pop r0
ea: 1f 90 pop r1
ec: 18 95 reti
000000ee <main>:
void main()
{
ee: df 93 push r29
f0: cf 93 push r28
f2: cd b7 in r28, 0x3d; 61
f4: de b7 in r29, 0x3e; 62
DDRB = (1<<PB2) | (1<<PB1) | (1<<PB0);
f6: 87 e3 ldi r24, 0x37; 55
f8: 90 e0 ldi r25, 0x00; 0
fa: 27 e0 ldi r18, 0x07; 7
fc: fc 01 movw r30, r24
fe: 20 83 st Z, r18
PORTB = (1<<PB0);
100: 88 e3 ldi r24, 0x38; 56
102: 90 e0 ldi r25, 0x00; 0
104: 21 e0 ldi r18, 0x01; 1
106: fc 01 movw r30, r24
108: 20 83 st Z, r18
PORTD = 0xFF;
10a: 82 e3 ldi r24, 0x32; 50
10c: 90 e0 ldi r25, 0x00; 0
10e: 2f ef ldi r18, 0xFF; 255
110: fc 01 movw r30, r24
112: 20 83 st Z, r18
SPCR = (1<<SPIE) + (1<<SPE) + (1<<MSTR);// | 3;// | 1 << CPOL | 1 << CPHA;
114: 8d e2 ldi r24, 0x2D; 45
116: 90 e0 ldi r25, 0x00; 0
118: 20 ed ldi r18, 0xD0; 208
11a: fc 01 movw r30, r24
11c: 20 83 st Z, r18
SPSR = 0;
11e: 8e e2 ldi r24, 0x2E; 46
120: 90 e0 ldi r25, 0x00; 0
122: fc 01 movw r30, r24
124: 10 82 st Z, r1
sei();
126: 78 94 sei
SPDR = 9;
128: 8f e2 ldi r24, 0x2F; 47
12a: 90 e0 ldi r25, 0x00; 0
12c: 29 e0 ldi r18, 0x09; 9
12e: fc 01 movw r30, r24
130: 20 83 st Z, r18
while(1)
{
asm("wdr");
132: a8 95 wdr
}
134: fe cf rjmp .-4 ; 0x132 <main+0x44>
00000136 <_exit>:
136: f8 94 cli
00000138 <__stop_program>:
138: ff cf rjmp .-2 ; 0x138 <__stop_program>
То есть, как я смотрю, в таблице векторов прерываний нет перехода на ISR(SPI_STC). Подскажите, кто знает, что это такое может быть. То есть постоянно выдаётся "9", а не "8" от ISR. Пробовал и в других версиях студии и на железе.