📄 1.lst
字号:
__text_start:
__start:
0002 E5CF LDI R28,0x5F
0003 E0D2 LDI R29,2
0004 BFCD OUT 0x3D,R28
0005 BFDE OUT 0x3E,R29
0006 51C0 SUBI R28,0x10
0007 40D0 SBCI R29,0
0008 EA0A LDI R16,0xAA
0009 8308 STD Y+0,R16
000A 2400 CLR R0
000B E6E0 LDI R30,0x60
000C E0F0 LDI R31,0
000D E010 LDI R17,0
000E 36E0 CPI R30,0x60
000F 07F1 CPC R31,R17
0010 F011 BEQ 0x0013
0011 9201 ST R0,Z+
0012 CFFB RJMP 0x000E
0013 8300 STD Z+0,R16
0014 E0E4 LDI R30,4
0015 E0F0 LDI R31,0
0016 E6A0 LDI R26,0x60
0017 E0B0 LDI R27,0
0018 E010 LDI R17,0
0019 30E4 CPI R30,4
001A 07F1 CPC R31,R17
001B F021 BEQ 0x0020
001C 95C8 LPM
001D 9631 ADIW R30,1
001E 920D ST R0,X+
001F CFF9 RJMP 0x0019
0020 D02A RCALL _main
_exit:
0021 CFFF RJMP _exit
_delay_ms:
c --> R20
time --> R16
0022 D040 RCALL push_gset1
FILE: F:\tem\MYATME~1\四路PWM输出\1602_main.c
(0001) /********************************************
(0002) * TC1产生16位双路PWM *
(0003) * 实验内容:由TC1产生两路独立的16位PWM输出 *
(0004) * 实验环境:本站M16学习板 *
(0005) * 日 期:2007年08月16日 *
(0006) * 作 者:tonghe *
(0007) * 版 本:V1.0 *
(0008) * 修改日期:2007年08月16日 *
(0009) * 芯 片:M16 *
(0010) * 工作频率:内部8M *
(0011) * 编 译 器:ICCAVR 6.31A *
(0012) * 输 出:PD4输出PWMB,PD5输出PWMA *
(0013) * 产生的PWM频率为8M/65536约122HZ *
(0014) ********************************************/
(0015) #include <iom16v.h>
(0016) #include <macros.h>
(0017)
(0018) //延时函数:入口time 需延时的MS数
(0019) void delay_ms(unsigned int time)
(0020) {
(0021) unsigned char c;
(0022) for(;time;time--)
0023 C007 RJMP 0x002B
(0023) {
(0024) for(c=220;c;c--)
0024 ED4C LDI R20,0xDC
0025 C001 RJMP 0x0027
0026 954A DEC R20
0027 2344 TST R20
0028 F7E9 BNE 0x0026
0029 5001 SUBI R16,1
002A 4010 SBCI R17,0
002B 3000 CPI R16,0
002C 0701 CPC R16,R17
002D F7B1 BNE 0x0024
002E D037 RCALL pop_gset1
002F 9508 RET
(0025) {
(0026) ;
(0027) }
(0028) }
(0029) }
(0030)
(0031) //端口初始化
(0032) void port_init(void)
(0033) {
(0034) PORTA = 0xFF;
_port_init:
0030 EF8F LDI R24,0xFF
0031 BB8B OUT 0x1B,R24
(0035) DDRA = 0x00;
0032 2422 CLR R2
0033 BA2A OUT 0x1A,R2
(0036) PORTB = 0xFF;
0034 BB88 OUT 0x18,R24
(0037) DDRB = 0xFF;
0035 BB87 OUT 0x17,R24
(0038) PORTC = 0x00;
0036 BA25 OUT 0x15,R2
(0039) DDRC = 0x00;
0037 BA24 OUT 0x14,R2
(0040) PORTD = 0x00;
0038 BA22 OUT 0x12,R2
(0041) DDRD = 0xb0;
0039 EB80 LDI R24,0xB0
003A BB81 OUT 0x11,R24
003B 9508 RET
(0042) }
(0043)
(0044) //TC1初始化
(0045) void timer1_init(void)
(0046) {
(0047) TCCR1A = 0xA2; //两路PWM,匹配清零
_timer1_init:
003C EA82 LDI R24,0xA2
003D BD8F OUT 0x2F,R24
(0048) TCCR1B = 0x19; //快速PWM模式,位数可调,预分频1
003E E189 LDI R24,0x19
003F BD8E OUT 0x2E,R24
(0049)
(0050) ICR1 = 0xFFFF;
0040 EF8F LDI R24,0xFF
0041 EF9F LDI R25,0xFF
0042 BD97 OUT 0x27,R25
0043 BD86 OUT 0x26,R24
0044 9508 RET
(0051) //计数上限值,此数为16位PWM,此值的多少决定PWM的位数,改变值可以改变时钟的输入频率
(0052) //在1M时钟下,OCR1A,OCR1B=1M/65536=15HZ。改为7FFF时,为30HZ,ICR1变小,OCR1A,B成比例变大
(0053)
(0054) }
(0055)
(0056) //器件初始化
(0057) void init_devices(void)
(0058) {
(0059) port_init(); //端口初始化
_init_devices:
0045 DFEA RCALL _port_init
(0060) timer1_init(); //TC1初始化
0046 DFF5 RCALL _timer1_init
(0061)
(0062) MCUCR = 0x00;
0047 2422 CLR R2
0048 BE25 OUT 0x35,R2
(0063) GICR = 0x00;
0049 BE2B OUT 0x3B,R2
004A 9508 RET
(0064) }
(0065)
(0066) //主函数
(0067) void main(void)
(0068) {
(0069) //相位修正PWM模式,OCO的频率=fclk/(512*N),fclk为输入时钟频率,本例使用内部1M时钟
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -