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            //Bit 0=interrupt vorgefallen->micros verlgeichen Bit 1=Solldrehzahl verändert
17
.equ update = 0b00000001
18
.equ ex_rpm_change = 0b00000010
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, 0x0D
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
sbr flags, ex_rpm_change      //Erstmaliges Laden der Sollwerte auslösen
74
breq debugging
75
call extruderpuls
76
rjmp loop
77
78
79
80
///////////////////////////////////////////////////////Hauptschleife////////////////////////////////////////////
81
loop:
82
83
call check_timings
84
rjmp loop
85
86
87
88
check_timings:
89
90
push temp                    //temp sichern
91
push temp2                    //temp2 sichern
92
93
sbrs flags, update                  //wenn bit 1 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
cp temp, micros_LSB              //mit micros vergleichen
105
breq extruderpuls_true
106
rjmp skipped_ex
107
extruderpuls_true:
108
rcall extruderpuls
109
110
skipped_ex:                  //vergleich von Extruder nicht Wahr oder puls bereits ausgeführt
111
112
113
//hier der nächste Motor
114
115
116
skipped_all:
117
118
pop temp2
119
pop temp
120
121
122
ret
123
124
/////////////////////////////////////////////MOTORIMPULSE UND AKTUALISIERUNG//////////////////////////////
125
extruderpuls:
126
////////////////////////////////////////////IMPULSERZEUGUNG
127
sbi extruderddr, extruderpin
128
sbi extruderport,extruderpin
129
push temp
130
ldi temp, 3
131
bla1:
132
dec temp                        //mindestimpuls 1 microsekunde also 16 takte
133
cpi temp, 0
134
brne bla1
135
cbi extruderport, extruderpin
136
sbrc flags, ex_rpm_change                //Wenn Solldrehzahl unverändert ist nächsten sprung übrspringen
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 = 15
183
184
push temp
185
push temp2
186
push temp3
187
push temp4
188
189
cbr flags, ex_rpm_change
190
191
192
  lds r16, soll_RPM_extruder
193
    subi    r16,minimum                 ; Nullpunkt verschieben
194
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen
195
    brsh    kein_Treffer                ; Index zu gross -> Fehler
196
    ldi     ZL,low(Sprungtabelle)       ; Tabellenzeiger laden, 16 Bit
197
    ldi     ZH,high(Sprungtabelle)
198
    add     ZL,r16                      ; Index addieren, 16 Bit
199
    ldi     r16,0                   
200
    adc     ZH,r16
201
    ijmp                                ; indirekter Sprung in Sprungtabelle
202
203
  kein_treffer:
204
205
    rjmp    fertig
206
207
Sprungtabelle:
208
    rjmp    Ex1RPM
209
    rjmp    Ex2RPM                  ///HIER MUSS FÜR DIE HÖHEREN DREHZAHLEN NOCH DIE SPRUNGTABELLE ERGÄNZT WERDEN!!!!!!!!!!!!!!
210
    rjmp    Ex3RPM
211
    rjmp    Ex4RPM
212
    rjmp    Ex5RPM
213
    rjmp    Ex6RPM
214
    rjmp    Ex7RPM
215
    rjmp    Ex8RPM
216
    rjmp    Ex9RPM
217
    rjmp    Ex10RPM
218
  rjmp    Ex11RPM
219
    rjmp    Ex12RPM
220
    rjmp    Ex13RPM
221
    rjmp    Ex14RPM
222
    rjmp    Ex15RPM
223
224
Ex1RPM:
225
ldi temp, 0x70
226
sts extrudermotor_LSB_soll, temp
227
ldi temp, 0x17
228
sts extrudermotor_MSB_soll, temp
229
rjmp fertig
230
231
232
Ex2RPM:
233
ldi temp, 0xB8
234
sts extrudermotor_LSB_soll, temp
235
ldi temp, 0x0B
236
sts extrudermotor_MSB_soll, temp
237
238
rjmp fertig
239
240
241
Ex3RPM:
242
ldi temp, 0xD0
243
sts extrudermotor_LSB_soll, temp
244
ldi temp, 0x07
245
sts extrudermotor_MSB_soll, temp
246
rjmp fertig
247
248
249
Ex4RPM:
250
ldi temp, 0xDC
251
sts extrudermotor_LSB_soll, temp
252
ldi temp, 0x05
253
sts extrudermotor_MSB_soll, temp
254
rjmp fertig
255
256
Ex5RPM:
257
ldi temp, 0xB0
258
sts extrudermotor_LSB_soll, temp
259
ldi temp, 0x04
260
sts extrudermotor_MSB_soll, temp
261
rjmp fertig
262
263
Ex6RPM:
264
ldi temp, 0xE8
265
sts extrudermotor_LSB_soll, temp
266
ldi temp, 0x03
267
sts extrudermotor_MSB_soll, temp
268
rjmp fertig
269
270
Ex7RPM:
271
ldi temp, 0x58
272
sts extrudermotor_LSB_soll, temp
273
ldi temp, 0x03
274
sts extrudermotor_MSB_soll, temp
275
rjmp fertig
276
277
Ex8RPM:
278
ldi temp, 0xEE
279
sts extrudermotor_LSB_soll, temp
280
ldi temp, 0x02
281
sts extrudermotor_MSB_soll, temp
282
rjmp fertig
283
284
Ex9RPM:
285
ldi temp, 0x9A
286
sts extrudermotor_LSB_soll, temp
287
ldi temp, 0x02
288
sts extrudermotor_MSB_soll, temp
289
rjmp fertig
290
291
Ex10RPM:
292
ldi temp, 0x58
293
sts extrudermotor_LSB_soll, temp
294
ldi temp, 0x02
295
sts extrudermotor_MSB_soll, temp
296
rjmp fertig
297
298
Ex11RPM:
299
ldi temp, 0x21
300
sts extrudermotor_LSB_soll, temp
301
ldi temp, 0x02
302
sts extrudermotor_MSB_soll, temp
303
rjmp fertig
304
305
Ex12RPM:
306
ldi temp, 0xF4
307
sts extrudermotor_LSB_soll, temp
308
ldi temp, 0x01
309
sts extrudermotor_MSB_soll, temp
310
rjmp fertig
311
312
Ex13RPM:
313
ldi temp, 0xCC
314
sts extrudermotor_LSB_soll, temp
315
ldi temp, 0x01
316
sts extrudermotor_MSB_soll, temp
317
rjmp fertig
318
319
Ex14RPM:
320
ldi temp, 0xAD
321
sts extrudermotor_LSB_soll, temp
322
ldi temp, 0x01
323
sts extrudermotor_MSB_soll, temp
324
rjmp fertig
325
326
Ex15RPM:
327
ldi temp, 0x90
328
sts extrudermotor_LSB_soll, temp
329
ldi temp, 0x01
330
sts extrudermotor_MSB_soll, temp
331
rjmp fertig
332
333
334
335
336
fertig:
337
pop temp4
338
pop temp3
339
pop temp2
340
pop temp
341
ret
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
//////////////////////////////////////////////////Interruptroutinen///////////////////////////////////////////
394
TIMER0_COMPA:
395
push temp
396
in temp, SREG
397
push temp
398
ldi temp, 1
399
add micros_lsb, r2
400
adc micros_msb, r3
401
ldi temp, 160                  //160 Takte ohne prescaler bei 16 mhz ergibt einen eine auflösung von 10 micros
402
sts OCR1AL, temp                //OCRA1H bleibt null dar Timer 1 ein 16biit timer ist, allerdings nur bis 160 im CTC Mode gezählt wird
403
sbr flags, update                //Zähler wurde aktuallisiert, also Flag setzen um im loop die motoren mit dem neuen Wert zu vegleichen
404
pop temp
405
out SREG, temp
406
pop temp
407
reti
408
409
410
411
412
413
//Die RAM Adressen
414
.DSEG                ; Umschalten auf das SRAM Datensegment
415
debbuging:            .BYTE  1
416
extrudermotor_LSB:       .BYTE  1        //Zeitpunkt des nächsten events
417
extrudermotor_MSB:        .BYTE  1
418
419
extrudermotor_LSB_soll:     .BYTE  1        //Zeitdifferenz anhand der Drehzahl
420
extrudermotor_MSB_soll:     .BYTE  1
421
422
soll_RPM_extruder:   .BYTE  1
423
424
425
426
.ESEG
427
428
ex1MSB:    .db 0x17
429
ex1LSB:    .db 0x70      //6000      also 60.000 micros
430
ex2MSB:    .db 0x0B
431
ex2LSB:    .db 0xB8      //3000
432
ex3MSB:    .db 0x07
433
ex3LSB:    .db 0xD0      //2000
434
ex4MSB:    .db 0x05
435
ex4LSB:    .db 0xDC      //1500
436
437
ex5MSB:  .db  0x04
438
ex5LSB:  .db  0xB0      //1200
439
440
ex6MSB:  .db  0x03
441
ex6LSB:  .db  0xE8      //1000
442
443
ex7MSB:  .db  0x03
444
ex7LSB:  .db  0x58      //856
445
446
ex8MSB:  .db  0x02
447
ex8LSB:  .db  0xEE      //750
448
449
ex9MSB:  .db  0x02
450
ex9LSB:  .db  0x9A      //666
451
452
ex10MSB:.db  0x02
453
ex10LSB:.db  0x58      //600
454
455
ex11MSB:.db  0x02
456
ex11LSB:.db  0x21      //545
457
458
ex12MSB:.db  0x01
459
ex12LSB:.db  0xF4      //500
460
461
ex13MSB:.db  0x01
462
ex13LSB:.db  0xCC      //460
463
464
ex14MSB:.db  0x01
465
ex14LSB:.db  0xAD      //429
466
467
ex15MSB:.db  0x01
468
ex15LSB:.db  0x90      //400
469
470
ex16MSB:.db  0x01
471
ex16LSB:.db  0x77      //375
472
473
ex17MSB:.db  0x01
474
ex17LSB:.db  0x60      //352
475
476
ex18MSB:.db  0x01
477
ex18LSB:.db  0x4D      //333
478
479
ex19MSB:.db  0x01
480
ex19LSB:.db  0x3B      //315
481
ex20MSB:.db  0x01
482
ex20LSB:.db  0x2C      //300
483
484
ex21MSB:.db  0x01
485
ex21LSB:.db  0x1E      //286
486
487
ex22MSB:.db  0x01
488
ex22LSB:.db  0x10      //272
489
490
ex23MSB:.db  0x01
491
ex23LSB:.db  0x04      //260
492
493
ex24MSB:.db  0x00
494
ex24LSB:.db  0xFA      //250
495
496
ex25MSB:.db  0x00
497
ex25LSB:.db  0xF0      //240