📄 step.lst
字号:
__start:
__text_start:
0015 E5CF LDI R28,0x5F
0016 E0D2 LDI R29,2
0017 BFCD OUT 0x3D,R28
0018 BFDE OUT 0x3E,R29
0019 51C0 SUBI R28,0x10
001A 40D0 SBCI R29,0
001B EA0A LDI R16,0xAA
001C 8308 STD Y+0,R16
001D 2400 CLR R0
001E E6E7 LDI R30,0x67
001F E0F0 LDI R31,0
0020 E010 LDI R17,0
0021 36E7 CPI R30,0x67
0022 07F1 CPC R31,R17
0023 F011 BEQ 0x0026
0024 9201 ST R0,Z+
0025 CFFB RJMP 0x0021
0026 8300 STD Z+0,R16
0027 E2E2 LDI R30,0x22
0028 E0F0 LDI R31,0
0029 E6A0 LDI R26,0x60
002A E0B0 LDI R27,0
002B E010 LDI R17,0
002C 32E9 CPI R30,0x29
002D 07F1 CPC R31,R17
002E F021 BEQ 0x0033
002F 95C8 LPM
0030 9631 ADIW R30,1
0031 920D ST R0,X+
0032 CFF9 RJMP 0x002C
0033 D0E0 RCALL _main
_exit:
0034 CFFF RJMP _exit
FILE: F:\单片机教学\调试程序\stepmotor\step.c
(0001) //Designed by Buaa Alf
(0002) //通过定时器实现了步进电机的运转,仅仅是一演示程序;
(0003) //烧写程序后,断开电源开关,闭合SW9的1、2、3、4和7、8管角,然后闭合电源开关即可看到电机的运转一周。
(0004) //按复位可以重起单片机,使电机再旋转一周;
(0005) //可参考设计自己的电机控制程序。
(0006)
(0007) //ICC-AVR application builder : 2005-3-31 上午 11:35:43
(0008) // Target : M8
(0009) // Crystal: 11.059Mhz
(0010)
(0011) #include <iom8v.h>
(0012) #include <macros.h>
(0013)
(0014) #define aon PORTB =0x01
(0015) #define bon PORTB =0x02
(0016) #define con PORTB =0x04
(0017) #define don PORTB =0x08
(0018)
(0019) #define abon PORTB =0x03
(0020) #define bcon PORTB =0x06
(0021) #define cdon PORTB =0x0C
(0022) #define daon PORTB =0x09
(0023)
(0024) unsigned int Pnum=4160;//总脉冲个数,包含减速比
(0025) char Freq=50;//脉冲频率
(0026)
(0027) unsigned int pcont=0;
(0028) char step =0;
(0029) char dirc=0;
(0030)
(0031) void port_init(void)
(0032) {
(0033) PORTB = 0xFF;
_port_init:
0035 EF8F LDI R24,0xFF
0036 BB88 OUT 0x18,R24
(0034) DDRB = 0x0F;
0037 E08F LDI R24,0xF
0038 BB87 OUT 0x17,R24
(0035) PORTC = 0x7F; //m103 output only
0039 E78F LDI R24,0x7F
003A BB85 OUT 0x15,R24
(0036) DDRC = 0x00;
003B 2422 CLR R2
003C BA24 OUT 0x14,R2
(0037) PORTD = 0xFF;
003D EF8F LDI R24,0xFF
003E BB82 OUT 0x12,R24
(0038) DDRD = 0x00;
003F BA21 OUT 0x11,R2
(0039) }
0040 9508 RET
(0040)
(0041) //TIMER1 initialisation - prescale:8
(0042) // WGM: 0) Normal, TOP=0xFFFF
(0043) // desired value: 50Hz
(0044) // actual value: 50.001Hz (0.0%)
(0045) void timer1_init(void)
(0046) {
(0047) TCCR1B = 0x00; //stop
_timer1_init:
0041 2422 CLR R2
0042 BC2E OUT 0x2E,R2
(0048) TCNT1H = 0x90; //setup
0043 E980 LDI R24,0x90
0044 BD8D OUT 0x2D,R24
(0049) TCNT1L = 0xF0;
0045 EF80 LDI R24,0xF0
0046 BD8C OUT 0x2C,R24
(0050) OCR1AH = 0x6B;
0047 E68B LDI R24,0x6B
0048 BD8B OUT 0x2B,R24
(0051) OCR1AL = 0xFF;
0049 EF8F LDI R24,0xFF
004A BD8A OUT 0x2A,R24
(0052) OCR1BH = 0x6B;
004B E68B LDI R24,0x6B
004C BD89 OUT 0x29,R24
(0053) OCR1BL = 0xFF;
004D EF8F LDI R24,0xFF
004E BD88 OUT 0x28,R24
(0054) ICR1H = 0x6B;
004F E68B LDI R24,0x6B
0050 BD87 OUT 0x27,R24
(0055) ICR1L = 0xFF;
0051 EF8F LDI R24,0xFF
0052 BD86 OUT 0x26,R24
(0056) TCCR1A = 0x00;
0053 BC2F OUT 0x2F,R2
(0057) TCCR1B = 0x02; //start Timer
0054 E082 LDI R24,2
0055 BD8E OUT 0x2E,R24
(0058) }
0056 9508 RET
_timer1_ovf_isr:
0057 922A ST R2,-Y
0058 923A ST R3,-Y
0059 924A ST R4,-Y
005A 925A ST R5,-Y
005B 938A ST R24,-Y
005C 939A ST R25,-Y
005D B62F IN R2,0x3F
005E 922A ST R2,-Y
(0059)
(0060) #pragma interrupt_handler timer1_ovf_isr:9
(0061) void timer1_ovf_isr(void)
(0062) {
(0063) //TIMER1 has overflowed
(0064) if(pcont <=Pnum)
005F 90200060 LDS R2,0x60
0061 90300061 LDS R3,0x61
0063 90400063 LDS R4,0x63
0065 90500064 LDS R5,0x64
0067 1424 CP R2,R4
0068 0435 CPC R3,R5
0069 F408 BCC 0x006B
006A C087 RJMP 0x00F2
(0065) {
(0066) if(dirc == 0)
006B 90200066 LDS R2,0x66
006D 2022 TST R2
006E F5A1 BNE 0x00A3
(0067) { if(step == 0)
006F 90200065 LDS R2,0x65
0071 2022 TST R2
0072 F419 BNE 0x0076
(0068) aon;
0073 E081 LDI R24,1
0074 BB88 OUT 0x18,R24
0075 C060 RJMP 0x00D6
(0069) else if(step == 1)
0076 91800065 LDS R24,0x65
0078 3081 CPI R24,1
0079 F419 BNE 0x007D
(0070) abon;
007A E083 LDI R24,3
007B BB88 OUT 0x18,R24
007C C059 RJMP 0x00D6
(0071) else if(step == 2)
007D 91800065 LDS R24,0x65
007F 3082 CPI R24,2
0080 F419 BNE 0x0084
(0072) bon;
0081 E082 LDI R24,2
0082 BB88 OUT 0x18,R24
0083 C052 RJMP 0x00D6
(0073) else if(step == 3)
0084 91800065 LDS R24,0x65
0086 3083 CPI R24,3
0087 F419 BNE 0x008B
(0074) bcon;
0088 E086 LDI R24,6
0089 BB88 OUT 0x18,R24
008A C04B RJMP 0x00D6
(0075) else if(step == 4)
008B 91800065 LDS R24,0x65
008D 3084 CPI R24,4
008E F419 BNE 0x0092
(0076) con;
008F E084 LDI R24,4
0090 BB88 OUT 0x18,R24
0091 C044 RJMP 0x00D6
(0077) else if(step == 5)
0092 91800065 LDS R24,0x65
0094 3085 CPI R24,5
0095 F419 BNE 0x0099
(0078) cdon;
0096 E08C LDI R24,0xC
0097 BB88 OUT 0x18,R24
0098 C03D RJMP 0x00D6
(0079) else if(step == 6)
0099 91800065 LDS R24,0x65
009B 3086 CPI R24,6
009C F419 BNE 0x00A0
(0080) don;
009D E088 LDI R24,0x8
009E BB88 OUT 0x18,R24
009F C036 RJMP 0x00D6
(0081) else
(0082) daon;
00A0 E089 LDI R24,0x9
00A1 BB88 OUT 0x18,R24
(0083) }
00A2 C033 RJMP 0x00D6
(0084) else
(0085) {
(0086) if(step == 0)
00A3 90200065 LDS R2,0x65
00A5 2022 TST R2
00A6 F419 BNE 0x00AA
(0087) aon;
00A7 E081 LDI R24,1
00A8 BB88 OUT 0x18,R24
00A9 C02C RJMP 0x00D6
(0088) else if(step == 1)
00AA 91800065 LDS R24,0x65
00AC 3081 CPI R24,1
00AD F419 BNE 0x00B1
(0089) daon;
00AE E089 LDI R24,0x9
00AF BB88 OUT 0x18,R24
00B0 C025 RJMP 0x00D6
(0090) else if(step == 2)
00B1 91800065 LDS R24,0x65
00B3 3082 CPI R24,2
00B4 F419 BNE 0x00B8
(0091) don;
00B5 E088 LDI R24,0x8
00B6 BB88 OUT 0x18,R24
00B7 C01E RJMP 0x00D6
(0092) else if(step == 3)
00B8 91800065 LDS R24,0x65
00BA 3083 CPI R24,3
00BB F419 BNE 0x00BF
(0093) cdon;
00BC E08C LDI R24,0xC
00BD BB88 OUT 0x18,R24
00BE C017 RJMP 0x00D6
(0094) else if(step == 4)
00BF 91800065 LDS R24,0x65
00C1 3084 CPI R24,4
00C2 F419 BNE 0x00C6
(0095) con;
00C3 E084 LDI R24,4
00C4 BB88 OUT 0x18,R24
00C5 C010 RJMP 0x00D6
(0096) else if(step == 5)
00C6 91800065 LDS R24,0x65
00C8 3085 CPI R24,5
00C9 F419 BNE 0x00CD
(0097) bcon;
00CA E086 LDI R24,6
00CB BB88 OUT 0x18,R24
00CC C009 RJMP 0x00D6
(0098) else if(step == 6)
00CD 91800065 LDS R24,0x65
00CF 3086 CPI R24,6
00D0 F419 BNE 0x00D4
(0099) bon;
00D1 E082 LDI R24,2
00D2 BB88 OUT 0x18,R24
00D3 C002 RJMP 0x00D6
(0100) else
(0101) abon;
00D4 E083 LDI R24,3
00D5 BB88 OUT 0x18,R24
(0102) }
(0103) step ++;
00D6 91800065 LDS R24,0x65
00D8 5F8F SUBI R24,0xFF
00D9 93800065 STS 0x65,R24
(0104) if(step>=8) step =0;
00DB 3088 CPI R24,0x8
00DC F018 BCS 0x00E0
00DD 2422 CLR R2
00DE 92200065 STS 0x65,R2
(0105)
(0106) TCNT1H = 0xE0; //reload counter high value更改速度
00E0 EE80 LDI R24,0xE0
00E1 BD8D OUT 0x2D,R24
(0107) TCNT1L = 0x01; //reload counter low value
00E2 E081 LDI R24,1
00E3 BD8C OUT 0x2C,R24
(0108) TCCR1A = 0x00;
00E4 2422 CLR R2
00E5 BC2F OUT 0x2F,R2
(0109) TCCR1B = 0x02; //start Timer
00E6 E082 LDI R24,2
00E7 BD8E OUT 0x2E,R24
(0110)
(0111) pcont++;
00E8 91800063 LDS R24,0x63
00EA 91900064 LDS R25,0x64
00EC 9601 ADIW R24,1
00ED 93900064 STS 0x64,R25
00EF 93800063 STS 0x63,R24
(0112) }
00F1 C002 RJMP 0x00F4
(0113) else
(0114) TCCR1B = 0x00;
00F2 2422 CLR R2
00F3 BC2E OUT 0x2E,R2
(0115) }
00F4 9029 LD R2,Y+
00F5 BE2F OUT 0x3F,R2
00F6 9199 LD R25,Y+
00F7 9189 LD R24,Y+
00F8 9059 LD R5,Y+
00F9 9049 LD R4,Y+
00FA 9039 LD R3,Y+
00FB 9029 LD R2,Y+
00FC 9518 RETI
(0116)
(0117) //UART0 initialisation
(0118) // desired baud rate: 9600
(0119) // actual: baud rate:9600 (0.0%)
(0120) // char size: 8 bit
(0121) // parity: Disabled
(0122) void uart0_init(void)
(0123) {
(0124) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
00FD 2422 CLR R2
00FE B82A OUT 0x0A,R2
(0125) UCSRA = 0x00;
00FF B82B OUT 0x0B,R2
(0126) UCSRC = 0x86;
0100 E886 LDI R24,0x86
0101 BD80 OUT 0x20,R24
(0127) UBRRL = 0x47; //set baud rate lo
0102 E487 LDI R24,0x47
0103 B989 OUT 0x09,R24
(0128) UBRRH = 0x00; //set baud rate hi
0104 BC20 OUT 0x20,R2
(0129) UCSRB = 0x98;
0105 E988 LDI R24,0x98
0106 B98A OUT 0x0A,R24
(0130) }
0107 9508 RET
(0131)
(0132) #pragma interrupt_handler uart0_rx_isr:12
(0133) void uart0_rx_isr(void)
(0134) {
(0135) //uart has received a character in UDR
(0136) }
_uart0_rx_isr:
0108 9518 RETI
(0137)
(0138) //call this routine to initialise all peripherals
(0139) void init_devices(void)
(0140) {
(0141) //stop errant interrupts until set up
(0142) CLI(); //disable all interrupts
_init_devices:
0109 94F8 BCLR 7
(0143) port_init();
010A DF2A RCALL _port_init
(0144) timer1_init();
010B DF35 RCALL _timer1_init
(0145) uart0_init();
010C DFF0 RCALL _uart0_init
(0146)
(0147) MCUCR = 0x00;
010D 2422 CLR R2
010E BE25 OUT 0x35,R2
(0148) GICR = 0x00;
010F BE2B OUT 0x3B,R2
(0149) TIMSK = 0x04; //timer interrupt sources
0110 E084 LDI R24,4
0111 BF89 OUT 0x39,R24
(0150) SEI(); //re-enable interrupts
0112 9478 BSET 7
(0151) //all peripherals are now initialised
(0152) }
0113 9508 RET
(0153)
(0154) //
(0155) void main(void)
(0156) {
(0157) init_devices();
_main:
0114 DFF4 RCALL _init_devices
(0158) //insert your functional code here...
(0159) while(1);
0115 CFFF RJMP 0x0115
(0160) }
FILE: <library>
0116 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -