📄 main.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D8 LDI R29,0x8
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E00C6 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\桌面\avr程序设计\电机控制\motor.c
(0001) /****************************************************************
(0002) ** 文件名:motor.c 电机驱动函数
(0003) ****************************************************************/
(0004) #include "config.h"
(0005)
(0006) /******************************************************************************/
(0007) //正转,速度
(0008) void for_ward(uint8 speed)
(0009) {
(0010) if(speed!=0)
_for_ward:
speed --> R16
004B 2300 TST R16
004C F021 BEQ 0x0051
(0011) {
(0012) OCR2 = speed;
004D BD03 OUT 0x23,R16
(0013) while(ASSR&(1<<TCR2UB)==1) ; //启动TC2 pwm 输出,异步操作需要等待 OCR2写入完毕
004E B422 IN R2,0x22
004F FC20 SBRC R2,0
0050 CFFD RJMP 0x004E
(0014) }
(0015) TC2_EN; //pwm_start
0051 B789 IN R24,0x39
0052 6C80 ORI R24,0xC0
0053 BF89 OUT 0x39,R24
(0016) moto_en1;
0054 9A94 SBI 0x12,4
(0017) moto_uen2;
0055 9895 CBI 0x12,5
0056 9508 RET
(0018) }
(0019) /******************************************************************************/
(0020) //反转,速度
(0021) void back_ward(uint8 speed)
(0022) {
(0023) if(speed!=0)
_back_ward:
speed --> R16
0057 2300 TST R16
0058 F021 BEQ 0x005D
(0024) {
(0025) OCR2 = speed;
0059 BD03 OUT 0x23,R16
(0026) while(ASSR&(1<<TCR2UB)==1) ;// 启动TC2 pwm 输出,异步操作需要等待OCR2写入完毕
005A B422 IN R2,0x22
005B FC20 SBRC R2,0
005C CFFD RJMP 0x005A
(0027) }
(0028) TC2_EN; //pwm start
005D B789 IN R24,0x39
005E 6C80 ORI R24,0xC0
005F BF89 OUT 0x39,R24
(0029) moto_uen1;
0060 9894 CBI 0x12,4
(0030) moto_en2;
0061 9A95 SBI 0x12,5
0062 9508 RET
(0031) }
(0032) /******************************************************************************/
(0033) //停止
(0034) void motor_stop(void)
(0035) {
(0036) moto_en1; //同时置一停止
_motor_stop:
0063 9A94 SBI 0x12,4
(0037) moto_en2;
0064 9A95 SBI 0x12,5
(0038) TC2_DIS; //pwm stop
0065 B789 IN R24,0x39
0066 778F ANDI R24,0x7F
0067 BF89 OUT 0x39,R24
0068 9508 RET
(0039) }
(0040) /******************************************************************************/
(0041)
(0042) //加速
(0043) void speed_add(uint8 add)
(0044) {
(0045) if(OCR2 + add < 240) //防止出现极大情况时候跳跃到很小。
_speed_add:
add --> R16
0069 B583 IN R24,0x23
006A 0F80 ADD R24,R16
006B 3F80 CPI R24,0xF0
006C F418 BCC 0x0070
(0046) {
(0047) OCR2 = OCR2 + add;
006D B423 IN R2,0x23
006E 0E20 ADD R2,R16
006F BC23 OUT 0x23,R2
(0048) }
0070 9508 RET
(0049) }
(0050) /******************************************************************************/
(0051)
(0052) //加速
(0053) void speed_subtract(uint8 subtract)
(0054) {
(0055) if(OCR2 - subtract > 10) //防止到很小之后跳跃到很大。
_speed_subtract:
subtract --> R16
0071 B423 IN R2,0x23
0072 1A20 SUB R2,R16
0073 E08A LDI R24,0xA
0074 1582 CP R24,R2
0075 F418 BCC 0x0079
(0056) {
(0057) OCR2 = OCR2 - subtract;
0076 B423 IN R2,0x23
0077 1A20 SUB R2,R16
0078 BC23 OUT 0x23,R2
(0058) }
0079 9508 RET
FILE: D:\桌面\avr程序设计\电机控制\device_init.c
(0001) //ICC-AVR application builder : 2006-11-1 0:27:10
(0002) // Target : M32
(0003) // Crystal: 7.3728Mhz
(0004) //文件名:device_init.c 各种参数初始化
(0005) #include "config.h"
(0006)
(0007) void port_init(void)
(0008) {
(0009) PORTA = 0x00;
_port_init:
007A 2422 CLR R2
007B BA2B OUT 0x1B,R2
(0010) DDRA = 0x00;
007C BA2A OUT 0x1A,R2
(0011) PORTB = 0x00;
007D BA28 OUT 0x18,R2
(0012) DDRB = 0x00;
007E BA27 OUT 0x17,R2
(0013) PORTC = 0x00;
007F BA25 OUT 0x15,R2
(0014) DDRC = 0x00;
0080 BA24 OUT 0x14,R2
(0015) PORTD = 0x00;
0081 BA22 OUT 0x12,R2
(0016) DDRD = 0x80; // D7 PWM //参考芯片手册
0082 E880 LDI R24,0x80
0083 BB81 OUT 0x11,R24
0084 9508 RET
(0017) }
(0018)
(0019) /**************************采用timer2 产生波形***********************/
(0020) // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))
(0021) void timer2_init(void)
(0022) {
(0023) TCCR2 = 0x00; //stop
_timer2_init:
0085 2422 CLR R2
0086 BC25 OUT 0x25,R2
(0024) TCNT2= 0x01; //set count
0087 E081 LDI R24,1
0088 BD84 OUT 0x24,R24
(0025) OCR2 = 0x66; //set compare
0089 E686 LDI R24,0x66
008A BD83 OUT 0x23,R24
(0026) TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; // start timer 快速pwm模式,匹配清零,溢出置位 256分频
008B E68E LDI R24,0x6E
008C BD85 OUT 0x25,R24
008D 9508 RET
(0027) //占空比=高比低为:(OCR2-0X01)/(0XFF-OCR2) OX01++++++(OCR2)__________OXFF (+表示输出高,_表示输出低)
(0028) //即OCR2越大,输出越大
(0029) }
(0030)
(0031) //call this routine to initialize all peripherals
(0032) void init_devices(void)
(0033) {
(0034) //stop errant interrupts until set up
(0035) CLI(); //disable all interrupts
_init_devices:
008E 94F8 BCLR 7
(0036) port_init();
008F DFEA RCALL _port_init
(0037) timer2_init();
0090 DFF4 RCALL _timer2_init
(0038) TIMSK = 0x00; //timer interrupt sources
0091 2422 CLR R2
0092 BE29 OUT 0x39,R2
(0039) SEI(); //re-enable interrupts
0093 9478 BSET 7
0094 9508 RET
_Delay100us:
i --> R20
x --> R16
0095 940E010F CALL push_gset1
FILE: D:\桌面\avr程序设计\电机控制\delay.c
(0001) // 文件名 delay.c 延时
(0002)
(0003) #include "config.h"
(0004) /***************************************************************************
(0005) 延时 M32 7.3728M 粗略计算
(0006) */
(0007) void Delay100us(uint8 x)
(0008) {
(0009) uint8 i; //4clock
(0010) for(i=147;x!=0;x--)
0097 E943 LDI R20,0x93
0098 C006 RJMP 0x009F
(0011) while(--i); //5 * i clock
0099 2F84 MOV R24,R20
009A 5081 SUBI R24,1
009B 2F48 MOV R20,R24
009C 2388 TST R24
009D F7D9 BNE 0x0099
009E 950A DEC R16
009F 2300 TST R16
00A0 F7C1 BNE 0x0099
00A1 940E0112 CALL pop_gset1
00A3 9508 RET
_Delay1ms:
n --> R20
00A4 940E010F CALL push_gset1
00A6 01A8 MOVW R20,R16
(0012) }
(0013) void Delay1ms(uint16 n)
(0014) {
(0015) for (;n!=0;n--){
00A7 C004 RJMP 0x00AC
(0016) Delay100us(10);
00A8 E00A LDI R16,0xA
00A9 DFEB RCALL _Delay100us
00AA 5041 SUBI R20,1
00AB 4050 SBCI R21,0
00AC 3040 CPI R20,0
00AD 0745 CPC R20,R21
00AE F7C9 BNE 0x00A8
00AF 940E0112 CALL pop_gset1
00B1 9508 RET
_Delay1s:
m --> R20
00B2 940E010F CALL push_gset1
00B4 01A8 MOVW R20,R16
(0017) }
(0018) }
(0019) void Delay1s(uint16 m) // m <= 6 ,when m==7, it is 1.
(0020) {
(0021) m=m*40;
00B5 E208 LDI R16,0x28
00B6 E010 LDI R17,0
00B7 019A MOVW R18,R20
00B8 940E00F7 CALL empy16s
00BA 01A8 MOVW R20,R16
(0022) for (;m!=0;m--){
00BB C004 RJMP 0x00C0
(0023) Delay100us(250);
00BC EF0A LDI R16,0xFA
00BD DFD7 RCALL _Delay100us
00BE 5041 SUBI R20,1
00BF 4050 SBCI R21,0
00C0 3040 CPI R20,0
00C1 0745 CPC R20,R21
00C2 F7C9 BNE 0x00BC
00C3 940E0112 CALL pop_gset1
00C5 9508 RET
FILE: D:\桌面\avr程序设计\电机控制\main.c
(0001) //文件名 main.c 工程主文件
(0002)
(0003) #include "config.h"
(0004)
(0005)
(0006) void main(void)
(0007) {
(0008)
(0009) /******************************************************************************/
(0010) //初始工作
(0011) /******************************************************************************/
(0012) init_devices();
_main:
00C6 940E008E CALL _init_devices
00C8 C022 RJMP 0x00EB
(0013)
(0014) while(1)
(0015) {
(0016) for_ward(0); //默认速度运转 正
00C9 2700 CLR R16
00CA 940E004B CALL _for_ward
(0017) Delay1s(5); //延时5s
00CC E005 LDI R16,5
00CD E010 LDI R17,0
00CE 940E00B2 CALL _Delay1s
(0018) motor_stop(); //停止
00D0 940E0063 CALL _motor_stop
(0019) Delay1s(5); //延时5s
00D2 E005 LDI R16,5
00D3 E010 LDI R17,0
00D4 940E00B2 CALL _Delay1s
(0020) back_ward(0); //默认速度运转 反
00D6 2700 CLR R16
00D7 940E0057 CALL _back_ward
(0021) Delay1s(5); //延时5s
00D9 E005 LDI R16,5
00DA E010 LDI R17,0
00DB 940E00B2 CALL _Delay1s
(0022) speed_add(20); //加速
00DD E104 LDI R16,0x14
00DE 940E0069 CALL _speed_add
(0023) Delay1s(5); //延时5s
00E0 E005 LDI R16,5
00E1 E010 LDI R17,0
00E2 940E00B2 CALL _Delay1s
(0024) speed_subtract(20); //减速
00E4 E104 LDI R16,0x14
00E5 940E0071 CALL _speed_subtract
(0025) Delay1s(5); //延时5s
00E7 E005 LDI R16,5
00E8 E010 LDI R17,0
00E9 940E00B2 CALL _Delay1s
00EB CFDD RJMP 0x00C9
00EC 9508 RET
(0026) }
(0027)
(0028) }
(0029)
(0030) /******************************************************************************/
(0031) // T2 控制PWM输出
(0032) // timer2_comp_isr不需要用,但是必须允许中断,在中断时有信号输出变化
(0033) /******************************************************************************/
(0034)
(0035) #pragma interrupt_handler timer2_comp_isr:5
(0036) void timer2_comp_isr(void)
(0037) {
_timer2_comp_isr:
00ED 9518 RETI
_timer2_ovf_isr:
00EE 938A ST R24,-Y
00EF B78F IN R24,0x3F
00F0 938A ST R24,-Y
(0038) //compare occured TCNT0=OCR0
(0039) }
(0040) #pragma interrupt_handler timer2_ovf_isr:6
(0041) void timer2_ovf_isr(void)
(0042) {
(0043) TCNT2 = 0x01;//reload counter value
FILE: <library>
00F1 E081 LDI R24,1
00F2 BD84 OUT 0x24,R24
00F3 9189 LD R24,Y+
00F4 BF8F OUT 0x3F,R24
00F5 9189 LD R24,Y+
00F6 9518 RETI
empy16s:
00F7 920A ST R0,-Y
00F8 921A ST R1,-Y
00F9 938A ST R24,-Y
00FA 939A ST R25,-Y
00FB 9F02 MUL R16,R18
00FC 01C0 MOVW R24,R0
00FD 9F12 MUL R17,R18
00FE 0D90 ADD R25,R0
00FF 9F03 MUL R16,R19
0100 0D90 ADD R25,R0
0101 018C MOVW R16,R24
0102 9199 LD R25,Y+
0103 9189 LD R24,Y+
0104 9019 LD R1,Y+
0105 9009 LD R0,Y+
0106 9508 RET
push_gset5:
0107 92FA ST R15,-Y
0108 92EA ST R14,-Y
push_gset4:
0109 92DA ST R13,-Y
010A 92CA ST R12,-Y
push_gset3:
010B 92BA ST R11,-Y
010C 92AA ST R10,-Y
push_gset2:
010D 937A ST R23,-Y
010E 936A ST R22,-Y
push_gset1:
010F 935A ST R21,-Y
0110 934A ST R20,-Y
0111 9508 RET
pop_gset1:
0112 E0E1 LDI R30,1
pop:
0113 9149 LD R20,Y+
0114 9159 LD R21,Y+
0115 FDE0 SBRC R30,0
0116 9508 RET
0117 9169 LD R22,Y+
0118 9179 LD R23,Y+
0119 FDE1 SBRC R30,1
011A 9508 RET
011B 90A9 LD R10,Y+
011C 90B9 LD R11,Y+
011D FDE2 SBRC R30,2
011E 9508 RET
011F 90C9 LD R12,Y+
0120 90D9 LD R13,Y+
0121 FDE3 SBRC R30,3
0122 9508 RET
0123 90E9 LD R14,Y+
0124 90F9 LD R15,Y+
0125 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -