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
|
|