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 + -
显示快捷键?