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
|