Interrupt frågor AVR
Om du includera
#include <avr/signal.h> ska det fungera..
Tydligen så complilera det men intrupt vectorn ändras inte
du kan enkelt se hur kompilatorn har gjort genom att kolla i .lss filen
exempel:
somsagt SIGNAL är bättre att använda än INTERRUPT...
#include <avr/signal.h> ska det fungera..
Tydligen så complilera det men intrupt vectorn ändras inte
du kan enkelt se hur kompilatorn har gjort genom att kolla i .lss filen
exempel:
Kod: Markera allt
main.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000000dc 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00800060 000000dc 00000170 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000001 00800060 00800060 00000170 2**0
ALLOC
3 .noinit 00000000 00800061 00800061 00000170 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 00000170 2**0
CONTENTS
5 .debug_aranges 00000014 00000000 00000000 00000170 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_pubnames 0000004d 00000000 00000000 00000184 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_info 000000d7 00000000 00000000 000001d1 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_abbrev 000000a1 00000000 00000000 000002a8 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_line 000000e5 00000000 00000000 00000349 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_str 0000008a 00000000 00000000 0000042e 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54
4: 0c 94 45 00 jmp 0x8a
8: 0c 94 45 00 jmp 0x8a
c: 0c 94 45 00 jmp 0x8a
10: 0c 94 45 00 jmp 0x8a
14: 0c 94 45 00 jmp 0x8a
18: 0c 94 45 00 jmp 0x8a
1c: 0c 94 45 00 jmp 0x8a
20: 0c 94 45 00 jmp 0x8a
24: 0c 94 45 00 jmp 0x8a
28: 0c 94 45 00 jmp 0x8a
2c: 0c 94 51 00 jmp 0xa2 <-- här ska den hoppa till INTERRUPT (SIG_USART_RECV) och syns på addresen :)
30: 0c 94 45 00 jmp 0x8a
34: 0c 94 45 00 jmp 0x8a
38: 0c 94 45 00 jmp 0x8a
3c: 0c 94 45 00 jmp 0x8a
40: 0c 94 45 00 jmp 0x8a
44: 0c 94 45 00 jmp 0x8a
48: 0c 94 45 00 jmp 0x8a
4c: 0c 94 45 00 jmp 0x8a
50: 0c 94 45 00 jmp 0x8a
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d4 e0 ldi r29, 0x04 ; 4
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61
00000060 <__do_copy_data>:
60: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: ec ed ldi r30, 0xDC ; 220
68: f0 e0 ldi r31, 0x00 ; 0
6a: 02 c0 rjmp .+4 ; 0x70
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: a0 36 cpi r26, 0x60 ; 96
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c
00000076 <__do_clear_bss>:
76: 10 e0 ldi r17, 0x00 ; 0
78: a0 e6 ldi r26, 0x60 ; 96
7a: b0 e0 ldi r27, 0x00 ; 0
7c: 01 c0 rjmp .+2 ; 0x80
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: a1 36 cpi r26, 0x61 ; 97
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e
86: 0c 94 64 00 jmp 0xc8
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0
0000008e <USART_init>:
#define MYUBRR ((FOSC/16)/BAUD-1)
void USART_init (unsigned int);
volatile uint8_t senaste_vardet;
void USART_init (unsigned int ubrr){
8e: 9c 01 movw r18, r24
/*set budrate*/
UBRRH = (unsigned char)(ubrr>>8);
90: 83 2f mov r24, r19
92: 99 27 eor r25, r25
94: 80 bd out 0x20, r24 ; 32
UBRRL = (unsigned char)ubrr;
96: 29 b9 out 0x09, r18 ; 9
/*Enable receiver and transmitter*/
UCSRB = _BV(RXCIE) | _BV(RXEN) | _BV(TXEN);
98: 88 e9 ldi r24, 0x98 ; 152
9a: 8a b9 out 0x0a, r24 ; 10
/*set frameformat : 8 databits 1 stop bits*/
UCSRC = (1<<URSEL) |(1<<USBS) | (3<<UCSZ0);
9c: 8e e8 ldi r24, 0x8E ; 142
9e: 80 bd out 0x20, r24 ; 32
a0: 08 95 ret
000000a2 <__vector_11>:
}
INTERRUPT (SIG_USART_RECV)
{
a2: 78 94 sei
a4: 1f 92 push r1
a6: 0f 92 push r0
a8: 0f b6 in r0, 0x3f ; 63
aa: 0f 92 push r0
ac: 11 24 eor r1, r1
ae: 8f 93 push r24
senaste_vardet = UDR;
b0: 8c b1 in r24, 0x0c ; 12
b2: 80 93 60 00 sts 0x0060, r24
UDR = senaste_vardet;
b6: 80 91 60 00 lds r24, 0x0060
ba: 8c b9 out 0x0c, r24 ; 12
bc: 8f 91 pop r24
be: 0f 90 pop r0
c0: 0f be out 0x3f, r0 ; 63
c2: 0f 90 pop r0
c4: 1f 90 pop r1
c6: 18 95 reti
000000c8 <main>:
}
int main (void){
c8: cf e5 ldi r28, 0x5F ; 95
ca: d4 e0 ldi r29, 0x04 ; 4
cc: de bf out 0x3e, r29 ; 62
ce: cd bf out 0x3d, r28 ; 61
USART_init (MYUBRR);
d0: 8c e0 ldi r24, 0x0C ; 12
d2: 90 e0 ldi r25, 0x00 ; 0
d4: 0e 94 47 00 call 0x8e
sei();
d8: 78 94 sei
for (;;){
da: ff cf rjmp .-2 ; 0xda
Nu skulle jag behöva en knuff i rätt riktning(om det finns).
Det är så att jag skulle behöva en lång delay på flera minuter, upp mot 10-15 min... Men jag vill ju helst inte ha någon "busy waiting" som tar upp hela processorkraften. Så kan man lösa detta med Timer som ger interrupt efter angiven tid? Och en fråga till, jag vill kunna ändra tiden mha att skicka en ny tid via usarten, är det no probs eller är det jättesvårt?
Behöver mest en knuff i rätt riktning och få veta att det inte är några större problem.(jag e inte sååå vass på det här som ni säkert märkt, men jag skall bli....) :D
EDIT: Hittade en appnote (AVR 133) som är för AT90, men borde vara viss hjälp för min atmega.Förslag fortfarande intressanta...
Det är så att jag skulle behöva en lång delay på flera minuter, upp mot 10-15 min... Men jag vill ju helst inte ha någon "busy waiting" som tar upp hela processorkraften. Så kan man lösa detta med Timer som ger interrupt efter angiven tid? Och en fråga till, jag vill kunna ändra tiden mha att skicka en ny tid via usarten, är det no probs eller är det jättesvårt?
Behöver mest en knuff i rätt riktning och få veta att det inte är några större problem.(jag e inte sååå vass på det här som ni säkert märkt, men jag skall bli....) :D
EDIT: Hittade en appnote (AVR 133) som är för AT90, men borde vara viss hjälp för min atmega.Förslag fortfarande intressanta...