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

📄 m8_pwm.lst

📁 avr 单片机 的MEGA8系列
💻 LST
字号:
__text_start:
__start:
    0013 E5CF      LDI	R28,0x5F
    0014 E0D4      LDI	R29,4
    0015 BFCD      OUT	0x3D,R28
    0016 BFDE      OUT	0x3E,R29
    0017 51C0      SUBI	R28,0x10
    0018 40D0      SBCI	R29,0
    0019 EA0A      LDI	R16,0xAA
    001A 8308      STD	Y+0,R16
    001B 2400      CLR	R0
    001C E6E0      LDI	R30,0x60
    001D E0F0      LDI	R31,0
    001E E010      LDI	R17,0
    001F 36E0      CPI	R30,0x60
    0020 07F1      CPC	R31,R17
    0021 F011      BEQ	0x0024
    0022 9201      ST	R0,Z+
    0023 CFFB      RJMP	0x001F
    0024 8300      STD	Z+0,R16
    0025 E2E6      LDI	R30,0x26
    0026 E0F0      LDI	R31,0
    0027 E6A0      LDI	R26,0x60
    0028 E0B0      LDI	R27,0
    0029 E010      LDI	R17,0
    002A 32E6      CPI	R30,0x26
    002B 07F1      CPC	R31,R17
    002C F021      BEQ	0x0031
    002D 95C8      LPM
    002E 9631      ADIW	R30,1
    002F 920D      ST	R0,X+
    0030 CFF9      RJMP	0x002A
    0031 D022      RCALL	_main
_exit:
    0032 CFFF      RJMP	_exit
FILE: D:\AVR\M8_PWM\main.c
(0001) 
(0002) // -----------------------------------------------------------------------------
(0003) // Project Name    : M8 PWM 参考程序
(0004) // Crystal         : 16Mhz           
(0005) // Target Setting  : ATMaga8
(0006) // Power  		   : 5V
(0007) // Date            : Dec.21.2006
(0008) // File Version    : 1.0  
(0009) // Author		   :
(0010) // -----------------------------------------------------------------------------
(0011) 
(0012) #include <iom8v.h>
(0013) #include <macros.h>
(0014) 
(0015) // ------------------  频率定义 --------------------------
(0016) #define  HZ_5K     0x0640  
(0017) #define  HZ_10K    0x0320   
(0018) 
(0019) // -----------------------------------------------------------------------------
(0020) //  函数说明 :配置PWM的输出 管脚 OC1A (PB1) 
(0021) //   
(0022) // -----------------------------------------------------------------------------
(0023) void port_init(void)
(0024) {
(0025)  PORTB |= 0x02;
_port_init:
    0033 9AC1      SBI	0x18,1
(0026)  DDRB  |= 0x02;
    0034 9AB9      SBI	0x17,1
(0027) }
    0035 9508      RET
(0028) // -----------------------------------------------------------------------------
(0029) //  函数说明 :配置T1的PWM 
(0030) //  产生频率 :5KHz   误差 5.00048KHz (0.0%)
(0031) // -----------------------------------------------------------------------------
(0032) void timer1_init(void)
(0033) {
(0034)   //TCCR1A|=(1<<COM1A1)|(1<<COM1A0);  //当计时器往TOP计数时若TCNT1与OCR1A匹配OC1A  
(0035)                                     //将清零为低电平                               
(0036)                                     //在计时器往BOTTOM计数时TCNT1与OCR1A匹配OC1A
(0037) 									//将置位为高电平 
(0038)   TCCR1A|=(1<<COM1A1)|(0<<COM1A0);   //当计时器往TOP计数时若TCNT1与OCR1A匹配OC1A  
_timer1_init:
    0036 B58F      IN	R24,0x2F
    0037 6880      ORI	R24,0x80
    0038 BD8F      OUT	0x2F,R24
(0039)                                     //将清零为高电平                               
(0040)                                     //在计时器往BOTTOM计数时TCNT1与OCR1A匹配OC1A
(0041) 									//将置位为低电平 
(0042) 									
(0043)   TCCR1B|=(1<<WGM13);               //设置T1为相位与频率修正PWM模式  TOP值为ICR1
    0039 B58E      IN	R24,0x2E
    003A 6180      ORI	R24,0x10
    003B BD8E      OUT	0x2E,R24
(0044) }
    003C 9508      RET
