📄 pwm.lst
字号:
__start:
__text_start:
0013 E5CF LDI R28,0x5F
0014 E0D4 LDI R29,4
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E0 LDI R30,0x60
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 36E0 CPI R30,0x60
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E6 LDI R30,0x26
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D028 RCALL _main
_exit:
0032 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\PWM\PWM.C
(0001) /*************************
(0002) NAME: PWM.C
(0003) DATA: 2007/7/9
(0004) AUTHOR: MICHAEL
(0005) SOFTWARE: ICCAVR6.31
(0006) MCU: ATMEGA8L
(0007) 8.000000MHz
(0008) *************************/
(0009) #include <iom8v.h>
(0010) #include <macros.h>
(0011) //-----------------------------------------------------------------------
(0012) // 初始化函数
(0013) //-----------------------------------------------------------------------
(0014) void initial_PWM(void)
(0015) {
(0016) DDRB=0XFF;
_initial_PWM:
0033 EF8F LDI R24,0xFF
0034 BB87 OUT 0x17,R24
(0017) PORTB=0XFF;
0035 BB88 OUT 0x18,R24
(0018) TCCR2=0X79;
0036 E789 LDI R24,0x79
0037 BD85 OUT 0x25,R24
(0019) OCR2=0X00; //设置比较数值
0038 2422 CLR R2
0039 BC23 OUT 0x23,R2
003A 9508 RET
(0020) }
(0021) //----------------------------------------------------------------------------------
(0022) // 8位快速PWM函数(输出频率为Fout=Fio/N*256,N是分频数)
(0023) //----------------------------------------------------------------------------------
(0024) void Fast_PWM(unsigned char PWMdata)//PWMdata越大,占空比越小
(0025) {
(0026) TCCR2=0X79; //快速PWM模式,时钟为I/O时钟不分频
_Fast_PWM:
PWMdata --> R16
003B E789 LDI R24,0x79
003C BD85 OUT 0x25,R24
(0027) // TCCR2=0X7A; //快速PWM模式,时钟为I/O时钟8分频
(0028) // TCCR2=0X7B; //快速PWM模式,时钟为I/O时钟32分频
(0029) // TCCR2=0X7C; //快速PWM模式,时钟为I/O时钟64分频
(0030) // TCCR2=0X7D; //快速PWM模式,时钟为I/O时钟128分频
(0031) // TCCR2=0X7E; //快速PWM模式,时钟为I/O时钟256分频
(0032) // TCCR2=0X7F; //快速PWM模式,时钟为I/O时钟1024分频
(0033) TCNT2=PWMdata;
003D BD04 OUT 0x24,R16
(0034) OCR2=PWMdata; //设置比较数值
003E BD03 OUT 0x23,R16
003F 9508 RET
(0035) }
(0036) #pragma interrupt_handler USART_receive: 12
(0037) //------------------------------------------------------------------
(0038) // USART初始化函数
(0039) //------------------------------------------------------------------
(0040) void initial_USART(void)
(0041) {
(0042) //-----端口设置--------
(0043) PORTB = 0xFF;
_initial_USART:
0040 EF8F LDI R24,0xFF
0041 BB88 OUT 0x18,R24
(0044) DDRB = 0xFF;
0042 BB87 OUT 0x17,R24
(0045) PORTC = 0x00;
0043 2422 CLR R2
0044 BA25 OUT 0x15,R2
(0046) DDRC = 0x00;
0045 BA24 OUT 0x14,R2
(0047) PORTD = 0x00;
0046 BA22 OUT 0x12,R2
(0048) DDRD = 0xFF;
0047 BB81 OUT 0x11,R24
(0049) //------USART设置-------
(0050) UCSRA=0X00; //波特率不加倍,同时清空一些标志位
0048 B82B OUT 0x0B,R2
(0051) UCSRB=0X98; //使能接收和发送,数据位为8位,开接收中断
0049 E988 LDI R24,0x98
004A B98A OUT 0x0A,R24
(0052) UCSRC=0X86; //异步方式,禁止奇偶校验,数据位为8位
004B E886 LDI R24,0x86
004C BD80 OUT 0x20,R24
(0053) //时钟频率8M,波特率9600
(0054) UBRRH=0X00;
004D BC20 OUT 0x20,R2
(0055) UBRRL=0X33;
004E E383 LDI R24,0x33
004F B989 OUT 0x09,R24
(0056) //时钟频率8M,波特率57600
(0057) // UBRRH=0X00;
(0058) // UBRRL=0X08;
(0059)
(0060) SEI(); //全局开中断
0050 9478 BSET 7
0051 9508 RET
_USART_receive:
RECdata --> R20
0052 D02A RCALL push_lset
0053 D012 RCALL push_gset1
(0061) } //发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时TXC 置位
(0062) //--------------------------------------------------------------
(0063) // 接收中断服务函数
(0064) //--------------------------------------------------------------
(0065) void USART_receive(void)
(0066) {
(0067) unsigned char RECdata;
(0068) RECdata=UDR;
0054 B14C IN R20,0x0C
(0069) Fast_PWM(RECdata);
0055 2F04 MOV R16,R20
0056 DFE4 RCALL _Fast_PWM
0057 D011 RCALL pop_gset1
0058 D03B RCALL pop_lset
0059 9518 RETI
(0070)
(0071) }
(0072) //-----------------------------------------------------------------------
(0073) // 主函数
(0074) //-----------------------------------------------------------------------
(0075) void main(void)
(0076) {
(0077) initial_PWM();
_main:
005A DFD8 RCALL _initial_PWM
(0078) initial_USART();
005B DFE4 RCALL _initial_USART
(0079) while(1);
FILE: <library>
005C CFFF RJMP 0x005C
005D 9508 RET
push_gset5:
005E 92FA ST R15,-Y
005F 92EA ST R14,-Y
push_gset4:
0060 92DA ST R13,-Y
0061 92CA ST R12,-Y
push_gset3:
0062 92BA ST R11,-Y
0063 92AA ST R10,-Y
push_gset2:
0064 937A ST R23,-Y
0065 936A ST R22,-Y
push_gset1:
0066 935A ST R21,-Y
0067 934A ST R20,-Y
0068 9508 RET
pop_gset1:
0069 E0E1 LDI R30,1
pop:
006A 9149 LD R20,Y+
006B 9159 LD R21,Y+
006C FDE0 SBRC R30,0
006D 9508 RET
006E 9169 LD R22,Y+
006F 9179 LD R23,Y+
0070 FDE1 SBRC R30,1
0071 9508 RET
0072 90A9 LD R10,Y+
0073 90B9 LD R11,Y+
0074 FDE2 SBRC R30,2
0075 9508 RET
0076 90C9 LD R12,Y+
0077 90D9 LD R13,Y+
0078 FDE3 SBRC R30,3
0079 9508 RET
007A 90E9 LD R14,Y+
007B 90F9 LD R15,Y+
007C 9508 RET
push_lset:
007D 93FA ST R31,-Y
007E 93EA ST R30,-Y
007F 93BA ST R27,-Y
0080 93AA ST R26,-Y
0081 939A ST R25,-Y
0082 938A ST R24,-Y
0083 933A ST R19,-Y
0084 932A ST R18,-Y
0085 931A ST R17,-Y
0086 930A ST R16,-Y
0087 929A ST R9,-Y
0088 928A ST R8,-Y
0089 927A ST R7,-Y
008A 926A ST R6,-Y
008B 925A ST R5,-Y
008C 924A ST R4,-Y
008D 923A ST R3,-Y
008E 922A ST R2,-Y
008F 921A ST R1,-Y
0090 920A ST R0,-Y
0091 B60F IN R0,0x3F
0092 920A ST R0,-Y
0093 9508 RET
pop_lset:
0094 9009 LD R0,Y+
0095 BE0F OUT 0x3F,R0
0096 9009 LD R0,Y+
0097 9019 LD R1,Y+
0098 9029 LD R2,Y+
0099 9039 LD R3,Y+
009A 9049 LD R4,Y+
009B 9059 LD R5,Y+
009C 9069 LD R6,Y+
009D 9079 LD R7,Y+
009E 9089 LD R8,Y+
009F 9099 LD R9,Y+
00A0 9109 LD R16,Y+
00A1 9119 LD R17,Y+
00A2 9129 LD R18,Y+
00A3 9139 LD R19,Y+
00A4 9189 LD R24,Y+
00A5 9199 LD R25,Y+
00A6 91A9 LD R26,Y+
00A7 91B9 LD R27,Y+
00A8 91E9 LD R30,Y+
00A9 91F9 LD R31,Y+
00AA 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -