6PWM01.asm


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