⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1602_main.lis

📁 AVR ATMEGA32可以同时四路PWM输出
💻 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 + -