⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lss

📁 AVR单片机的定时器使用范例
💻 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 + -