7Ksend01.asm


1
;Encoder für 7-Kanal Fernsteuersender zum Betrieb bzw. zum Test von Komponenten.
2
;Es stehen 6 Analogeingänge für Steuerknüppel zur Verfügung (K1...K6),
3
;sowie 2 Digitaleingänge für Taster oder einen Schalter für drei Stellungen (K7).
4
5
;Auf Trimmung und Impulsumkehr wurde bei dieser "Erstlingsversion" bewusst verzichtet.
6
7
;Portbelegung des AT90S4433:
8
9
;Eingänge:
10
;PC5: Steuerknüppel Kanal 1
11
;PC4: Steuerknüppel Kanal 2
12
;PC3: Steuerknüppel Kanal 3
13
;PC2: Steuerknüppel Kanal 4
14
;PC1: Steuerknüppel Kanal 5
15
;PC0: Steuerknüppel Kanal 6
16
;PB5: Schalter (gegen GND) impulsverkürzend Kanal 7
17
;PB4: Schalter (gegen GND) impulsverlängernd Kanal 7
18
19
;Ausgänge:
20
;PD0: Sendertastimpuls (H-aktiv)
21
;PD1: Kanalimpuls 1 (H-aktiv)
22
;PD2: Kanalimpuls 2 (H-aktiv)
23
;PD3: Kanalimpuls 3 (H-aktiv)
24
;PD4: Kanalimpuls 4 (H-aktiv)
25
;PD5: Kanalimpuls 5 (H-aktiv)
26
;PD6: Kanalimpuls 6 (H-aktiv)
27
;PD7: Kanalimpuls 7 (H-aktiv)
28
29
;PB0...PB3 sind vorerst unbenutzt...
30
31
32
.equ quarz=8000000  ;Quarzfrequenz 8MHz
33
34
.equ bi=150-64    ;Basisimpuls in 0,01ms
35
.equ schalt=30    ;Schaltimpulsdifferenz zu 1,5ms Impulsmitte
36
37
.def tsw=r1      ;Timer-Startwert für Zeitnormal
38
.def ib=r2      ;Impulsbreite Sendertastung
39
.def awh=r3      ;Analogwert H vom Steuerknüppel
40
.def pzl=r4      ;Pausenzähler L
41
.def pzh=r5      ;Pausenzähler H
42
.def pzsl=r6    ;Startwert Pausenzähler L
43
.def pzsh=r7    ;Startwert Pausenzähler H
44
.def srs=r8      ;Status-Register-Sicherungskopie
45
46
.def u1=r16      ;Universal 1
47
.def u2=r17      ;Universal 2
48
.def zz=r18      ;Zähler Zeitnormal
49
.def iq=r19      ;Input-Quelle (Analog-MUX)
50
.def awl=r20    ;Analogwert L vom Steuerknüppel
51
.def ia=r21      ;Impulsabstand (Kanalimpulsbreite)
52
53
54
.include"4433def.inc"
55
.cseg
56
.org 0        ;Reset und INT-Vektoren
57
 rjmp reset      ;Programm-Initialisierung
58
 reti        ;IRQ0
59
 reti        ;IRQ1
60
 reti        ;Timer1 Capture
61
 reti        ;Timer1 Compare
62
 reti        ;Timer1 ovf
63
 rjmp takt          ;Timer0-ovf
64
 reti        ;Serial Transfer complete
65
 reti        ;UART RX
66
 reti        ;UART UDRE
67
 reti        ;UART TX
68
 reti        ;ADC-Conversion complete
69
 reti        ;EEPROM-Writing complete
70
 reti        ;Analog-Comparator
71
72
reset:
73
 ldi u1,low(ramend)  ;Stackpointer
74
 out spl,u1      ;einrichten
75
 ldi u1,0      ;
76
 out portd,u1    ;Impulsausgänge auf L-Pegel
77
 out ddrd,u1    ;Eingänge Port D (Analog)
78
 out ddrb,u1    ;Eingänge Port B
79
 ldi u1,255      ;Ausgänge
80
 out ddrd,u1    ;Port D (Impulsausgänge)
81
 out portb,u1    ;Pull-Ups für Taster einschalten
82
 ldi u1,50      ;Impulsbreite für
83
 mov ib,u1      ;Sendertastung setzen
84
 ldi u1,248      ;Startwert
85
 mov pzsh,u1    ;Pause H setzen
86
 ldi u1,48      ;Startwert
87
 mov pzsl,u1    ;Pause L setzen
88
 ldi iq,5      ;ADC5 als Kanal 1
89
 out admux,iq    ;wählen
90
 ldi u1,0b11100110  ;ADC freilaufend mit Takt 1:64
91
 out adcsr,u1    ;initialisieren
92
 ldi u1,256-80+8  ;Startwert
93
 mov tsw,u1      ;für Timer0 definieren
94
 out tcnt0,tsw    ;und setzen (80 Takte bis Überlauf)
95
 ldi u1,1      ;Timer auf
96
 out tccr0,u1    ;Prozessortakt
97
 ldi u1,2      ;Timer-Interrupt
98
 out timsk,u1    ;einschalten
99
 sei        ;Interrupts aktivieren
100
 clr pzl      ;Startbedingung
101
 clr pzh      ;schaffen
102
  
103
warte:    ;Hauptschleife...
104
 tst pzl      ;Pausenzähler L auf 0?
105
 brne warte      ;nein...
106
 tst pzh      ;Pausenzähler H auf 0?
107
 brne warte      ;nein...
108
 ldi iq,5      ;Kanal 1 einschalten
109
 out admux,iq    ;Analogkanal wählen
110
 ldi ia,bi      ;Basisimpulsbreite setzen
111
 ldi u1,3      ;Sendertastimpuls und
112
 out portd,u1    ;Kanalimpuls 1 einschalten
113
 clr zz        ;Zeitzähler löschen
114
 mov pzl,pzsl    ;Pausenzähler
115
 mov pzh,pzsh    ;neu setzen
116
 rjmp warte
117
118
takt00:
119
 out sreg,srs    ;Statusregister wiederherstellen
120
 reti        ;fertig
121
takt:    ;ISR Zeitnormal (10 Mikrosekunden)
122
 in srs,sreg    ;Statusregister sichern
123
 out tcnt0,tsw    ;Timer-Startwert setzen
124
 inc pzl      ;Pausenzähler
125
 brne takt1      ;Übertrag? nein...
126
 inc pzh      ;ja
127
takt1:
128
 inc zz        ;Zeit-Zähler erhöhen
129
 breq takt00    ;0 nicht auswerten...
130
 cp zz,ib      ;Impulsbreite Sendertastung?
131
 brne takt3      ;nein...
132
 cbi portd,0    ;ja, Sendeimpuls abschalten
133
 tst ia        ;Kanalimpulsdauer berechnen und zuweisen?
134
 breq takt00    ;nein, Sync-Pause...
135
 cpi iq,255      ;ja, digitale Signalquelle? (Kanal 7)
136
 breq takt2      ;ja...
137
 in awl,adcl    ;Analogwert
138
 in awh,adch    ;lesen
139
 ror awh      ;10-Bit-Wert
140
 ror awl      ;durch 8 teilen
141
 ror awh      ;
142
 ror awl      ;(ergibt 7-Bit-Wert
143
 ror awh      ;in awl)
144
 ror awl      ;(0...127)
145
 cpi awl,14      ;Wert kleiner als Mitte-50?
146
 brpl takt1a    ;nein...
147
 ldi awl,14      ;ja, korregieren
148
takt1a:
149
 cpi awl,114    ;Wert größer als Mitte+50?
150
 brmi takt1b    ;nein...
151
 ldi awl,114    ;ja, korregieren
152
takt1b:
153
 add ia,awl      ;Wert zum Basisimpuls addieren
154
 out sreg,srs    ;Statusregister wiederherstellen
155
 reti        ;fertig
156
takt2:    ;Schalteingang für Kanal7
157
 ldi awl,64      ;Mittelwert als Voreinstellung
158
 sbis pinb,5    ;Taste1?
159
 ldi awl,64-schalt  ;ja, kürzerer Impuls
160
 sbis pinb,4    ;Taste2?
161
 ldi awl,64+schalt  ;ja, längerer Impuls
162
 add ia,awl      ;Wert zum Basisimpuls addieren
163
 out sreg,srs    ;Statusregister wiederherstellen
164
 reti        ;fertig
165
166
takt3:
167
 cp zz,ia      ;Kanalimpulsbreite erreicht?
168
 brne takt00    ;nein...
169
 clr zz        ;ja, Zeitzähler löschen
170
 ldi u2,1      ;Sendertastimpuls ein,
171
 out portd,u2    ;Kanalimpulse erstmal alle aus
172
 ldi ia,0      ;Leerwert für Impulsabstand (Pause)
173
 dec iq        ;nächster Analogkanal
174
 cpi iq,5      ;Kanal 1?
175
 brne takt3a    ;nein...
176
 sbi portd,1    ;ja, Impuls 1 einschalten
177
 ldi ia,bi      ;Impulsabstand (= Kanalimpulsbreite) erstmal auf Minimum setzen
178
 out admux,iq    ;Analogkanal wählen
179
takt3a:
180
 cpi iq,4      ;Kanal 2?
181
 brne takt3b    ;nein...
182
 sbi portd,2    ;ja, Impuls 2 einschalten
183
 ldi ia,bi      ;Impulsabstand (= Kanalimpulsbreite) erstmal auf Minimum setzen
184
 out admux,iq    ;Analogkanal wählen
185
takt3b:
186
 cpi iq,3      ;Kanal 3?
187
 brne takt3c    ;nein...
188
 sbi portd,3    ;ja, Impuls 3 einschalten
189
 ldi ia,bi      ;Impulsabstand (= Kanalimpulsbreite) erstmal auf Minimum setzen
190
 out admux,iq    ;Analogkanal wählen
191
takt3c:
192
 cpi iq,2      ;Kanal 4?
193
 brne takt3d    ;nein...
194
 sbi portd,4    ;ja, Impuls 4 einschalten
195
 ldi ia,bi      ;Impulsabstand (= Kanalimpulsbreite) erstmal auf Minimum setzen
196
 out admux,iq    ;Analogkanal wählen
197
takt3d:
198
 cpi iq,1      ;Kanal 5?
199
 brne takt3e    ;nein...
200
 sbi portd,5    ;ja, Impuls 5 einschalten
201
 ldi ia,bi      ;Impulsabstand (= Kanalimpulsbreite) erstmal auf Minimum setzen
202
 out admux,iq    ;Analogkanal wählen
203
takt3e:
204
 cpi iq,0      ;Kanal 6?
205
 brne takt3f    ;nein...
206
 sbi portd,6    ;ja, Impuls 6 einschalten
207
 ldi ia,bi      ;Impulsabstand (= Kanalimpulsbreite) erstmal auf Minimum setzen
208
 out admux,iq    ;Analogkanal wählen
209
takt3f:
210
 cpi iq,255      ;Kanal 7?
211
 brne takt0      ;nein...
212
 sbi portd,7    ;ja, Impuls 7 einschalten
213
 ldi ia,bi      ;Impulsabstand (= Kanalimpulsbreite) erstmal auf Minimum setzen
214
takt0:
215
 out sreg,srs    ;Statusregister wiederherstellen
216
 reti        ;fertig