?? main.lss
字號:
main.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000182 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00800060 00000182 00000216 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 00800060 00800060 00000216 2**0
ALLOC
3 .noinit 00000000 00800064 00800064 00000216 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 00000216 2**0
CONTENTS
5 .stab 0000036c 00000000 00000000 00000218 2**2
CONTENTS, READONLY, DEBUGGING
6 .stabstr 00000084 00000000 00000000 00000584 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_aranges 00000014 00000000 00000000 00000608 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_pubnames 0000008a 00000000 00000000 0000061c 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_info 0000011c 00000000 00000000 000006a6 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_abbrev 0000006e 00000000 00000000 000007c2 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_line 00000162 00000000 00000000 00000830 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_str 000000bb 00000000 00000000 00000992 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54 <__ctors_end>
4: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
8: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
10: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
14: 0c 94 5a 00 jmp 0xb4 <__vector_5>
18: 0c 94 6e 00 jmp 0xdc <__vector_6>
1c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
20: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
24: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
28: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
2c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
30: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
34: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
38: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
3c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
40: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
44: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
48: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
4c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
50: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
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: e2 e8 ldi r30, 0x82 ; 130
68: f1 e0 ldi r31, 0x01 ; 1
6a: 02 c0 rjmp .+4 ; 0x70 <.do_copy_data_start>
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 <.do_copy_data_loop>
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 <.do_clear_bss_start>
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: a4 36 cpi r26, 0x64 ; 100
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e <.do_clear_bss_loop>
86: 0c 94 94 00 jmp 0x128 <main>
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0 <__vectors>
0000008e <timer0_init>:
void timer0_init(void) //CTC模式輸出1KHz/2KHz方波
{
OCR0 = T0OCR; //設定TOP值
8e: 80 91 62 00 lds r24, 0x0062
92: 8c bf out 0x3c, r24 ; 60
//TOP=8000000/(2*64*1000)-1=61.5 選61 1.008KHz(0.992mS)
//TOP=8000000/(2*64*2000)-1=30.25 選30 2.016KHz(0.496ms)
TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(1<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
94: 8b e1 ldi r24, 0x1B ; 27
96: 83 bf out 0x33, r24 ; 51
98: 08 95 ret
0000009a <timer1_init>:
//64分頻,CTC模式,OC0取反輸出方波
}
void timer1_init(void)
{
OCR1A = 39062; //設定TOP值.時間5S(0.2Hz)
9a: 86 e9 ldi r24, 0x96 ; 150
9c: 98 e9 ldi r25, 0x98 ; 152
9e: 9b bd out 0x2b, r25 ; 43
a0: 8a bd out 0x2a, r24 ; 42
//TOP=8000000/(1024*0.2)=39062.5
OCR1B = 15624; //設定OC1B的PWM值 約2秒鐘 40%
a2: 88 e0 ldi r24, 0x08 ; 8
a4: 9d e3 ldi r25, 0x3D ; 61
a6: 99 bd out 0x29, r25 ; 41
a8: 88 bd out 0x28, r24 ; 40
TCCR1A = (1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);
aa: 83 e2 ldi r24, 0x23 ; 35
ac: 8f bd out 0x2f, r24 ; 47
TCCR1B = (0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);
ae: 8d e1 ldi r24, 0x1D ; 29
b0: 8e bd out 0x2e, r24 ; 46
b2: 08 95 ret
000000b4 <__vector_5>:
//1024分頻,WGM1=15 快速PWM模式,TOP=OCRnA,ICP下降沿觸發,OC1B正向PWM輸出,OC1A為普通IO
}
SIGNAL(SIG_INPUT_CAPTURE1) //輸入捕捉中斷
{
b4: 1f 92 push r1
b6: 0f 92 push r0
b8: 0f b6 in r0, 0x3f ; 63
ba: 0f 92 push r0
bc: 11 24 eor r1, r1
be: 8f 93 push r24
c0: 9f 93 push r25
ICP_Time=ICR1; //讀取ICP輸入捕捉事件的發生時刻
c2: 86 b5 in r24, 0x26 ; 38
c4: 97 b5 in r25, 0x27 ; 39
c6: 90 93 61 00 sts 0x0061, r25
ca: 80 93 60 00 sts 0x0060, r24
ce: 9f 91 pop r25
d0: 8f 91 pop r24
d2: 0f 90 pop r0
d4: 0f be out 0x3f, r0 ; 63
d6: 0f 90 pop r0
d8: 1f 90 pop r1
da: 18 95 reti
000000dc <__vector_6>:
}
SIGNAL(SIG_OUTPUT_COMPARE1A)//T1輸出比較A匹配中斷
{
dc: 1f 92 push r1
de: 0f 92 push r0
e0: 0f b6 in r0, 0x3f ; 63
e2: 0f 92 push r0
e4: 11 24 eor r1, r1
e6: 8f 93 push r24
//在WGM1=15 快速PWM模式下,TOP=39062等同于5S左右的定時中斷
T2PWM+=10;
e8: 80 91 63 00 lds r24, 0x0063
ec: 86 5f subi r24, 0xF6 ; 246
ee: 80 93 63 00 sts 0x0063, r24
OCR2=T2PWM; //修改T2的PWM值
f2: 80 91 63 00 lds r24, 0x0063
f6: 83 bd out 0x23, r24 ; 35
if (T0OCR==61)
f8: 80 91 62 00 lds r24, 0x0062
fc: 8d 33 cpi r24, 0x3D ; 61
fe: 11 f4 brne .+4 ; 0x104 <__vector_6+0x28>
T0OCR=30; //改成1KHz
100: 8e e1 ldi r24, 0x1E ; 30
102: 01 c0 rjmp .+2 ; 0x106 <__vector_6+0x2a>
else
T0OCR=61; //改成2KHz
104: 8d e3 ldi r24, 0x3D ; 61
106: 80 93 62 00 sts 0x0062, r24
OCR0=T0OCR; //修改T0的時間值
10a: 80 91 62 00 lds r24, 0x0062
10e: 8c bf out 0x3c, r24 ; 60
110: 8f 91 pop r24
112: 0f 90 pop r0
114: 0f be out 0x3f, r0 ; 63
116: 0f 90 pop r0
118: 1f 90 pop r1
11a: 18 95 reti
0000011c <timer2_init>:
}
void timer2_init(void)//相位修正PWM模式
{
OCR2 = T2PWM; //設定PWM值(最大值固定為255,8bit)
11c: 80 91 63 00 lds r24, 0x0063
120: 83 bd out 0x23, r24 ; 35
TCCR2 = (0<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(0<<CS22)|(1<<CS21)|(1<<CS20);
122: 83 e6 ldi r24, 0x63 ; 99
124: 85 bd out 0x25, r24 ; 37
126: 08 95 ret
00000128 <main>:
//32分頻,相位修正PWM模式,PWM頻率為490Hz,OC2正向PWM輸出
//fPWM=fclk_IO/(2*N*TOP)=8000000/(2*32*255)=490Hz
}
int main(void)
{
128: cf e5 ldi r28, 0x5F ; 95
12a: d4 e0 ldi r29, 0x04 ; 4
12c: de bf out 0x3e, r29 ; 62
12e: cd bf out 0x3d, r28 ; 61
//上電默認DDRx=0x00,PORTx=0x00 輸入,無上拉電阻
PORTA =0xFF; //不用的管腳使能內部上拉電阻。
130: 8f ef ldi r24, 0xFF ; 255
132: 8b bb out 0x1b, r24 ; 27
PORTC =0xFF;
134: 85 bb out 0x15, r24 ; 21
PORTB =~ (1<<PWM0); //低電平,燈滅
136: 87 ef ldi r24, 0xF7 ; 247
138: 88 bb out 0x18, r24 ; 24
DDRB = (1<<PWM0); //輸出
13a: 88 e0 ldi r24, 0x08 ; 8
13c: 87 bb out 0x17, r24 ; 23
PORTD =~((1<<PWM1A)|(1<<PWM1B)|(1<<PWM2)); //低電平,燈滅
13e: 8f e4 ldi r24, 0x4F ; 79
140: 82 bb out 0x12, r24 ; 18
DDRD = (1<<PWM1A)|(1<<PWM1B)|(1<<PWM2); //輸出
142: 80 eb ldi r24, 0xB0 ; 176
144: 81 bb out 0x11, r24 ; 17
T2PWM=0x80;
146: 80 e8 ldi r24, 0x80 ; 128
148: 80 93 63 00 sts 0x0063, r24
T0OCR=30;
14c: 8e e1 ldi r24, 0x1E ; 30
14e: 80 93 62 00 sts 0x0062, r24
ICP_Time=0x0000;
152: 10 92 61 00 sts 0x0061, r1
156: 10 92 60 00 sts 0x0060, r1
timer0_init();
15a: 0e 94 47 00 call 0x8e <timer0_init>
timer1_init();
15e: 0e 94 4d 00 call 0x9a <timer1_init>
timer2_init();
162: 0e 94 8e 00 call 0x11c <timer2_init>
TIMSK = (1<<TICIE1)|(1<<OCIE1A); //使能T1輸入捕捉中斷,T1輸出比較A匹配中斷(作定時用)
166: 80 e3 ldi r24, 0x30 ; 48
168: 89 bf out 0x39, r24 ; 57
sei(); //使能全局中斷
16a: 78 94 sei
while (1)
{
if (ICP_Time>15624)
16c: 80 91 60 00 lds r24, 0x0060
170: 90 91 61 00 lds r25, 0x0061
174: 89 50 subi r24, 0x09 ; 9
176: 9d 43 sbci r25, 0x3D ; 61
178: 10 f0 brcs .+4 ; 0x17e <main+0x56>
PWM1A_ON(); //如果數值大于15624(約2秒),OC1A輸出高電平
17a: 95 9a sbi 0x12, 5 ; 18
17c: f7 cf rjmp .-18 ; 0x16c <main+0x44>
else
PWM1A_OFF(); //否則輸出低電平
17e: 95 98 cbi 0x12, 5 ; 18
180: f5 cf rjmp .-22 ; 0x16c <main+0x44>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -