stepper.asm


1
.include "m8def.inc"
2
3
.def A          = r16
4
.def B          = r17
5
.def Steptime1  = r19
6
.def Steptime2  = r20
7
.def Stepcount1 = r21
8
.def Stepcount2 = r22
9
10
.equ STEPSAVE1  = 100 ;Frequenz Motor schnell
11
.equ STEPSAVE2  = 200 ;Frequenz Motor langsam
12
13
.org 0x0000
14
rjmp Start
15
.org OVF2addr
16
rjmp ISR_Motor1
17
.org OVF0addr
18
rjmp ISR_Motor2
19
20
Start:
21
     ; Stack initialisieren
22
   ldi  A, HIGH(RAMEND)        
23
     out  SPH,A
24
     ldi  A, LOW(RAMEND)             
25
     out  SPL,A
26
 
27
     ; Ausgänge initialisieren
28
   ; Startwert: LOW
29
   ldi  A,0b11111111
30
     out  DDRD,A
31
   ldi  A,0b11111111
32
   out  DDRB,A
33
34
     ; Zeitvariablen setzen
35
     ldi Steptime1,STEPSAVE1 ;Frequenz Motor schnell
36
     ldi Steptime2,STEPSAVE2 ;Frequenz Motor langsam
37
38
     ; Motorvariablen (Anfangsschritt) setzen
39
     ldi StepCount1,1
40
     ldi StepCount2,1
41
42
     ; Timer aufsetzen
43
     ldi  A, (1<<CS01)
44
   out  TCCR0, A  ; Timer 0 Prescaler /8 alle 512 µs bei 4 MHz
45
   ldi  B, (1<<CS21)
46
   out  TCCR2, B  ; Timer 2 Prescaler /8 alle 512 µs bei 4 MHz
47
     ldi  A, (1<<TOIE0)|(1<<TOIE2) 
48
     out  TIMSK, A
49
   sei                               
50
Loop: 
51
     rjmp Loop
52
53
; 
54
; ISR für Motor #1
55
; (Timer 2 Overflow)
56
;
57
ISR_Motor1:  
58
   push A
59
   in   A,SREG
60
   push A
61
62
     dec  Steptime1 ; Softwarezähler == 0? 
63
   brne EndMotor1 ; Nein => ISR verlassen
64
65
M1Step1: 
66
     cpi  StepCount1,1
67
   brne M1Step2        
68
     inc  Stepcount1
69
   ldi  A,0b11000000
70
     rjmp SetMotor1
71
72
M1Step2: 
73
     cpi  StepCount1,2
74
   brne M1Step3
75
     inc  Stepcount1
76
   ldi  A,0b01100000
77
     rjmp SetMotor1
78
79
M1Step3: 
80
     cpi  StepCount1,3
81
   brne M1Step4
82
     inc  Stepcount1
83
   ldi  A,0b00110000
84
     rjmp SetMotor1
85
86
M1Step4: 
87
   ldi  Stepcount1,1
88
   ldi  A,0b10010000
89
     ; Durchfall
90
91
SetMotor1:
92
     out  PORTD,A             ;Schritt ausführen
93
     ldi  Steptime1,STEPSAVE1  ;Frequenz Motor schnell
94
95
EndMotor1:
96
   pop  A                     
97
   out  SREG,A
98
   pop  A                     
99
     reti
100
101
;
102
; ISR für Motor #2
103
; (Timer 0 Overflow)
104
;
105
ISR_Motor2:  
106
   push A
107
   in   A,SREG
108
   push A
109
110
     dec  Steptime2 ; Softwarezähler == 0? 
111
   brne EndMotor2 ; Nein => ISR verlassen
112
113
M2Step1: 
114
     cpi  StepCount2,1
115
   brne M2Step2        
116
     inc  Stepcount2
117
   ldi  A,0b11000000
118
     rjmp SetMotor2
119
120
M2Step2: 
121
     cpi  StepCount2,2
122
   brne M2Step3
123
     inc  Stepcount2
124
   ldi  A,0b01100000
125
     rjmp SetMotor2
126
127
M2Step3: 
128
     cpi  StepCount2,3
129
   brne M2Step4
130
     inc  Stepcount2
131
   ldi  A,0b00110000
132
     rjmp SetMotor2
133
134
M2Step4: 
135
   ldi  Stepcount2,1
136
   ldi  A,0b10010000
137
     ; Durchfall
138
139
SetMotor2:
140
     out  PORTB,A             ;Schritt ausführen
141
     ldi  Steptime2,STEPSAVE2 ;Frequenz Motor langsam
142
143
EndMotor2:
144
   pop  A                     
145
   out  SREG,A
146
   pop  A                     
147
     reti