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

📄 mega8_spwm.lss

📁 avr mega8 pwm 试验带 Proteus 仿真
💻 LSS
字号:

mega8_spwm.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000142  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000002  00800060  00000142  000001d6  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000001  00800062  00800062  000001d8  2**0
                  ALLOC
  3 .noinit       00000000  00800063  00800063  000001d8  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  000001d8  2**0
                  CONTENTS
  5 .stab         00000840  00000000  00000000  000001d8  2**2
                  CONTENTS, READONLY, DEBUGGING
  6 .stabstr      0000074a  00000000  00000000  00000a18  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	12 c0       	rjmp	.+36     	; 0x26 <__ctors_end>
   2:	2b c0       	rjmp	.+86     	; 0x5a <__bad_interrupt>
   4:	2a c0       	rjmp	.+84     	; 0x5a <__bad_interrupt>
   6:	29 c0       	rjmp	.+82     	; 0x5a <__bad_interrupt>
   8:	28 c0       	rjmp	.+80     	; 0x5a <__bad_interrupt>
   a:	27 c0       	rjmp	.+78     	; 0x5a <__bad_interrupt>
   c:	4a c0       	rjmp	.+148    	; 0xa2 <__vector_6>
   e:	25 c0       	rjmp	.+74     	; 0x5a <__bad_interrupt>
  10:	24 c0       	rjmp	.+72     	; 0x5a <__bad_interrupt>
  12:	23 c0       	rjmp	.+70     	; 0x5a <__bad_interrupt>
  14:	22 c0       	rjmp	.+68     	; 0x5a <__bad_interrupt>
  16:	21 c0       	rjmp	.+66     	; 0x5a <__bad_interrupt>
  18:	20 c0       	rjmp	.+64     	; 0x5a <__bad_interrupt>
  1a:	1f c0       	rjmp	.+62     	; 0x5a <__bad_interrupt>
  1c:	1e c0       	rjmp	.+60     	; 0x5a <__bad_interrupt>
  1e:	1d c0       	rjmp	.+58     	; 0x5a <__bad_interrupt>
  20:	1c c0       	rjmp	.+56     	; 0x5a <__bad_interrupt>
  22:	1b c0       	rjmp	.+54     	; 0x5a <__bad_interrupt>
  24:	1a c0       	rjmp	.+52     	; 0x5a <__bad_interrupt>

00000026 <__ctors_end>:
  26:	11 24       	eor	r1, r1
  28:	1f be       	out	0x3f, r1	; 63
  2a:	cf e5       	ldi	r28, 0x5F	; 95
  2c:	d4 e0       	ldi	r29, 0x04	; 4
  2e:	de bf       	out	0x3e, r29	; 62
  30:	cd bf       	out	0x3d, r28	; 61

00000032 <__do_copy_data>:
  32:	10 e0       	ldi	r17, 0x00	; 0
  34:	a0 e6       	ldi	r26, 0x60	; 96
  36:	b0 e0       	ldi	r27, 0x00	; 0
  38:	e2 e4       	ldi	r30, 0x42	; 66
  3a:	f1 e0       	ldi	r31, 0x01	; 1
  3c:	02 c0       	rjmp	.+4      	; 0x42 <.do_copy_data_start>

0000003e <.do_copy_data_loop>:
  3e:	05 90       	lpm	r0, Z+
  40:	0d 92       	st	X+, r0

00000042 <.do_copy_data_start>:
  42:	a2 36       	cpi	r26, 0x62	; 98
  44:	b1 07       	cpc	r27, r17
  46:	d9 f7       	brne	.-10     	; 0x3e <.do_copy_data_loop>

00000048 <__do_clear_bss>:
  48:	10 e0       	ldi	r17, 0x00	; 0
  4a:	a2 e6       	ldi	r26, 0x62	; 98
  4c:	b0 e0       	ldi	r27, 0x00	; 0
  4e:	01 c0       	rjmp	.+2      	; 0x52 <.do_clear_bss_start>

00000050 <.do_clear_bss_loop>:
  50:	1d 92       	st	X+, r1

00000052 <.do_clear_bss_start>:
  52:	a3 36       	cpi	r26, 0x63	; 99
  54:	b1 07       	cpc	r27, r17
  56:	e1 f7       	brne	.-8      	; 0x50 <.do_clear_bss_loop>
  58:	60 c0       	rjmp	.+192    	; 0x11a <main>

