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

📄 1.lst

📁 AVR ATMEGA32可以同时四路PWM输出
💻 LST
字号:
__text_start:
__start:
    0002 E5CF      LDI	R28,0x5F
    0003 E0D2      LDI	R29,2
    0004 BFCD      OUT	0x3D,R28
    0005 BFDE      OUT	0x3E,R29
    0006 51C0      SUBI	R28,0x10
    0007 40D0      SBCI	R29,0
    0008 EA0A      LDI	R16,0xAA
    0009 8308      STD	Y+0,R16
    000A 2400      CLR	R0
    000B E6E0      LDI	R30,0x60
    000C E0F0      LDI	R31,0
    000D E010      LDI	R17,0
    000E 36E0      CPI	R30,0x60
    000F 07F1      CPC	R31,R17
    0010 F011      BEQ	0x0013
    0011 9201      ST	R0,Z+
    0012 CFFB      RJMP	0x000E
    0013 8300      STD	Z+0,R16
    0014 E0E4      LDI	R30,4
    0015 E0F0      LDI	R31,0
    0016 E6A0      LDI	R26,0x60
    0017 E0B0      LDI	R27,0
    0018 E010      LDI	R17,0
    0019 30E4      CPI	R30,4
    001A 07F1      CPC	R31,R17
    001B F021      BEQ	0x0020
    001C 95C8      LPM
    001D 9631      ADIW	R30,1
    001E 920D      ST	R0,X+
    001F CFF9      RJMP	0x0019
    0020 D02A      RCALL	_main
_exit:
    0021 CFFF      RJMP	_exit
_delay_ms:
  c                    --> R20
  time                 --> R16
    0022 D040      RCALL	push_gset1
FILE: F:\tem\MYATME~1\四路PWM输出\1602_main.c
(0001) /********************************************
(0002) *   TC1产生16位双路PWM      *
(0003) * 实验内容:由TC1产生两路独立的16位PWM输出 *
(0004) * 实验环境:本站M16学习板     *
(0005) * 日    期:2007年08月16日     *
(0006) * 作    者:tonghe       *
(0007) * 版    本:V1.0       *
(0008) * 修改日期:2007年08月16日     *
(0009) * 芯    片:M16        *
(0010) * 工作频率:内部8M       *
(0011) * 编 译 器:ICCAVR 6.31A     *
(0012) * 输    出:PD4输出PWMB,PD5输出PWMA  *
(0013) *       产生的PWM频率为8M/65536约122HZ *
(0014) ********************************************/
(0015) #include <iom16v.h>
(0016) #include <macros.h>
(0017) 
(0018) //延时函数:入口time 需延时的MS数
(0019) void delay_ms(unsigned int time)
(0020)  {
(0021)  unsigned char c;
(0022)  for(;time;time--)
    0023 C007      RJMP	0x002B
(0023)   {
(0024)   for(c=220;c;c--)
    0024 ED4C      LDI	R20,0xDC
    0025 C001      RJMP	0x0027
    0026 954A      DEC	R20
    0027 2344      TST	R20
    0028 F7E9      BNE	0x0026
    0029 5001      SUBI	R16,1
    002A 4010      SBCI	R17,0
    002B 3000      CPI	R16,0
    002C 0701      CPC	R16,R17
    002D F7B1      BNE	0x0024
    002E D037      RCALL	pop_gset1
    002F 9508      RET
(0025)    {
(0026)    ;
(0027)    }
(0028)   }
(0029)  }
(0030) 
(0031) //端口初始化
(0032) void port_init(void)
(0033)  {
(0034)  PORTA = 0xFF;
_port_init:
    0030 EF8F      LDI	R24,0xFF
    0031 BB8B      OUT	0x1B,R24
(0035)  DDRA  = 0x00;
    0032 2422      CLR	R2
    0033 BA2A      OUT	0x1A,R2
(0036)  PORTB = 0xFF;
    0034 BB88      OUT	0x18,R24
(0037)  DDRB  = 0xFF;
    0035 BB87      OUT	0x17,R24
(0038)  PORTC = 0x00;
    0036 BA25      OUT	0x15,R2
(0039)  DDRC  = 0x00;
    0037 BA24      OUT	0x14,R2
(0040)  PORTD = 0x00;
    0038 BA22      OUT	0x12,R2
(0041)  DDRD  = 0xb0;
    0039 EB80      LDI	R24,0xB0
    003A BB81      OUT	0x11,R24
    003B 9508      RET
(0042)  }
(0043) 
(0044) //TC1初始化
(0045) void timer1_init(void)
(0046)  {
(0047)  TCCR1A = 0xA2;   //两路PWM,匹配清零
_timer1_init:
    003C EA82      LDI	R24,0xA2
    003D BD8F      OUT	0x2F,R24
(0048)  TCCR1B = 0x19;    //快速PWM模式,位数可调,预分频1
    003E E189      LDI	R24,0x19
    003F BD8E      OUT	0x2E,R24
(0049)  
(0050)  ICR1   = 0xFFFF;
    0040 EF8F      LDI	R24,0xFF
    0041 EF9F      LDI	R25,0xFF
    0042 BD97      OUT	0x27,R25
    0043 BD86      OUT	0x26,R24
    0044 9508      RET
(0051)  //计数上限值,此数为16位PWM,此值的多少决定PWM的位数,改变值可以改变时钟的输入频率
(0052) //在1M时钟下,OCR1A,OCR1B=1M/65536=15HZ。改为7FFF时,为30HZ,ICR1变小,OCR1A,B成比例变大
(0053) 
(0054)  }
(0055) 
(0056) //器件初始化
(0057) void init_devices(void)
(0058)  {
(0059)  port_init();   //端口初始化
_init_devices:
    0045 DFEA      RCALL	_port_init
(0060)  timer1_init();   //TC1初始化
    0046 DFF5      RCALL	_timer1_init
(0061) 
(0062)  MCUCR = 0x00;
    0047 2422      CLR	R2
    0048 BE25      OUT	0x35,R2
(0063)  GICR  = 0x00;
    0049 BE2B      OUT	0x3B,R2
    004A 9508      RET
(0064)  }
(0065) 
(0066) //主函数
(0067) void main(void)
(0068)  {
(0069)       //相位修正PWM模式,OCO的频率=fclk/(512*N),fclk为输入时钟频率,本例使用内部1M时钟

⌨️ 快捷键说明

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