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
|