test_motort.asm


1
.include "m328Pdef.inc"
2
3
4
.CSEG
5
.def temp = r16
6
.def temp2 = r17
7
.def temp3 = r18
8
.def temp4 = r19
9
.def micros_lsb = r20          //micros beinhaltet die vergangenen microsekudnen *10 um mehr spielraum zwischen den interrupts zu bekommen
10
.def micros_msb = r21  
11
12
.equ extruderddr = ddrb
13
.equ extruderpin = PB1
14
.equ extruderport = portb
15
.equ debug_mode = 1            // Wenn 1 werden alle SRAM Adressen mit smulationsfreundlichen werten vorbelegt
16
.def flags = r22
17
.equ update = 0b00000001
18
19
20
.org 0x0000
21
  rjmp main
22
23
.org 0x0016 
24
  rjmp TIMER0_COMPA
25
//Ein Timer 
26
27
// Die jeweiligen Werte die für ein event nötig sind werden im sram gespeichert
28
//Die kontrolle der taktzeiten findet nur stadt wenn ein interrupt des timers aktiv war und das flag im flags register gesetzt ist
29
// Die berechnung soll nur durchgeführt werden wenn sich die solldrehzahl geändert hat
30
31
//*nicht umgesetzte und getestet ideen:
32
33
34
35
.org 0x0042
36
main:
37
38
         ldi temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse
39
         out SPH, temp
40
         ldi temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse
41
         out SPL, temp
42
     ldi temp, 1
43
     mov r2, temp
44
     clr r3
45
     nop
46
     rjmp setup
47
48
49
    
50
    rjmp main
51
52
debugging:
53
push temp
54
ldi temp, 0x02
55
sts soll_RPM_extruder, temp
56
pop temp
57
call extruderpuls
58
rjmp loop
59
60
61
setup:
62
timer_setup:
63
ldi temp, 160
64
sts OCR1AL, temp
65
ldi temp, 0x09
66
sts TCCR1B, temp
67
ldi temp, 0x02
68
sts TIMSK1, temp
69
sei
70
71
ldi temp, debug_mode
72
cpi temp, 1
73
breq debugging
74
call extruderpuls
75
rjmp loop
76
77
78
79
///////////////////////////////////////////////////////Hauptschleife////////////////////////////////////////////
80
loop:
81
82
call check_timings
83
rjmp loop
84
85
86
87
check_timings:
88
89
push temp                    //temp sichern
90
push temp2                    //temp2 sichern
91
92
mov temp, flags                  //flagregister laden
93
sbrs temp, 0                  //wenn bit 0 gesetzt ist, trat ein interrupt auf und die micros wurden aktuallisiert
94
rjmp skipped_all
95
cbr flags, update
96
//Extrudermotor        
97
lds temp, extrudermotor_MSB            //msb aus RAM laden
98
cp temp, micros_MSB              //und mit micros msb vergleichen
99
brne skipped_EX                  //wenn MSB nicht gleich ist ->abbruch
100
lds temp, extrudermotor_LSB            //LSB laden
101
cp temp, micros_LSB              //mit micros vergleichen
102
brne skipped_ex
103
104
lds temp, extrudermotor_LSB            //LSB laden
105
cp temp, micros_LSB              //mit micros vergleichen
106
breq extruderpuls_true
107
rjmp skipped_ex
108
extruderpuls_true:
109
rcall extruderpuls
110
111
skipped_ex:                  //vergleich von Extruder nicht Wahr oder puls bereits ausgeführt
112
113
114
//hier der nächste Motor
115
116
117
skipped_all:
118
119
pop temp2
120
pop temp
121
122
123
ret
124
125
/////////////////////////////////////////////MOTORIMPULSE UND AKTUALISIERUNG//////////////////////////////
126
extruderpuls:
127
////////////////////////////////////////////IMPULSERZEUGUNG
128
sbi extruderddr, extruderpin
129
sbi extruderport,extruderpin
130
push temp
131
ldi temp, 3
132
bla1:
133
dec temp                        //mindestimpuls 1 microsekunde also 16 takte
134
cpi temp, 0
135
brne bla1
136
cbi extruderport, extruderpin
137
rcall extruder_time_calculation
138
139
////////////////////////////////////////////UPDATE
140
141
//Extruderwert mit den werten aus dem ram aktuallisieren und addieren
142
143
lds temp, extrudermotor_LSB      //LSB in temp 1 lesen
144
lds temp2,extrudermotor_LSB_soll  //LSB des Sollwertes
145
lds temp3, extrudermotor_MSB
146
lds temp4, extrudermotor_MSB_soll
147
148
149
add temp, temp2            //addition des LSB 
150
adc temp3, temp4
151
sts extrudermotor_LSB, temp      //neuen Wert speichern
152
sts extrudermotor_MSB, temp3
153
154
pop temp
155
ret
156
157
158
159
extruder_time_calculation:
160
//////////////////////////////////////////Anhand der Drehzahl die Zeit als faktor von 10 micors berechnen
161
162
163
//Nur ausführen wenn Flag 2 in flags gesetzt ist (update_request_extruder)
164
//Es ergibt sich folgende formel 100000/(RPM/60*STEPPS)
165
166
//Bei 1 RPM un d 200 steps auflösung ergibt sich ein wert von 30.000
167
//Bei 100 RPM ergibt sich ein wert von 300
168
//bei 60 RPM ein Wert von 500
169
170
//Dar der Extruder ein Getribemotor 1:5 ist
171
//ergibt sich (100.000/(RPM/60x1000)
172
//somit für 60 RPM ein Wert von 100
173
//für 1 RPM ein Wert von 6000
174
//für 100RPM ein Wert von 60
175
176
177
//Idee wurde verworfen
178
//Daten sind im EEPROM gespeichert
179
//Adresse 1 enstpsricht 1 RPM und aufwärts
180
181
.equ minimum = 1
182
.equ maximum = 4
183
184
push temp
185
push temp2
186
push temp3
187
push temp4
188
189
  lds r16, soll_RPM_extruder
190
    subi    r16,minimum                 ; Nullpunkt verschieben
191
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen
192
    brsh    kein_Treffer                ; Index zu gross -> Fehler
193
    ldi     ZL,low(Sprungtabelle)       ; Tabellenzeiger laden, 16 Bit
194
    ldi     ZH,high(Sprungtabelle)
195
    add     ZL,r16                      ; Index addieren, 16 Bit
196
    ldi     r16,0                   
197
    adc     ZH,r16
198
    ijmp                                ; indirekter Sprung in Sprungtabelle
199
200
  kein_treffer:
201
202
    rjmp    fertig
203
204
Sprungtabelle:
205
    rjmp    Ex1RPM
206
    rjmp    Ex2RPM                  ///HIER MUSS FÜR DIE HÖHEREN DREHZAHLEN NOCH DIE SPRUNGTABELLE ERGÄNZT WERDEN!!!!!!!!!!!!!!
207
    rjmp    Ex3RPM
208
    rjmp    Ex4RPM
209
    rjmp    Ex5RPM
210
    rjmp    Ex6RPM
211
    rjmp    Ex7RPM
212
    rjmp    Ex8RPM
213
    rjmp    Ex9RPM
214
    rjmp    Ex10RPM
215
Ex1RPM:
216
ldi temp, 0x70
217
sts extrudermotor_LSB_soll, temp
218
ldi temp, 0x17
219
sts extrudermotor_MSB_soll, temp
220
rjmp fertig
221
222
223
Ex2RPM:
224
ldi temp, 0xB8
225
sts extrudermotor_LSB_soll, temp
226
ldi temp, 0x0B
227
sts extrudermotor_MSB_soll, temp
228
229
rjmp fertig
230
231
232
Ex3RPM:
233
ldi temp, 0xD0
234
sts extrudermotor_LSB_soll, temp
235
ldi temp, 0x07
236
sts extrudermotor_MSB_soll, temp
237
rjmp fertig
238
239
240
Ex4RPM:
241
ldi temp, 0xDC
242
sts extrudermotor_LSB_soll, temp
243
ldi temp, 0x05
244
sts extrudermotor_MSB_soll, temp
245
rjmp fertig
246
247
Ex5RPM:
248
ldi temp, 0xB0
249
sts extrudermotor_LSB_soll, temp
250
ldi temp, 0x04
251
sts extrudermotor_MSB_soll, temp
252
rjmp fertig
253
254
Ex6RPM:
255
ldi temp, 0xE8
256
sts extrudermotor_LSB_soll, temp
257
ldi temp, 0x03
258
sts extrudermotor_MSB_soll, temp
259
rjmp fertig
260
261
Ex7RPM:
262
ldi temp, 0x58
263
sts extrudermotor_LSB_soll, temp
264
ldi temp, 0x03
265
sts extrudermotor_MSB_soll, temp
266
rjmp fertig
267
268
Ex8RPM:
269
ldi temp, 0xEE
270
sts extrudermotor_LSB_soll, temp
271
ldi temp, 0x02
272
sts extrudermotor_MSB_soll, temp
273
rjmp fertig
274
275
Ex9RPM:
276
ldi temp, 0x9A
277
sts extrudermotor_LSB_soll, temp
278
ldi temp, 0x02
279
sts extrudermotor_MSB_soll, temp
280
rjmp fertig
281
282
Ex10RPM:
283
ldi temp, 0xEE
284
sts extrudermotor_LSB_soll, temp
285
ldi temp, 0x58
286
sts extrudermotor_MSB_soll, temp
287
rjmp fertig
288
289
290
291
292
293
fertig:
294
pop temp4
295
pop temp3
296
pop temp2
297
pop temp
298
ret
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
//////////////////////////////////////////////////Interruptroutinen///////////////////////////////////////////
351
TIMER0_COMPA:
352
push temp
353
in temp, SREG
354
push temp
355
ldi temp, 1
356
add micros_lsb, r2
357
adc micros_msb, r3
358
ldi temp, 160                  //160 Takte ohne prescaler bei 16 mhz ergibt einen eine auflösung von 10 micros
359
sts OCR1AL, temp                //OCRA1H bleibt null dar Timer 1 ein 16biit timer ist, allerdings nur bis 160 im CTC Mode gezählt wird
360
sbr flags, update                //Zähler wurde aktuallisiert, also Flag setzen um im loop die motoren mit dem neuen Wert zu vegleichen
361
pop temp
362
out SREG, temp
363
pop temp
364
reti
365
366
367
368
369
370
//Die RAM Adressen
371
.DSEG                ; Umschalten auf das SRAM Datensegment
372
debbuging:            .BYTE  1
373
extrudermotor_LSB:       .BYTE  1        //Zeitpunkt des nächsten events
374
extrudermotor_MSB:        .BYTE  1
375
376
extrudermotor_LSB_soll:     .BYTE  1        //Zeitdifferenz anhand der Drehzahl
377
extrudermotor_MSB_soll:     .BYTE  1
378
379
soll_RPM_extruder:   .BYTE  1
380
381
382
383
.ESEG
384
385
ex1MSB:    .db 0x17
386
ex1LSB:    .db 0x70      //6000      also 60.000 micros
387
ex2MSB:    .db 0x0B
388
ex2LSB:    .db 0xB8      //3000
389
ex3MSB:    .db 0x07
390
ex3LSB:    .db 0xD0      //2000
391
ex4MSB:    .db 0x05
392
ex4LSB:    .db 0xDC      //1500
393
394
ex5MSB:  .db  0x04
395
ex5LSB:  .db  0xB0      //1200
396
397
ex6MSB:  .db  0x03
398
ex6LSB:  .db  0xE8      //1000
399
400
ex7MSB:  .db  0x03
401
ex7LSB:  .db  0x58      //856
402
403
ex8MSB:  .db  0x02
404
ex8LSB:  .db  0xEE      //750
405
406
ex9MSB:  .db  0x02
407
ex9LSB:  .db  0x9A      //666
408
409
ex10MSB:.db  0x02
410
ex10LSB:.db  0x58      //600
411
412
ex11MSB:.db  0x02
413
ex11LSB:.db  0x21      //545
414
415
ex12MSB:.db  0x01
416
ex12LSB:.db  0xF4      //500
417
418
ex13MSB:.db  0x01
419
ex13LSB:.db  0xCC      //460
420
421
ex14MSB:.db  0x01
422
ex14LSB:.db  0xAD      //429
423
424
ex15MSB:.db  0x01
425
ex15LSB:.db  0x90      //400
426
427
ex16MSB:.db  0x01
428
ex16LSB:.db  0x77      //375
429
430
ex17MSB:.db  0x01
431
ex17LSB:.db  0x60      //352
432
433
ex18MSB:.db  0x01
434
ex18LSB:.db  0x4D      //333
435
436
ex19MSB:.db  0x01
437
ex19LSB:.db  0x3B      //315
438
ex20MSB:.db  0x01
439
ex20LSB:.db  0x2C      //300
440
441
ex21MSB:.db  0x01
442
ex21LSB:.db  0x1E      //286
443
444
ex22MSB:.db  0x01
445
ex22LSB:.db  0x10      //272
446
447
ex23MSB:.db  0x01
448
ex23LSB:.db  0x04      //260
449
450
ex24MSB:.db  0x00
451
ex24LSB:.db  0xFA      //250
452
453
ex25MSB:.db  0x00
454
ex25LSB:.db  0xF0      //240