(0045) // -----------------------------------------------------------------------------
(0046) //  函数说明 : 开启 PWM 
(0047) //   
(0048) // -----------------------------------------------------------------------------
(0049) void StartPwm(void)
(0050) {
(0051)   TCCR1B|=(1<<CS10);                        //启动T1 不分频 即启动PWM输出 
_StartPwm:
    003D B58E      IN	R24,0x2E
    003E 6081      ORI	R24,1
    003F BD8E      OUT	0x2E,R24
(0052) }
    0040 9508      RET
(0053) // -----------------------------------------------------------------------------
(0054) //  函数说明 : 关闭 PWM 
(0055) //   
(0056) // -----------------------------------------------------------------------------
(0057) void ClosePwm(void )
(0058) {
(0059)   TCCR1B&=~(1<<CS10);                      // 停止T1分频 ,停止PWM 输出
_ClosePwm:
    0041 B58E      IN	R24,0x2E
    0042 7F8E      ANDI	R24,0xFE
    0043 BD8E      OUT	0x2E,R24
(0060) }
    0044 9508      RET
(0061) // -----------------------------------------------------------------------------
(0062) //  函数说明 :设置PWM的占空比 
(0063) //  设置说明 :占空比 =   OCR1A / ICR1  ;
(0064) // -----------------------------------------------------------------------------
(0065) void SetRate(unsigned int i_rate)
(0066) {
(0067)   OCR1A= i_rate;       // OCR1A控制占空比 
_SetRate:
  i_rate               --> R16
    0045 BD1B      OUT	0x2B,R17
    0046 BD0A      OUT	0x2A,R16
(0068) }
    0047 9508      RET
(0069) // -----------------------------------------------------------------------------
(0070) //  函数说明 :设置PWM 的频率
(0071) //   
(0072) // -----------------------------------------------------------------------------
(0073) void SetFrequency(unsigned int i_fre)
(0074) {
(0075)     ICR1 = i_fre ;    //ICR1控制分辨率 2-16
_SetFrequency:
  i_fre                --> R16
    0048 BD17      OUT	0x27,R17
    0049 BD06      OUT	0x26,R16
(0076) }
    004A 9508      RET
(0077) // -----------------------------------------------------------------------------
(0078) //  函数说明 :初始化系统
(0079) //   
(0080) // -----------------------------------------------------------------------------
(0081) void init_devices(void)
(0082) {
(0083)  //stop errant interrupts until set up
(0084)  CLI(); //disable all interrupts
_init_devices:
    004B 94F8      BCLR	7
(0085)  port_init();
    004C DFE6      RCALL	_port_init
(0086)  timer1_init();
    004D DFE8      RCALL	_timer1_init
(0087) 
(0088)  MCUCR = 0x00;
    004E 2422      CLR	R2
    004F BE25      OUT	0x35,R2
(0089)  GICR  = 0x00;
    0050 BE2B      OUT	0x3B,R2
(0090)  TIMSK = 0x00; //timer interrupt sources
    0051 BE29      OUT	0x39,R2
(0091)  SEI(); //re-enable interrupts
    0052 9478      BSET	7
(0092) }
    0053 9508      RET
(0093) // -----------------------------------------------------------------------------
(0094) //  函数说明 :测试 T1的PWM 
(0095) //  
(0096) // -----------------------------------------------------------------------------
(0097) void main(void)
(0098) { 
(0099)   init_devices();
_main:
    0054 DFF6      RCALL	_init_devices
(0100)   SetFrequency(HZ_5K);
    0055 E400      LDI	R16,0x40
    0056 E016      LDI	R17,6
    0057 DFF0      RCALL	_SetFrequency
(0101)   SetRate(HZ_5K/4);  // 实际占空比 :0.24
    0058 E900      LDI	R16,0x90
    0059 E011      LDI	R17,1
    005A DFEA      RCALL	_SetRate
(0102)   StartPwm();
    005B DFE1      RCALL	_StartPwm
(0103)   while(1)
    005C CFFF      RJMP	0x005C
(0104)   {
(0105)     ;
(0106)   }
(0107) }
FILE: <library>
    005D 9508      RET

⌨️ 快捷键说明

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