?? 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 + -