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