📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile D:\AVR\M8_PWM\main.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 24
0000 ;
0000 ; // -----------------------------------------------------------------------------
0000 ; // Project Name : M8 PWM 参考程序
0000 ; // Crystal : 16Mhz
0000 ; // Target Setting : ATMaga8
0000 ; // Power : 5V
0000 ; // Date : Dec.21.2006
0000 ; // File Version : 1.0
0000 ; // Author :
0000 ; // -----------------------------------------------------------------------------
0000 ;
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; // ------------------ 频率定义 --------------------------
0000 ; #define HZ_5K 0x0640
0000 ; #define HZ_10K 0x0320
0000 ;
0000 ; // -----------------------------------------------------------------------------
0000 ; // 函数说明 :配置PWM的输出 管脚 OC1A (PB1)
0000 ; //
0000 ; // -----------------------------------------------------------------------------
0000 ; void port_init(void)
0000 ; {
0000 .dbline 25
0000 ; PORTB |= 0x02;
0000 C19A sbi 0x18,1
0002 .dbline 26
0002 ; DDRB |= 0x02;
0002 B99A sbi 0x17,1
0004 .dbline -2
0004 .dbline 27
0004 ; }
0004 L1:
0004 .dbline 0 ; func end
0004 0895 ret
0006 .dbend
0006 .dbfunc e timer1_init _timer1_init fV
.even
0006 _timer1_init::
0006 .dbline -1
0006 .dbline 33
0006 ; // -----------------------------------------------------------------------------
0006 ; // 函数说明 :配置T1的PWM
0006 ; // 产生频率 :5KHz 误差 5.00048KHz (0.0%)
0006 ; // -----------------------------------------------------------------------------
0006 ; void timer1_init(void)
0006 ; {
0006 .dbline 38
0006 ; //TCCR1A|=(1<<COM1A1)|(1<<COM1A0); //当计时器往TOP计数时若TCNT1与OCR1A匹配OC1A
0006 ; //将清零为低电平
0006 ; //在计时器往BOTTOM计数时TCNT1与OCR1A匹配OC1A
0006 ; //将置位为高电平
0006 ; TCCR1A|=(1<<COM1A1)|(0<<COM1A0); //当计时器往TOP计数时若TCNT1与OCR1A匹配OC1A
0006 8FB5 in R24,0x2f
0008 8068 ori R24,128
000A 8FBD out 0x2f,R24
000C .dbline 43
000C ; //将清零为高电平
000C ; //在计时器往BOTTOM计数时TCNT1与OCR1A匹配OC1A
000C ; //将置位为低电平
000C ;
000C ; TCCR1B|=(1<<WGM13); //设置T1为相位与频率修正PWM模式 TOP值为ICR1
000C 8EB5 in R24,0x2e
000E 8061 ori R24,16
0010 8EBD out 0x2e,R24
0012 .dbline -2
0012 .dbline 44
0012 ; }
0012 L2:
0012 .dbline 0 ; func end
0012 0895 ret
0014 .dbend
0014 .dbfunc e StartPwm _StartPwm fV
.even
0014 _StartPwm::
0014 .dbline -1
0014 .dbline 50
0014 ; // -----------------------------------------------------------------------------
0014 ; // 函数说明 : 开启 PWM
0014 ; //
0014 ; // -----------------------------------------------------------------------------
0014 ; void StartPwm(void)
0014 ; {
0014 .dbline 51
0014 ; TCCR1B|=(1<<CS10); //启动T1 不分频 即启动PWM输出
0014 8EB5 in R24,0x2e
0016 8160 ori R24,1
0018 8EBD out 0x2e,R24
001A .dbline -2
001A .dbline 52
001A ; }
001A L3:
001A .dbline 0 ; func end
001A 0895 ret
001C .dbend
001C .dbfunc e ClosePwm _ClosePwm fV
.even
001C _ClosePwm::
001C .dbline -1
001C .dbline 58
001C ; // -----------------------------------------------------------------------------
001C ; // 函数说明 : 关闭 PWM
001C ; //
001C ; // -----------------------------------------------------------------------------
001C ; void ClosePwm(void )
001C ; {
001C .dbline 59
001C ; TCCR1B&=~(1<<CS10); // 停止T1分频 ,停止PWM 输出
001C 8EB5 in R24,0x2e
001E 8E7F andi R24,254
0020 8EBD out 0x2e,R24
0022 .dbline -2
0022 .dbline 60
0022 ; }
0022 L4:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbend
0024 .dbfunc e SetRate _SetRate fV
0024 ; i_rate -> R16,R17
.even
0024 _SetRate::
0024 .dbline -1
0024 .dbline 66
0024 ; // -----------------------------------------------------------------------------
0024 ; // 函数说明 :设置PWM的占空比
0024 ; // 设置说明 :占空比 = OCR1A / ICR1 ;
0024 ; // -----------------------------------------------------------------------------
0024 ; void SetRate(unsigned int i_rate)
0024 ; {
0024 .dbline 67
0024 ; OCR1A= i_rate; // OCR1A控制占空比
0024 1BBD out 0x2b,R17
0026 0ABD out 0x2a,R16
0028 .dbline -2
0028 .dbline 68
0028 ; }
0028 L5:
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbsym r i_rate 16 i
002A .dbend
002A .dbfunc e SetFrequency _SetFrequency fV
002A ; i_fre -> R16,R17
.even
002A _SetFrequency::
002A .dbline -1
002A .dbline 74
002A ; // -----------------------------------------------------------------------------
002A ; // 函数说明 :设置PWM 的频率
002A ; //
002A ; // -----------------------------------------------------------------------------
002A ; void SetFrequency(unsigned int i_fre)
002A ; {
002A .dbline 75
002A ; ICR1 = i_fre ; //ICR1控制分辨率 2-16
002A 17BD out 0x27,R17
002C 06BD out 0x26,R16
002E .dbline -2
002E .dbline 76
002E ; }
002E L6:
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r i_fre 16 i
0030 .dbend
0030 .dbfunc e init_devices _init_devices fV
.even
0030 _init_devices::
0030 .dbline -1
0030 .dbline 82
0030 ; // -----------------------------------------------------------------------------
0030 ; // 函数说明 :初始化系统
0030 ; //
0030 ; // -----------------------------------------------------------------------------
0030 ; void init_devices(void)
0030 ; {
0030 .dbline 84
0030 ; //stop errant interrupts until set up
0030 ; CLI(); //disable all interrupts
0030 F894 cli
0032 .dbline 85
0032 ; port_init();
0032 E6DF rcall _port_init
0034 .dbline 86
0034 ; timer1_init();
0034 E8DF rcall _timer1_init
0036 .dbline 88
0036 ;
0036 ; MCUCR = 0x00;
0036 2224 clr R2
0038 25BE out 0x35,R2
003A .dbline 89
003A ; GICR = 0x00;
003A 2BBE out 0x3b,R2
003C .dbline 90
003C ; TIMSK = 0x00; //timer interrupt sources
003C 29BE out 0x39,R2
003E .dbline 91
003E ; SEI(); //re-enable interrupts
003E 7894 sei
0040 .dbline -2
0040 .dbline 92
0040 ; }
0040 L7:
0040 .dbline 0 ; func end
0040 0895 ret
0042 .dbend
0042 .dbfunc e main _main fV
.even
0042 _main::
0042 .dbline -1
0042 .dbline 98
0042 ; // -----------------------------------------------------------------------------
0042 ; // 函数说明 :测试 T1的PWM
0042 ; //
0042 ; // -----------------------------------------------------------------------------
0042 ; void main(void)
0042 ; {
0042 .dbline 99
0042 ; init_devices();
0042 F6DF rcall _init_devices
0044 .dbline 100
0044 ; SetFrequency(HZ_5K);
0044 00E4 ldi R16,1600
0046 16E0 ldi R17,6
0048 F0DF rcall _SetFrequency
004A .dbline 101
004A ; SetRate(HZ_5K/4); // 实际占空比 :0.24
004A 00E9 ldi R16,400
004C 11E0 ldi R17,1
004E EADF rcall _SetRate
0050 .dbline 102
0050 ; StartPwm();
0050 E1DF rcall _StartPwm
0052 L9:
0052 .dbline 104
0052 .dbline 105
0052 .dbline 106
0052 L10:
0052 .dbline 103
0052 FFCF rjmp L9
0054 X0:
0054 .dbline -2
0054 .dbline 107
0054 ; while(1)
0054 ; {
0054 ; ;
0054 ; }
0054 ; }
0054 L8:
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -