1 | ;Einfacher Sechsfach-PWM-Drehzahlsteller
|
2 | ;Nur eine Drehrichtung
|
3 | ;Steuerung durch analoge Steuerspannung 0...5V (Stop...Max)
|
4 |
|
5 | ;-------------------------------------------------------------------
|
6 |
|
7 | ;R0...R5 = Variablen für Geschwindigkeitswert
|
8 |
|
9 | .def u1=r16 ;Universal1
|
10 | .def u2=r17 ;Universal2
|
11 | .def ein=r18 ;Konstante um alle Kanäle bei Nulldurchgang einzuschalten
|
12 | .def zz=r19 ;Zähler für Vergleich (Portabschaltung)
|
13 |
|
14 | .include"4433def.inc"
|
15 | .cseg
|
16 | .org 0 ;Reset und INT-Vektoren
|
17 | rjmp reset ;Programm-Initialisierung
|
18 | reti ;IRQ0
|
19 | reti ;IRQ1
|
20 | reti ;Timer1 Capture
|
21 | rjmp takt ;Timer1 Compare
|
22 | reti ;Timer1 ovf
|
23 | reti ;Timer0-ovf
|
24 | reti ;Serial Transfer complete
|
25 | reti ;UART RX
|
26 | reti ;UART UDRE
|
27 | reti ;UART TX
|
28 | reti ;ADC-Conversion complete
|
29 | reti ;EEPROM-Writing complete
|
30 | reti ;Analog-Comparator
|
31 | reset:
|
32 | out portb,yh ;Port B auf General-Stop
|
33 | ldi ein,63 ;Konstante zum Einschalten der Verbraucher
|
34 | out ddrb,ein ;Port B als Ausgang
|
35 | ldi u1,low(ramend) ;Stackpointer
|
36 | out sp,u1 ;initialisieren
|
37 | clr r0 ;Tempo auf 0
|
38 | clr r1
|
39 | clr r2
|
40 | clr r3
|
41 | clr r4
|
42 | clr r5
|
43 | ldi u1,64 ;Timer-Endwert
|
44 | out ocr1l,u1 ;Low
|
45 | ldi u1,0 ;Timer1
|
46 | out ocr1h,u1 ;Endwert H
|
47 | out tccr1a,u1 ;Control
|
48 | ldi u1,9 ;Control Vorteiler 1:1, Timer bei Comp löschen
|
49 | out tccr1b,u1 ;aktivieren
|
50 | ldi u1,64 ;Timer1-Compare
|
51 | out timsk,u1 ;einschalten
|
52 | clr yh ;Zeiger auf Register R0 (H-Teil)
|
53 | clr yl ;Zeiger auf Register R0 (L-Teil) und AD-Mux
|
54 | out admux,yl ;Kanal 0 wählen
|
55 | ldi u1,0b11100110 ;ADC freilaufend mit Takt 1:64
|
56 | out adcsr,u1 ;initialisieren
|
57 | ldi u1,128 ;Int-Flag
|
58 | out sreg,u1 ;setzen
|
59 | clr zz ;Bei 0 beginnen...
|
60 |
|
61 | warte:
|
62 | rjmp warte ;Warteschleife
|
63 |
|
64 | takt:
|
65 | inc zz ;PWM-Zähler erhöhen
|
66 | andi zz,127 ;nur untere 128 Werte
|
67 | breq takt0 ;Überlauf...
|
68 | cp r0,zz ;Kanal 0
|
69 | brpl takt1 ;fertig?
|
70 | cbi portb,0 ;ja, ausschalten
|
71 | takt1:
|
72 | cp r1,zz ;Kanal 1
|
73 | brpl takt2 ;fertig?
|
74 | cbi portb,1 ;ja, ausschalten
|
75 | takt2:
|
76 | cp r2,zz ;Kanal 2
|
77 | brpl takt3 ;fertig?
|
78 | cbi portb,2 ;ja, ausschalten
|
79 | takt3:
|
80 | cp r3,zz ;Kanal 3
|
81 | brpl takt4 ;fertig?
|
82 | cbi portb,3 ;ja, ausschalten
|
83 | takt4:
|
84 | cp r4,zz ;Kanal 4
|
85 | brpl takt5 ;fertig?
|
86 | cbi portb,4 ;ja, ausschalten
|
87 | takt5:
|
88 | cp r5,zz ;Kanal 5
|
89 | brpl takt6 ;fertig?
|
90 | cbi portb,5 ;ja, ausschalten
|
91 | takt6:
|
92 | reti
|
93 | takt0:
|
94 | out portb,ein ;alle Kanäle einschalten
|
95 | in u1,adcl ;Analogeingang
|
96 | in u2,adch ;einlesen
|
97 | ror u2 ;Daten (Analogwert)
|
98 | ror u1 ;um 3 Bit nach rechts
|
99 | ror u2 ;schieben
|
100 | ror u1 ;(aus 10-Bit 7-Bit-Wert erzeugen
|
101 | ror u2 ;(16-Bit geteilt
|
102 | ror u1 ;durch 8)
|
103 | andi u1,127 ;MSB sicherheitshalber löschen
|
104 | st y,u1 ;8-Bit-Wert in R0...r5 schreiben
|
105 | inc yl ;nächsten Kanal auswählen
|
106 | cpi yl,6 ;(größer
|
107 | brmi takt01 ; als 5?)
|
108 | clr yl ;ja, Kanal 0...
|
109 | takt01:
|
110 | out admux,yl ;und einschalten
|
111 | reti
|