0000005a <__bad_interrupt>:
  5a:	d2 cf       	rjmp	.-92     	; 0x0 <__vectors>

0000005c <spwm_init>:

/************初始化程序**************/
void spwm_init(void)
{
   PORTB|=(1<<PWMOUTA)|(1<<PWMOUTB);  //把PWM置为输出
  5c:	88 b3       	in	r24, 0x18	; 24
  5e:	86 60       	ori	r24, 0x06	; 6
  60:	88 bb       	out	0x18, r24	; 24
   DDRB |=(1<<PWMOUTA)|(1<<PWMOUTB);
  62:	87 b3       	in	r24, 0x17	; 23
  64:	86 60       	ori	r24, 0x06	; 6
  66:	87 bb       	out	0x17, r24	; 23
   TIMSK=0x00;
  68:	19 be       	out	0x39, r1	; 57
   
   TCCR1B = 0x00;        //stop
  6a:	1e bc       	out	0x2e, r1	; 46
   TCNT1  = 0x0000;      //计数器初值 
  6c:	1d bc       	out	0x2d, r1	; 45
  6e:	1c bc       	out	0x2c, r1	; 44
   OCR1A  = 0x00ff;      //比较寄存器的值,来控制占空比  (占空比50%)
  70:	8f ef       	ldi	r24, 0xFF	; 255
  72:	90 e0       	ldi	r25, 0x00	; 0
  74:	9b bd       	out	0x2b, r25	; 43
  76:	8a bd       	out	0x2a, r24	; 42
   OCR1B  = 0x0000;      //(占空比50%)
  78:	19 bc       	out	0x29, r1	; 41
  7a:	18 bc       	out	0x28, r1	; 40
   ICR1   = 0x03ff;                     //捕捉寄存器的值  10位分辨率
  7c:	8f ef       	ldi	r24, 0xFF	; 255
  7e:	93 e0       	ldi	r25, 0x03	; 3
  80:	97 bd       	out	0x27, r25	; 39
  82:	86 bd       	out	0x26, r24	; 38
   TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11);//|(1<<WGM10); 
  84:	82 eb       	ldi	r24, 0xB2	; 178
  86:	8f bd       	out	0x2f, r24	; 47
                                      //设置PWM的频率及PWM工作模式 
   TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);//|(1<<CS11);
  88:	89 e1       	ldi	r24, 0x19	; 25
  8a:	8e bd       	out	0x2e, r24	; 46
                                      //快速PWM模式,时钟不分频,TOP由ICR1设定
   TIMSK|=(1<<OCIE1A);                //允许计数器比较匹配中断
  8c:	89 b7       	in	r24, 0x39	; 57
  8e:	80 61       	ori	r24, 0x10	; 16
  90:	89 bf       	out	0x39, r24	; 57

   
   PORTB|=(1<<PWMOUTC);
  92:	c3 9a       	sbi	0x18, 3	; 24
   DDRB |=(1<<PWMOUTC);
  94:	bb 9a       	sbi	0x17, 3	; 23
   TCCR2=0x69;       //设置PWM的频率及PWM工作模式 
  96:	89 e6       	ldi	r24, 0x69	; 105
  98:	85 bd       	out	0x25, r24	; 37
   TCNT2=0x00;       //计数器初值 
  9a:	14 bc       	out	0x24, r1	; 36
   OCR2 =0x7f;       //比较寄存器的值,来控制占空比 
  9c:	8f e7       	ldi	r24, 0x7F	; 127
  9e:	83 bd       	out	0x23, r24	; 35
  a0:	08 95       	ret

000000a2 <__vector_6>:
   
}

/************中断服务程序**************/
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
  a2:	1f 92       	push	r1
  a4:	0f 92       	push	r0
  a6:	0f b6       	in	r0, 0x3f	; 63
  a8:	0f 92       	push	r0
  aa:	11 24       	eor	r1, r1
  ac:	2f 93       	push	r18
  ae:	8f 93       	push	r24
  b0:	9f 93       	push	r25
  // memcpy_P(ocr_reg,sin_table+i,1);//从Flash中取出正弦数据
   OCR1A=ocr_reg;//更新OCR1A
  b2:	80 91 60 00 	lds	r24, 0x0060
  b6:	90 91 61 00 	lds	r25, 0x0061
  ba:	9b bd       	out	0x2b, r25	; 43
  bc:	8a bd       	out	0x2a, r24	; 42
   OCR1B=ocr_reg;//更新OCR1B
  be:	99 bd       	out	0x29, r25	; 41
  c0:	88 bd       	out	0x28, r24	; 40
 //  OCR2 =ocr_reg;//更新OCR2
  // i++;//指向下一个数据
   if(flag)
  c2:	20 91 62 00 	lds	r18, 0x0062
  c6:	22 23       	and	r18, r18
  c8:	29 f0       	breq	.+10     	; 0xd4 <__vector_6+0x32>
     ocr_reg--;
  ca:	01 97       	sbiw	r24, 0x01	; 1
  cc:	90 93 61 00 	sts	0x0061, r25
  d0:	80 93 60 00 	sts	0x0060, r24
   if(!flag)
  d4:	22 23       	and	r18, r18
  d6:	49 f4       	brne	.+18     	; 0xea <__vector_6+0x48>
     ocr_reg++;	 
  d8:	80 91 60 00 	lds	r24, 0x0060
  dc:	90 91 61 00 	lds	r25, 0x0061
  e0:	01 96       	adiw	r24, 0x01	; 1
  e2:	90 93 61 00 	sts	0x0061, r25
  e6:	80 93 60 00 	sts	0x0060, r24
   if(ocr_reg==0x03ff)
  ea:	80 91 60 00 	lds	r24, 0x0060
  ee:	90 91 61 00 	lds	r25, 0x0061
  f2:	23 e0       	ldi	r18, 0x03	; 3
  f4:	8f 3f       	cpi	r24, 0xFF	; 255
  f6:	92 07       	cpc	r25, r18
  f8:	21 f4       	brne	.+8      	; 0x102 <__vector_6+0x60>
  //    ocr_reg=0x00;
     flag=0x01;
  fa:	81 e0       	ldi	r24, 0x01	; 1
  fc:	80 93 62 00 	sts	0x0062, r24
 100:	04 c0       	rjmp	.+8      	; 0x10a <__vector_6+0x68>
   if(ocr_reg==0x00)
 102:	89 2b       	or	r24, r25
 104:	11 f4       	brne	.+4      	; 0x10a <__vector_6+0x68>
   //  ocr_reg=0x00;
     flag=0x00;	 
 106:	10 92 62 00 	sts	0x0062, r1
 10a:	9f 91       	pop	r25
 10c:	8f 91       	pop	r24
 10e:	2f 91       	pop	r18
 110:	0f 90       	pop	r0
 112:	0f be       	out	0x3f, r0	; 63
 114:	0f 90       	pop	r0
 116:	1f 90       	pop	r1
 118:	18 95       	reti

0000011a <main>:
}
/****************主程序**************/
int main(void)
{
 11a:	cf e5       	ldi	r28, 0x5F	; 95
 11c:	d4 e0       	ldi	r29, 0x04	; 4
 11e:	de bf       	out	0x3e, r29	; 62
 120:	cd bf       	out	0x3d, r28	; 61
   cli();
 122:	f8 94       	cli
   spwm_init();                     //初始化
 124:	9b df       	rcall	.-202    	; 0x5c <spwm_init>
   MCUCR = 0x00; 
 126:	15 be       	out	0x35, r1	; 53
   GICR  = 0x00;
 128:	1b be       	out	0x3b, r1	; 59
   set_sleep_mode(SLEEP_MODE_IDLE); //设置休眠模式为空闲模式
 12a:	85 b7       	in	r24, 0x35	; 53
 12c:	8f 78       	andi	r24, 0x8F	; 143
 12e:	85 bf       	out	0x35, r24	; 53
   sei();                             //开总中断允许
 130:	78 94       	sei
   while(1)
   {
      ;
      sleep_mode();                 //进入休眠状态
 132:	85 b7       	in	r24, 0x35	; 53
 134:	80 68       	ori	r24, 0x80	; 128
 136:	85 bf       	out	0x35, r24	; 53
 138:	88 95       	sleep
 13a:	85 b7       	in	r24, 0x35	; 53
 13c:	8f 77       	andi	r24, 0x7F	; 127
 13e:	85 bf       	out	0x35, r24	; 53
 140:	f8 cf       	rjmp	.-16     	; 0x132 <main+0x18>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -