📄 1602_main.lis
字号:
.module _1602_main.c
.area text(rom, con, rel)
0000 .dbfile F:\tem\MYATME~1\四路PWM输出\1602_main.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; c -> R20
0000 ; time -> R16,R17
.even
0000 _delay_ms::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 20
0002 ; /********************************************
0002 ; * TC1产生16位双路PWM *
0002 ; * 实验内容:由TC1产生两路独立的16位PWM输出 *
0002 ; * 实验环境:本站M16学习板 *
0002 ; * 日 期:2007年08月16日 *
0002 ; * 作 者:tonghe *
0002 ; * 版 本:V1.0 *
0002 ; * 修改日期:2007年08月16日 *
0002 ; * 芯 片:M16 *
0002 ; * 工作频率:内部8M *
0002 ; * 编 译 器:ICCAVR 6.31A *
0002 ; * 输 出:PD4输出PWMB,PD5输出PWMA *
0002 ; * 产生的PWM频率为8M/65536约122HZ *
0002 ; ********************************************/
0002 ; #include <iom16v.h>
0002 ; #include <macros.h>
0002 ;
0002 ; //延时函数:入口time 需延时的MS数
0002 ; void delay_ms(unsigned int time)
0002 ; {
0002 .dbline 22
0002 ; unsigned char c;
0002 ; for(;time;time--)
0002 07C0 rjmp L5
0004 L2:
0004 .dbline 23
0004 ; {
0004 .dbline 24
0004 ; for(c=220;c;c--)
0004 4CED ldi R20,220
0006 01C0 rjmp L9
0008 L6:
0008 .dbline 25
0008 .dbline 26
0008 .dbline 27
0008 L7:
0008 .dbline 24
0008 4A95 dec R20
000A L9:
000A .dbline 24
000A 4423 tst R20
000C E9F7 brne L6
000E .dbline 28
000E L3:
000E .dbline 22
000E 0150 subi R16,1
0010 1040 sbci R17,0
0012 L5:
0012 .dbline 22
0012 0030 cpi R16,0
0014 0107 cpc R16,R17
0016 B1F7 brne L2
0018 X0:
0018 .dbline -2
0018 L1:
0018 00D0 rcall pop_gset1
001A .dbline 0 ; func end
001A 0895 ret
001C .dbsym r c 20 c
001C .dbsym r time 16 i
001C .dbend
001C .dbfunc e port_init _port_init fV
.even
001C _port_init::
001C .dbline -1
001C .dbline 33
001C ; {
001C ; ;
001C ; }
001C ; }
001C ; }
001C ;
001C ; //端口初始化
001C ; void port_init(void)
001C ; {
001C .dbline 34
001C ; PORTA = 0xFF;
001C 8FEF ldi R24,255
001E 8BBB out 0x1b,R24
0020 .dbline 35
0020 ; DDRA = 0x00;
0020 2224 clr R2
0022 2ABA out 0x1a,R2
0024 .dbline 36
0024 ; PORTB = 0xFF;
0024 88BB out 0x18,R24
0026 .dbline 37
0026 ; DDRB = 0xFF;
0026 87BB out 0x17,R24
0028 .dbline 38
0028 ; PORTC = 0x00;
0028 25BA out 0x15,R2
002A .dbline 39
002A ; DDRC = 0x00;
002A 24BA out 0x14,R2
002C .dbline 40
002C ; PORTD = 0x00;
002C 22BA out 0x12,R2
002E .dbline 41
002E ; DDRD = 0xb0;
002E 80EB ldi R24,176
0030 81BB out 0x11,R24
0032 .dbline -2
0032 L10:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbend
0034 .dbfunc e timer1_init _timer1_init fV
.even
0034 _timer1_init::
0034 .dbline -1
0034 .dbline 46
0034 ; }
0034 ;
0034 ; //TC1初始化
0034 ; void timer1_init(void)
0034 ; {
0034 .dbline 47
0034 ; TCCR1A = 0xA2; //两路PWM,匹配清零
0034 82EA ldi R24,162
0036 8FBD out 0x2f,R24
0038 .dbline 48
0038 ; TCCR1B = 0x19; //快速PWM模式,位数可调,预分频1
0038 89E1 ldi R24,25
003A 8EBD out 0x2e,R24
003C .dbline 50
003C ;
003C ; ICR1 = 0xFFFF;
003C 8FEF ldi R24,65535
003E 9FEF ldi R25,255
0040 97BD out 0x27,R25
0042 86BD out 0x26,R24
0044 .dbline -2
0044 L11:
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbend
0046 .dbfunc e init_devices _init_devices fV
.even
0046 _init_devices::
0046 .dbline -1
0046 .dbline 58
0046 ; //计数上限值,此数为16位PWM,此值的多少决定PWM的位数,改变值可以改变时钟的输入频率
0046 ; //在1M时钟下,OCR1A,OCR1B=1M/65536=15HZ。改为7FFF时,为30HZ,ICR1变小,OCR1A,B成比例变大
0046 ;
0046 ; }
0046 ;
0046 ; //器件初始化
0046 ; void init_devices(void)
0046 ; {
0046 .dbline 59
0046 ; port_init(); //端口初始化
0046 EADF rcall _port_init
0048 .dbline 60
0048 ; timer1_init(); //TC1初始化
0048 F5DF rcall _timer1_init
004A .dbline 62
004A ;
004A ; MCUCR = 0x00;
004A 2224 clr R2
004C 25BE out 0x35,R2
004E .dbline 63
004E ; GICR = 0x00;
004E 2BBE out 0x3b,R2
0050 .dbline -2
0050 L12:
0050 .dbline 0 ; func end
0050 0895 ret
0052 .dbend
0052 .dbfunc e main _main fV
.even
0052 _main::
0052 .dbline -1
0052 .dbline 68
0052 ; }
0052 ;
0052 ; //主函数
0052 ; void main(void)
0052 ; {
0052 .dbline 72
0052 ; //相位修正PWM模式,OCO的频率=fclk/(512*N),fclk为输入时钟频率,本例使用内部1M时钟
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -