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 pullyddr = ddrb
14
15
.equ extruderpin = PB1
16
.equ pullypin = PB2
17
.equ extruderport = portb
18
.equ pullyport = portb
19
.equ debug_mode = 1            // Wenn 1 werden alle SRAM Adressen mit smulationsfreundlichen werten vorbelegt
20
.def flags = r22            //Bit 0=interrupt vorgefallen->micros verlgeichen Bit 1=Solldrehzahl verändert
21
.equ update = 0
22
.equ ex_rpm_change = 1
23
.equ pully_rpm_change = 2
24
.equ pully_enable = 3
25
.equ extruder_enable = 4
26
27
.org 0x0000
28
  rjmp main
29
30
.org 0x0016 
31
  rjmp TIMER1_COMPA
32
//Ein Timer 
33
34
// Die jeweiligen Werte die für ein event nötig sind werden im sram gespeichert
35
//Die kontrolle der taktzeiten findet nur stadt wenn ein interrupt des timers aktiv war und das flag im flags register gesetzt ist
36
// Die berechnung soll nur durchgeführt werden wenn sich die solldrehzahl geändert hat
37
38
//*nicht umgesetzte und getestet ideen:
39
40
41
42
.org 0x0042
43
main:
44
45
         ldi temp, HIGH(RAMEND)            ; HIGH-Byte der obersten RAM-Adresse
46
         out SPH, temp
47
         ldi temp, LOW(RAMEND)             ; LOW-Byte der obersten RAM-Adresse
48
         out SPL, temp
49
     ldi temp, 1
50
     mov r2, temp
51
     clr r3
52
     nop
53
     rjmp setup
54
55
56
    
57
    rjmp main
58
59
debugging:
60
push temp
61
ldi temp, 0x0E
62
sts soll_RPM_extruder, temp
63
pop temp
64
call extruderpuls
65
rjmp loop
66
67
68
setup:
69
timer_setup:
70
ldi temp, 160
71
sts OCR1AL, temp
72
ldi temp, 0x09
73
sts TCCR1B, temp
74
ldi temp, 0x02
75
sts TIMSK1, temp
76
sei
77
78
ldi temp, debug_mode
79
cpi temp, 1
80
81
breq debugging
82
83
ldi temp, 1                  //Initialwert für jeden Motor ist 1 RPM
84
sts soll_RPM_extruder, temp
85
sts soll_RPM_pully, temp
86
87
88
89
sbr flags, 1<<ex_rpm_change          //Erstmaliges Laden der Sollwerte auslösen
90
sbr flags, 1<<pully_rpm_change
91
rjmp loop
92
93
94
95
///////////////////////////////////////////////////////Hauptschleife////////////////////////////////////////////
96
loop:
97
98
call check_timings
99
rjmp loop
100
101
102
103
104
105
stop_pully:
106
cbr flags, 1<<pully_enable
107
108
ret
109
110
start_pully:
111
sbr flags, 1<<pully_enable
112
//nun noch den micros wert etws erhöht ins micros pully schreiben
113
114
mov temp, micros_lsb
115
inc temp
116
inc temp
117
inc temp
118
119
120
sts pully_LSB,temp
121
sts pully_MSB, micros_msb
122
123
ret
124
125
stop_extruder:
126
cbr flags, 1<<extruder_enable
127
ret
128
129
start_extruder:
130
sbr flags, 1<<extruder_enable
131
mov temp, micros_lsb
132
inc temp
133
inc temp
134
inc temp
135
136
137
sts extrudermotor_LSB,temp
138
sts extrudermotor_MSB, micros_msb
139
140
141
142
143
ret
144
145
146
147
check_timings:
148
149
push temp                  //temp sichern
150
push temp2                  //temp2 sichern
151
152
sbrs flags, update              //wenn bit 1 gesetzt ist, trat ein interrupt auf und die micros wurden aktuallisiert
153
rjmp skipped_all
154
155
156
sbrc flags, extruder_enable          //Wenn der Extruder deaktiviert ist wird weiter gesprungen
157
rjmp skipped_ex
158
cbr flags, 1<<update
159
//Extrudermotor        
160
lds temp, extrudermotor_MSB          //msb aus RAM laden
161
cp temp, micros_MSB              //und mit micros msb vergleichen
162
brne skipped_EX                //wenn MSB nicht gleich ist ->abbruch
163
lds temp, extrudermotor_LSB          //LSB laden
164
cp temp, micros_LSB              //mit micros vergleichen
165
brne skipped_ex
166
167
cp temp, micros_LSB              //mit micros vergleichen
168
breq extruderpuls_true
169
rjmp skipped_ex
170
extruderpuls_true:
171
rcall extruderpuls
172
173
skipped_ex:                  //vergleich von Extruder nicht Wahr oder puls bereits ausgeführt
174
175
176
sbrc flags, pully_enable
177
rjmp skipped_pully
178
//Antrieb des Pullys
179
lds temp, pully_MSB              //msb aus RAM laden
180
cp temp, micros_MSB              //und mit micros msb vergleichen
181
brne skipped_pully                  //wenn MSB nicht gleich ist ->abbruch
182
lds temp, pully_LSB              //LSB laden
183
cp temp, micros_LSB              //mit micros vergleichen
184
brne skipped_pully
185
186
cp temp, micros_LSB              //mit micros vergleichen
187
breq pully_true
188
rjmp skipped_pully
189
pully_true:
190
rcall pullypuls
191
192
skipped_pully:
193
nop
194
195
skipped_all:
196
197
pop temp2
198
pop temp
199
200
201
ret
202
203
204
//////////////////////ALLES WAS DEN PULLY BERIFFT///////////////
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/////////////////////////////////////////////MOTORIMPULSE UND AKTUALISIERUNG//////////////////////////////
219
pullypuls:
220
////////////////////////////////////////////IMPULSERZEUGUNG
221
sbi pullyddr, pullypin
222
sbi pullyport,pullypin
223
push temp
224
ldi temp, 3
225
bla2:
226
dec temp                        //mindestimpuls 1 microsekunde also 16 takte
227
cpi temp, 0
228
brne bla2
229
cbi pullyport, pullypin
230
sbrc flags, pully_rpm_change                //Wenn Solldrehzahl unverändert ist nächsten sprung übrspringen
231
rcall pully_time_calculation
232
233
////////////////////////////////////////////UPDATE
234
235
//Drehzahlwert mit den werten aus dem ram aktuallisieren und addieren
236
237
lds temp, pully_LSB      //LSB in temp 1 lesen
238
lds temp2,pully_LSB_soll  //LSB des Sollwertes
239
lds temp3, pully_MSB
240
lds temp4, pully_MSB_soll
241
242
243
add temp, temp2            //addition des LSB 
244
adc temp3, temp4
245
sts pully_LSB, temp      //neuen Wert speichern
246
sts pully_MSB, temp3
247
248
pop temp
249
ret
250
251
252
253
254
255
pully_time_calculation:
256
.equ minimumpully = 1
257
.equ maximumpully = 10
258
259
push temp
260
push temp2
261
push temp3
262
push temp4
263
264
cbr flags, 1<<pully_rpm_change
265
266
267
  lds r16, soll_RPM_pully
268
    subi    r16,minimumpully                ; Nullpunkt verschieben
269
    cpi     r16,(maximumpully-minimumpully+1)     ; Index auf Maximum prüfen
270
    brsh    kein_Treffer2                ; Index zu gross -> Fehler
271
    ldi     ZL,low(Sprungtabelle_Pully)       ; Tabellenzeiger laden, 16 Bit
272
    ldi     ZH,high(Sprungtabelle_Pully)
273
    add     ZL,r16                      ; Index addieren, 16 Bit
274
    ldi     r16,0                   
275
    adc     ZH,r16
276
    ijmp                                ; indirekter Sprung in Sprungtabelle
277
278
  kein_treffer2:
279
280
    rjmp    fertig2
281
282
Sprungtabelle_Pully:
283
    rjmp    Pu1RPM
284
    rjmp    Pu2RPM                  ///HIER MUSS FÜR DIE HÖHEREN DREHZAHLEN NOCH DIE SPRUNGTABELLE ERGÄNZT WERDEN!!!!!!!!!!!!!!
285
    rjmp    Pu3RPM
286
    rjmp    Pu4RPM
287
    rjmp    Pu5RPM
288
    rjmp    Pu6RPM
289
    rjmp    Pu7RPM
290
    rjmp    Pu8RPM
291
    rjmp    Pu9RPM
292
    rjmp    Pu10RPM
293
294
295
296
/*
297
0x1770
298
0x1388
299
0x10bd
300
0xea6
301
0xd05
302
0xbb8
303
0xaa7
304
0x9c4
305
0x903
306
0x85e
307
0x7d0
308
0x753
309
0x6e4
310
0x682
311
0x62a
312
0x5dc
313
0x594
314
0x553
315
0x518
316
0x4e2
317
0x4af
318
*/
319
320
Pu1RPM:
321
322
ldi temp, 0x75
323
sts pully_MSB_soll, temp
324
ldi temp, 0x30
325
sts pully_LSB_soll, temp
326
rjmp fertig2
327
328
329
Pu2RPM:
330
331
ldi temp, 0x3A
332
sts pully_MSB_soll, temp
333
ldi temp, 0x98
334
sts pully_LSB_soll, temp
335
rjmp fertig2
336
337
Pu3RPM:
338
339
ldi temp, 0x27
340
sts pully_MSB_soll, temp
341
ldi temp, 0x10
342
sts pully_LSB_soll, temp
343
rjmp fertig2
344
345
Pu4RPM:
346
347
ldi temp, 0x1D
348
sts pully_MSB_soll, temp
349
ldi temp, 0x4C
350
sts pully_LSB_soll, temp
351
rjmp fertig2
352
353
Pu5RPM:
354
355
ldi temp, 0x17
356
sts pully_MSB_soll, temp
357
ldi temp, 0x70
358
sts pully_LSB_soll, temp
359
rjmp fertig2
360
361
Pu6RPM:
362
363
ldi temp, 0x13
364
sts pully_MSB_soll, temp
365
ldi temp, 0x88
366
sts pully_LSB_soll, temp
367
rjmp fertig2
368
369
Pu7RPM:
370
371
ldi temp, 0x10
372
sts pully_MSB_soll, temp
373
ldi temp, 0xBD
374
sts pully_LSB_soll, temp
375
rjmp fertig2
376
Pu8RPM:
377
378
ldi temp, 0x0E
379
sts pully_MSB_soll, temp
380
ldi temp, 0xA6
381
sts pully_LSB_soll, temp
382
rjmp fertig2
383
384
Pu9RPM:
385
386
ldi temp, 0x0D
387
sts pully_MSB_soll, temp
388
ldi temp, 0x05
389
sts pully_LSB_soll, temp
390
rjmp fertig2
391
392
Pu10RPM:
393
394
ldi temp, 0x0B
395
sts pully_MSB_soll, temp
396
ldi temp, 0xB8
397
sts pully_LSB_soll, temp
398
rjmp fertig2
399
400
401
402
403
fertig2:
404
pop temp4
405
pop temp3
406
pop temp2
407
pop temp
408
ret
409
410
411
412
////////////////////ALLES WAS DEN EXTRUDERMOTOR BETRIFFT/////////////////////////
413
414
415
416
417
418
/////////////////////////////////////////////MOTORIMPULSE UND AKTUALISIERUNG//////////////////////////////
419
extruderpuls:
420
////////////////////////////////////////////IMPULSERZEUGUNG
421
sbi extruderddr, extruderpin
422
sbi extruderport,extruderpin
423
push temp
424
ldi temp, 3
425
bla1:
426
dec temp                        //mindestimpuls 1 microsekunde also 16 takte
427
cpi temp, 0
428
brne bla1
429
cbi extruderport, extruderpin
430
sbrc flags, ex_rpm_change                //Wenn Solldrehzahl unverändert ist nächsten sprung übrspringen
431
rcall extruder_time_calculation
432
433
////////////////////////////////////////////UPDATE
434
435
//Extruderwert mit den werten aus dem ram aktuallisieren und addieren
436
437
lds temp, extrudermotor_LSB      //LSB in temp 1 lesen
438
lds temp2,extrudermotor_LSB_soll  //LSB des Sollwertes
439
lds temp3, extrudermotor_MSB
440
lds temp4, extrudermotor_MSB_soll
441
442
443
add temp, temp2            //addition des LSB 
444
adc temp3, temp4
445
sts extrudermotor_LSB, temp      //neuen Wert speichern
446
sts extrudermotor_MSB, temp3
447
448
pop temp
449
ret
450
451
452
453
extruder_time_calculation:
454
//////////////////////////////////////////Anhand der Drehzahl die Zeit als faktor von 10 micors berechnen
455
456
457
//Nur ausführen wenn Flag 2 in flags gesetzt ist (update_request_extruder)
458
//Es ergibt sich folgende formel 100000/(RPM/60*STEPPS)
459
460
//Bei 1 RPM un d 200 steps auflösung ergibt sich ein wert von 30.000
461
//Bei 100 RPM ergibt sich ein wert von 300
462
//bei 60 RPM ein Wert von 500
463
464
//Dar der Extruder ein Getribemotor 1:5 ist
465
//ergibt sich (100.000/(RPM/60x1000)
466
//somit für 60 RPM ein Wert von 100
467
//für 1 RPM ein Wert von 6000
468
//für 100RPM ein Wert von 60
469
470
471
//Idee wurde verworfen
472
//Daten sind im EEPROM gespeichert
473
//Adresse 1 enstpsricht 1 RPM und aufwärts
474
475
.equ minimum = 1
476
.equ maximum = 15
477
478
push temp
479
push temp2
480
push temp3
481
push temp4
482
483
cbr flags, 1<<ex_rpm_change
484
485
486
  lds r16, soll_RPM_extruder
487
    subi    r16,minimum                 ; Nullpunkt verschieben
488
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen
489
    brsh    kein_Treffer                ; Index zu gross -> Fehler
490
    ldi     ZL,low(Sprungtabelle)       ; Tabellenzeiger laden, 16 Bit
491
    ldi     ZH,high(Sprungtabelle)
492
    add     ZL,r16                      ; Index addieren, 16 Bit
493
    ldi     r16,0                   
494
    adc     ZH,r16
495
    ijmp                                ; indirekter Sprung in Sprungtabelle
496
497
  kein_treffer:
498
499
    rjmp    fertig
500
501
Sprungtabelle:
502
    rjmp    Ex1RPM
503
    rjmp    Ex2RPM                  ///HIER MUSS FÜR DIE HÖHEREN DREHZAHLEN NOCH DIE SPRUNGTABELLE ERGÄNZT WERDEN!!!!!!!!!!!!!!
504
    rjmp    Ex3RPM
505
    rjmp    Ex4RPM
506
    rjmp    Ex5RPM
507
    rjmp    Ex6RPM
508
    rjmp    Ex7RPM
509
    rjmp    Ex8RPM
510
    rjmp    Ex9RPM
511
    rjmp    Ex10RPM
512
  rjmp    Ex11RPM
513
    rjmp    Ex12RPM
514
    rjmp    Ex13RPM
515
    rjmp    Ex14RPM
516
    rjmp    Ex15RPM
517
518
Ex1RPM:
519
ldi temp, 0x70
520
sts extrudermotor_LSB_soll, temp
521
ldi temp, 0x17
522
sts extrudermotor_MSB_soll, temp
523
rjmp fertig
524
525
526
Ex2RPM:
527
ldi temp, 0xB8
528
sts extrudermotor_LSB_soll, temp
529
ldi temp, 0x0B
530
sts extrudermotor_MSB_soll, temp
531
532
rjmp fertig
533
534
535
Ex3RPM:
536
ldi temp, 0xD0
537
sts extrudermotor_LSB_soll, temp
538
ldi temp, 0x07
539
sts extrudermotor_MSB_soll, temp
540
rjmp fertig
541
542
543
Ex4RPM:
544
ldi temp, 0xDC
545
sts extrudermotor_LSB_soll, temp
546
ldi temp, 0x05
547
sts extrudermotor_MSB_soll, temp
548
rjmp fertig
549
550
Ex5RPM:
551
ldi temp, 0xB0
552
sts extrudermotor_LSB_soll, temp
553
ldi temp, 0x04
554
sts extrudermotor_MSB_soll, temp
555
rjmp fertig
556
557
Ex6RPM:
558
ldi temp, 0xE8
559
sts extrudermotor_LSB_soll, temp
560
ldi temp, 0x03
561
sts extrudermotor_MSB_soll, temp
562
rjmp fertig
563
564
Ex7RPM:
565
ldi temp, 0x58
566
sts extrudermotor_LSB_soll, temp
567
ldi temp, 0x03
568
sts extrudermotor_MSB_soll, temp
569
rjmp fertig
570
571
Ex8RPM:
572
ldi temp, 0xEE
573
sts extrudermotor_LSB_soll, temp
574
ldi temp, 0x02
575
sts extrudermotor_MSB_soll, temp
576
rjmp fertig
577
578
Ex9RPM:
579
ldi temp, 0x9A
580
sts extrudermotor_LSB_soll, temp
581
ldi temp, 0x02
582
sts extrudermotor_MSB_soll, temp
583
rjmp fertig
584
585
Ex10RPM:
586
ldi temp, 0x58
587
sts extrudermotor_LSB_soll, temp
588
ldi temp, 0x02
589
sts extrudermotor_MSB_soll, temp
590
rjmp fertig
591
592
Ex11RPM:
593
ldi temp, 0x21
594
sts extrudermotor_LSB_soll, temp
595
ldi temp, 0x02
596
sts extrudermotor_MSB_soll, temp
597
rjmp fertig
598
599
Ex12RPM:
600
ldi temp, 0xF4
601
sts extrudermotor_LSB_soll, temp
602
ldi temp, 0x01
603
sts extrudermotor_MSB_soll, temp
604
rjmp fertig
605
606
Ex13RPM:
607
ldi temp, 0xCC
608
sts extrudermotor_LSB_soll, temp
609
ldi temp, 0x01
610
sts extrudermotor_MSB_soll, temp
611
rjmp fertig
612
613
Ex14RPM:
614
ldi temp, 0xAD
615
sts extrudermotor_LSB_soll, temp
616
ldi temp, 0x01
617
sts extrudermotor_MSB_soll, temp
618
rjmp fertig
619
620
Ex15RPM:
621
ldi temp, 0x90
622
sts extrudermotor_LSB_soll, temp
623
ldi temp, 0x01
624
sts extrudermotor_MSB_soll, temp
625
rjmp fertig
626
627
Ex16RPM:
628
ldi temp, 0x77
629
sts extrudermotor_LSB_soll, temp
630
ldi temp, 0x01
631
sts extrudermotor_MSB_soll, temp
632
rjmp fertig
633
634
Ex17RPM:
635
ldi temp, 0x60
636
sts extrudermotor_LSB_soll, temp
637
ldi temp, 0x01
638
sts extrudermotor_MSB_soll, temp
639
rjmp fertig
640
641
Ex18RPM:
642
ldi temp, 0x4D
643
sts extrudermotor_LSB_soll, temp
644
ldi temp, 0x01
645
sts extrudermotor_MSB_soll, temp
646
rjmp fertig
647
648
Ex19RPM:
649
ldi temp, 0x3B
650
sts extrudermotor_LSB_soll, temp
651
ldi temp, 0x01
652
sts extrudermotor_MSB_soll, temp
653
rjmp fertig
654
655
Ex20RPM:
656
ldi temp, 0x2C
657
sts extrudermotor_LSB_soll, temp
658
ldi temp, 0x01
659
sts extrudermotor_MSB_soll, temp
660
rjmp fertig
661
662
663
fertig:
664
pop temp4
665
pop temp3
666
pop temp2
667
pop temp
668
ret
669
670
671
672
673
674
675
//////////////////////////////////////////////////Interruptroutinen///////////////////////////////////////////
676
TIMER1_COMPA:
677
push temp
678
in temp, SREG
679
push temp
680
ldi temp, 1
681
add micros_lsb, r2
682
adc micros_msb, r3
683
ldi temp, 160                  //160 Takte ohne prescaler bei 16 mhz ergibt einen eine auflösung von 10 micros
684
sts OCR1AL, temp                //OCRA1H bleibt null dar Timer 1 ein 16biit timer ist, allerdings nur bis 160 im CTC Mode gezählt wird
685
sbr flags, 1<<update                //Zähler wurde aktuallisiert, also Flag setzen um im loop die motoren mit dem neuen Wert zu vegleichen
686
pop temp
687
out SREG, temp
688
pop temp
689
reti
690
691
692
693
694
695
//Die RAM Adressen
696
.DSEG                ; Umschalten auf das SRAM Datensegment
697
debbuging:            .BYTE  1
698
extrudermotor_LSB:       .BYTE  1        //Zeitpunkt des nächsten events
699
extrudermotor_MSB:        .BYTE  1
700
pully_LSB:           .BYTE  1
701
pully_MSB:           .BYTE  1
702
703
704
extrudermotor_LSB_soll:     .BYTE  1        //Zeitdifferenz anhand der Drehzahl
705
extrudermotor_MSB_soll:     .BYTE  1
706
pully_LSB_soll:         .BYTE  1
707
pully_MSB_soll:         .BYTE  1
708
709
710
711
soll_RPM_extruder:       .BYTE  1        //Vorgabe Drehzahl
712
soll_RPM_pully:         .BYTE  1