📄 step.s
字号:
.module step.c
.area data(ram, con, rel)
_Pnum::
.blkb 2
.area idata
.word 4160
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\stepmotor\step.c
.dbsym e Pnum _Pnum i
_Freq::
.blkb 1
.area idata
.byte 50
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\stepmotor\step.c
.dbsym e Freq _Freq c
_pcont::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\stepmotor\step.c
.dbsym e pcont _pcont i
_step::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\stepmotor\step.c
.dbsym e step _step c
_dirc::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\单片机教学\调试程序\stepmotor\step.c
.dbsym e dirc _dirc c
.area text(rom, con, rel)
.dbfile F:\单片机教学\调试程序\stepmotor\step.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 32
; //Designed by Buaa Alf
; //通过定时器实现了步进电机的运转,仅仅是一演示程序;
; //烧写程序后,断开电源开关,闭合SW9的1、2、3、4和7、8管角,然后闭合电源开关即可看到电机的运转一周。
; //按复位可以重起单片机,使电机再旋转一周;
; //可参考设计自己的电机控制程序。
;
; //ICC-AVR application builder : 2005-3-31 上午 11:35:43
; // Target : M8
; // Crystal: 11.059Mhz
;
; #include <iom8v.h>
; #include <macros.h>
;
; #define aon PORTB =0x01
; #define bon PORTB =0x02
; #define con PORTB =0x04
; #define don PORTB =0x08
;
; #define abon PORTB =0x03
; #define bcon PORTB =0x06
; #define cdon PORTB =0x0C
; #define daon PORTB =0x09
;
; unsigned int Pnum=4160;//总脉冲个数,包含减速比
; char Freq=50;//脉冲频率
;
; unsigned int pcont=0;
; char step =0;
; char dirc=0;
;
; void port_init(void)
; {
.dbline 33
; PORTB = 0xFF;
ldi R24,255
out 0x18,R24
.dbline 34
; DDRB = 0x0F;
ldi R24,15
out 0x17,R24
.dbline 35
; PORTC = 0x7F; //m103 output only
ldi R24,127
out 0x15,R24
.dbline 36
; DDRC = 0x00;
clr R2
out 0x14,R2
.dbline 37
; PORTD = 0xFF;
ldi R24,255
out 0x12,R24
.dbline 38
; DDRD = 0x00;
out 0x11,R2
.dbline -2
.dbline 39
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 46
;
; //TIMER1 initialisation - prescale:8
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 50Hz
; // actual value: 50.001Hz (0.0%)
; void timer1_init(void)
; {
.dbline 47
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 48
; TCNT1H = 0x90; //setup
ldi R24,144
out 0x2d,R24
.dbline 49
; TCNT1L = 0xF0;
ldi R24,240
out 0x2c,R24
.dbline 50
; OCR1AH = 0x6B;
ldi R24,107
out 0x2b,R24
.dbline 51
; OCR1AL = 0xFF;
ldi R24,255
out 0x2a,R24
.dbline 52
; OCR1BH = 0x6B;
ldi R24,107
out 0x29,R24
.dbline 53
; OCR1BL = 0xFF;
ldi R24,255
out 0x28,R24
.dbline 54
; ICR1H = 0x6B;
ldi R24,107
out 0x27,R24
.dbline 55
; ICR1L = 0xFF;
ldi R24,255
out 0x26,R24
.dbline 56
; TCCR1A = 0x00;
out 0x2f,R2
.dbline 57
; TCCR1B = 0x02; //start Timer
ldi R24,2
out 0x2e,R24
.dbline -2
.dbline 58
; }
L2:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 16
rjmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile F:\单片机教学\调试程序\stepmotor\step.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.even
_timer1_ovf_isr::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 62
;
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void)
; {
.dbline 64
; //TIMER1 has overflowed
; if(pcont <=Pnum)
lds R2,_Pnum
lds R3,_Pnum+1
lds R4,_pcont
lds R5,_pcont+1
cp R2,R4
cpc R3,R5
brsh X0
rjmp L4
X0:
.dbline 65
; {
.dbline 66
; if(dirc == 0)
lds R2,_dirc
tst R2
brne L6
.dbline 67
; { if(step == 0)
.dbline 67
lds R2,_step
tst R2
brne L8
.dbline 68
; aon;
ldi R24,1
out 0x18,R24
rjmp L7
L8:
.dbline 69
; else if(step == 1)
lds R24,_step
cpi R24,1
brne L10
.dbline 70
; abon;
ldi R24,3
out 0x18,R24
rjmp L7
L10:
.dbline 71
; else if(step == 2)
lds R24,_step
cpi R24,2
brne L12
.dbline 72
; bon;
ldi R24,2
out 0x18,R24
rjmp L7
L12:
.dbline 73
; else if(step == 3)
lds R24,_step
cpi R24,3
brne L14
.dbline 74
; bcon;
ldi R24,6
out 0x18,R24
rjmp L7
L14:
.dbline 75
; else if(step == 4)
lds R24,_step
cpi R24,4
brne L16
.dbline 76
; con;
ldi R24,4
out 0x18,R24
rjmp L7
L16:
.dbline 77
; else if(step == 5)
lds R24,_step
cpi R24,5
brne L18
.dbline 78
; cdon;
ldi R24,12
out 0x18,R24
rjmp L7
L18:
.dbline 79
; else if(step == 6)
lds R24,_step
cpi R24,6
brne L20
.dbline 80
; don;
ldi R24,8
out 0x18,R24
rjmp L7
L20:
.dbline 82
; else
; daon;
ldi R24,9
out 0x18,R24
.dbline 83
; }
rjmp L7
L6:
.dbline 85
; else
; {
.dbline 86
; if(step == 0)
lds R2,_step
tst R2
brne L22
.dbline 87
; aon;
ldi R24,1
out 0x18,R24
rjmp L23
L22:
.dbline 88
; else if(step == 1)
lds R24,_step
cpi R24,1
brne L24
.dbline 89
; daon;
ldi R24,9
out 0x18,R24
rjmp L25
L24:
.dbline 90
; else if(step == 2)
lds R24,_step
cpi R24,2
brne L26
.dbline 91
; don;
ldi R24,8
out 0x18,R24
rjmp L27
L26:
.dbline 92
; else if(step == 3)
lds R24,_step
cpi R24,3
brne L28
.dbline 93
; cdon;
ldi R24,12
out 0x18,R24
rjmp L29
L28:
.dbline 94
; else if(step == 4)
lds R24,_step
cpi R24,4
brne L30
.dbline 95
; con;
ldi R24,4
out 0x18,R24
rjmp L31
L30:
.dbline 96
; else if(step == 5)
lds R24,_step
cpi R24,5
brne L32
.dbline 97
; bcon;
ldi R24,6
out 0x18,R24
rjmp L33
L32:
.dbline 98
; else if(step == 6)
lds R24,_step
cpi R24,6
brne L34
.dbline 99
; bon;
ldi R24,2
out 0x18,R24
rjmp L35
L34:
.dbline 101
; else
; abon;
ldi R24,3
out 0x18,R24
L35:
L33:
L31:
L29:
L27:
L25:
L23:
.dbline 102
; }
L7:
.dbline 103
; step ++;
lds R24,_step
subi R24,255 ; addi 1
sts _step,R24
.dbline 104
; if(step>=8) step =0;
cpi R24,8
brlo L36
.dbline 104
clr R2
sts _step,R2
L36:
.dbline 106
;
; TCNT1H = 0xE0; //reload counter high value更改速度
ldi R24,224
out 0x2d,R24
.dbline 107
; TCNT1L = 0x01; //reload counter low value
ldi R24,1
out 0x2c,R24
.dbline 108
; TCCR1A = 0x00;
clr R2
out 0x2f,R2
.dbline 109
; TCCR1B = 0x02; //start Timer
ldi R24,2
out 0x2e,R24
.dbline 111
;
; pcont++;
lds R24,_pcont
lds R25,_pcont+1
adiw R24,1
sts _pcont+1,R25
sts _pcont,R24
.dbline 112
; }
rjmp L5
L4:
.dbline 114
clr R2
out 0x2e,R2
L5:
.dbline -2
.dbline 115
; else
; TCCR1B = 0x00;
; }
L3:
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 123
;
; //UART0 initialisation
; // desired baud rate: 9600
; // actual: baud rate:9600 (0.0%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
.dbline 124
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 125
; UCSRA = 0x00;
out 0xb,R2
.dbline 126
; UCSRC = 0x86;
ldi R24,134
out 0x20,R24
.dbline 127
; UBRRL = 0x47; //set baud rate lo
ldi R24,71
out 0x9,R24
.dbline 128
; UBRRH = 0x00; //set baud rate hi
out 0x20,R2
.dbline 129
; UCSRB = 0x98;
ldi R24,152
out 0xa,R24
.dbline -2
.dbline 130
; }
L38:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 22
rjmp _uart0_rx_isr
.area text(rom, con, rel)
.dbfile F:\单片机教学\调试程序\stepmotor\step.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
.even
_uart0_rx_isr::
.dbline -1
.dbline 134
;
; #pragma interrupt_handler uart0_rx_isr:12
; void uart0_rx_isr(void)
; {
.dbline -2
.dbline 136
; //uart has received a character in UDR
; }
L39:
.dbline 0 ; func end
reti
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 140
;
; //call this routine to initialise all peripherals
; void init_devices(void)
; {
.dbline 142
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 143
; port_init();
rcall _port_init
.dbline 144
; timer1_init();
rcall _timer1_init
.dbline 145
; uart0_init();
rcall _uart0_init
.dbline 147
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 148
; GICR = 0x00;
out 0x3b,R2
.dbline 149
; TIMSK = 0x04; //timer interrupt sources
ldi R24,4
out 0x39,R24
.dbline 150
; SEI(); //re-enable interrupts
sei
.dbline -2
.dbline 152
; //all peripherals are now initialised
; }
L40:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 156
;
; //
; void main(void)
; {
.dbline 157
; init_devices();
rcall _init_devices
L42:
.dbline 159
L43:
.dbline 159
rjmp L42
X1:
.dbline -2
.dbline 160
; //insert your functional code here...
; while(1);
; }
L41:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -