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
|