oc2输出pwm.lst
来自「ICC mega8例子」· LST 代码 · 共 159 行
LST
159 行
__start:
__text_start:
13 E5CF LDI R28,0x5F
14 E0D4 LDI R29,4
15 BFCD OUT 0x3D,R28
16 BFDE OUT 0x3E,R29
17 51CE SUBI R28,0x1E
18 40D0 SBCI R29,0
19 EA0A LDI R16,0xAA
1A 8308 STD Y+0,R16
1B 2400 CLR R0
1C E6E0 LDI R30,0x60
1D E0F0 LDI R31,0
1E E010 LDI R17,0
1F 36E0 CPI R30,0x60
20 07F1 CPC R31,R17
21 F011 BEQ 0x0024
22 9201 ST R0,Z+
23 CFFB RJMP 0x001F
24 8300 STD Z+0,R16
25 E2E6 LDI R30,0x26
26 E0F0 LDI R31,0
27 E6A0 LDI R26,0x60
28 E0B0 LDI R27,0
29 E010 LDI R17,0
2A E000 LDI R16,0
2B BF0B OUT 0x3B,R16
2C 32E6 CPI R30,0x26
2D 07F1 CPC R31,R17
2E F021 BEQ 0x0033
2F 95C8 LPM
30 9631 ADIW R30,1
31 920D ST R0,X+
32 CFF9 RJMP 0x002C
33 D02D RCALL _main
_exit:
34 CFFF RJMP _exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_OC2输出PWM\OC2输出PWM.c
(0001) //ICC-AVR application builder : 2009-3-11 13:30:36
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTB = 0x00;
_port_init:
35 2422 CLR R2
36 BA28 OUT 0x18,R2
(0011) DDRB = 0x00;
37 BA27 OUT 0x17,R2
(0012) PORTC = 0x00; //m103 output only
38 BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
39 BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
3A BA22 OUT 0x12,R2
(0015) DDRD = 0x00;
3B BA21 OUT 0x11,R2
3C 9508 RET
(0016) }
(0017)
(0018) //call this routine to initialize all peripherals
(0019) void init_devices(void)
(0020) {
(0021) //stop errant interrupts until set up
(0022) CLI(); //disable all interrupts
_init_devices:
3D 94F8 BCLR 7
(0023) port_init();
3E DFF6 RCALL _port_init
(0024)
(0025) MCUCR = 0x00;
3F 2422 CLR R2
40 BE25 OUT 0x35,R2
(0026) GICR = 0x00;
41 BE2B OUT 0x3B,R2
(0027) TIMSK = 0x00; //timer interrupt sources
42 BE29 OUT 0x39,R2
(0028) SEI(); //re-enable interrupts
43 9478 BSET 7
44 9508 RET
(0029) //all peripherals are now initialized
(0030) }
(0031)
(0032) /************************************
(0033) 用 途:用TC2的PWM进行相位可调输出
(0034) Taget :mega8
(0035) crystal :8M
(0036) 介 绍:输出为OC2(PB3)
(0037) 入口参数:n为0-255,代表占空比
(0038) 出口参数:
(0039) *************************************/
(0040) void init_timer2_PWM(unsigned char n)
(0041) {
(0042) DDRB=(1<<PB3);
_init_timer2_PWM:
n --> R16
45 E088 LDI R24,0x8
46 BB87 OUT 0x17,R24
(0043) TCCR2=0;//TC2处于定时方式,先停止TC2
47 2422 CLR R2
48 BC25 OUT 0x25,R2
(0044) TCNT2=0;//设初值
49 BC24 OUT 0x24,R2
(0045) OCR2=255-n;//设比较参考值//恒定低电平
4A 2E20 MOV R2,R16
4B 2433 CLR R3
4C EF8F LDI R24,0xFF
4D E090 LDI R25,0
4E 012C MOVW R4,R24
4F 1842 SUB R4,R2
50 0853 SBC R5,R3
51 BC43 OUT 0x23,R4
(0046) TIMSK&=(~((1<<OCIE2)|(1<<TOIE2)));//关闭TOV2中断
52 B789 IN R24,0x39
53 738F ANDI R24,0x3F
54 BF89 OUT 0x39,R24
(0047) //打开TC2选择相位可调PWM模式,64分频
(0048) TCCR2|=(1<<WGM20)|(1<<COM21)|(1<<COM20)|(1<<CS22);
55 B585 IN R24,0x25
56 6784 ORI R24,0x74
57 BD85 OUT 0x25,R24
58 9508 RET
(0049) }
(0050) //调节占空比
(0051) void timer2_PWM(unsigned char n)
(0052) {
(0053) OCR2=255-n;
_timer2_PWM:
n --> R16
59 2E20 MOV R2,R16
5A 2433 CLR R3
5B EF8F LDI R24,0xFF
5C E090 LDI R25,0
5D 1982 SUB R24,R2
5E 0993 SBC R25,R3
5F BD83 OUT 0x23,R24
60 9508 RET
(0054) }
(0055)
(0056) void main()
(0057) {
(0058) port_init();
_main:
61 DFD3 RCALL _port_init
(0059) init_devices();
62 DFDA RCALL _init_devices
(0060)
(0061) init_timer2_PWM(100);
63 E604 LDI R16,0x64
64 DFE0 RCALL _init_timer2_PWM
(0062) while(1)
FILE: <library>
65 CFFF RJMP 0x0065
66 9508 RET
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?