1 | /*
|
2 | *******************************************************************
|
3 |
|
4 | Autor: Beck Martin
|
5 | Taktfrequenz: 8 MHz
|
6 | Chip: Atmel atMega 8
|
7 | Datum: August 2015
|
8 |
|
9 | Bezeichnung: 2 Kanal 20 Funktionen Multiswitch - 2k20fms
|
10 | Hintergund: Grund für dieses Prgramm war die fehlende kostenguenstige Moeglichkeit mir nur
|
11 | 2 Schaltknueppeln (jeweils 3 Wege Schalter) die 20 Funktionen meines
|
12 | meines Schleppschiffs = Rettungsschiffs zu steuern.
|
13 |
|
14 | Funktionsbeschreibung:
|
15 |
|
16 | Wenn ein Schalter von 0 = Neutralstellung in eine Endlage = 100 oder -100 gebracht wird, wird dies
|
17 | als Schaltimpuls gewertet und dabei entweder als "lang" oder "kurz" gewertet.
|
18 | Voreingestellt ist hier 500 ms = 0,5 Sekunden, was eine vernünftige Schaltfrequenz sein dürfte.
|
19 |
|
20 | Beispiel:
|
21 |
|
22 | - Schalter vom RC Sender auf 100 % für eine kurze Zeit von 0,35 s schaltet Ausgang 1
|
23 |
|
24 | - Schalter vom RC Sender auf -100 % für eine kurze Zeit von 0,35 s schaltet Ausgang 2
|
25 |
|
26 | - Schalter vom RC Sender auf 100 % für eine lange Zeit von >0,35 s schaltet Ausgang 3
|
27 |
|
28 | - Schalter vom RC Sender auf -100 % für eine lange Zeit von >0,35 s schaltet Ausgang 4
|
29 |
|
30 | Der Zustand bleibt bestehen (Memory) bis erneut der entsprechende Ausgang geschalten wurde.
|
31 | Wahlweise kann der Ausgang auch "tastend" sein, was jedoch nur bei den "direkten" Schaltzuständen
|
32 | ohne Kombination wirklich sinnvoll ist.
|
33 |
|
34 | Ausgelegt ist die Schaltung für 2 Schalter mit je 2 Tastfunktionen (oben / unten)
|
35 | Sie müßte jedoch auch mit Schaltern funktionieren, wurde jedoch nicht getestet.
|
36 |
|
37 | Mein Test: Graupner MX-20 (Schalterumbau) mit 6 Kanalempfänger
|
38 | Futaba FX-30 (Schalterumbau) mit 12 Kanalempfänger
|
39 |
|
40 | Wichtiger Hinweis zum Schluß:
|
41 |
|
42 | __ -- Die vorliegende Software ist für private Zwecke frei verwendbar, -- __
|
43 | __ -- jedoch ist eine kommerzielle Verwendung, egal welcher Art nicht gestattet. -- __
|
44 |
|
45 | *******************************************************************
|
46 |
|
47 | +------------+
|
48 | (PCINT14/RESET) PC6 -| 1 28 |- PC5 (ADC5/SCL/PCINT13)
|
49 | (PCINT16/RXD) PD0 -| 2 27 |- PC4 (ADC4/SDA/PCINT12)
|
50 | (PCINT17/TXD) PD1 -| 3 26 |- PC3 (ADC3/PCINT11)
|
51 | PCINT18/INT0) PD2 -| 4 25 |- PC2 (ADC2/PCINT10)
|
52 | (PCINT19/OC2B/INT1) PD3 -| 5 24 |- PC1 (ADC1/PCINT9)
|
53 | (PCINT20/XCK/T0) PD4 -| 6 23 |- PC0 (ADC0/PCINT8)
|
54 | VCC -| 7 22 |- GND
|
55 | GND -| 8 21 |- AREF
|
56 | (PCINT6/XTAL1/TOSC1) PB6 -| 9 20 |- AVCC
|
57 | (PCINT7/XTAL2/TOSC2) PB7 -| 10 19 |- PB5 (SCK/PCINT5)
|
58 | (PCINT21/OC0B/T1) PD5 -| 11 18 |- PB4 (MISO/PCINT4)
|
59 | (PCIN T22/OC0A/AIN0) PD6 -| 12 17 |- PB3 (MOSI/OC2A/PCINT3)
|
60 | (PCINT23/AIN1) PD7 -| 13 16 |- PB2 (SS/OC1B/PCINT2)
|
61 | (PCINT0/CLKO/ICP1) PB0 -| 14 15 |- PB1 (OC1A/PCINT1)
|
62 | +------------+
|
63 |
|
64 |
|
65 | Verwendung in diesem Programm:
|
66 |
|
67 |
|
68 | +------------+
|
69 | n.b.--- <- PC6 -| 1 28 |- PC5 -> A_6
|
70 | A_7 <- PD0 -| 2 27 |- PC4 -> A_5
|
71 | A_8 <- PD1 -| 3 26 |- PC3 -> A_4
|
72 | * E_1 -> PD2 -| 4 25 |- PC2 -> A_3
|
73 | * E_2 -> PD3 -| 5 24 |- PC1 -> A_2
|
74 | A_9 <- PD4 -| 6 23 |- PC0 -> A_1
|
75 | VCC -| 7 22 |- GND
|
76 | GND -| 8 21 |- AREF
|
77 | A_19 <- PB6 -| 9 20 |- AVCC
|
78 | A_20 <- PB7 -| 10 19 |- PB5 -> A_18
|
79 | A_10 <- PD5 -| 11 18 |- PB4 -> A_17
|
80 | A_11 <- PD6 -| 12 17 |- PB3 -> A_16
|
81 | A_12 <- PD7 -| 13 16 |- PB2 -> A_15
|
82 | A_13 <- PB0 -| 14 15 |- PB1 -> A_14
|
83 | +------------+
|
84 |
|
85 |
|
86 | *******************************************************************
|
87 | */
|
88 |
|
89 |
|
90 | // *******************************************************************
|
91 | // Hardwarespezifische Parameter - nur bei Bedarf und bewußt aendern!! - Bei Veraenderungen wird
|
92 | // das Programm ggf. in dieser Form unbrauchbar und muß abgeaendert werden!!
|
93 |
|
94 |
|
95 | // *******************************************************************
|
96 | //
|
97 | // allgemeine und Chip spezifische Parameter
|
98 | //
|
99 | // *******************************************************************
|
100 |
|
101 |
|
102 |
|
103 | // --- Hardware definieren
|
104 |
|
105 | #define F_CPU 8000000 // 8000000UL
|
106 |
|
107 | // --- notwendige Hilfsdateien einbeinden
|
108 |
|
109 | #include <avr/io.h>
|
110 | #include <avr/interrupt.h>
|
111 | #include <avr/wdt.h>
|
112 | #include <util\delay.h>
|
113 |
|
114 |
|
115 | // *******************************************************************
|
116 | //
|
117 | // selbst zu definierende Eingaenge, Ausgaenge und Parameter
|
118 | //
|
119 | // *******************************************************************
|
120 |
|
121 | // --- Die Eingaenge --- selbst zu definieren
|
122 |
|
123 | #define TASTERPORT PINC
|
124 | #define TASTERBIT PINC1
|
125 |
|
126 | #define E_1_Bit PD2 // Eingangssignal 1 vom Empfaenger (Kanal 4)
|
127 | #define E_1_Pin PIND // PIN des Eingangssignals 1 vom Empfaenger (Kanal 4)
|
128 | #define E_1_Port PORTD // Port des Eingangssignals 1 vom Empfaenger (Kanal 4)
|
129 |
|
130 | #define E_2_Bit PD3 // Eingangssignal 2 vom Empfaenger (Kanal 5)
|
131 | #define E_2_Pin PIND // PIN des Eingangssignals 2 vom Empfaenger (Kanal 5)
|
132 | #define E_2_Port PORTD // Port des Eingangssignals 2 vom Empfaenger (Kanal 5)
|
133 |
|
134 | #define E_DirReg DDRD // Richtungsregister des Eingangssignals 1 und 2 vom Empfaenger (Kanal 4 und 5)
|
135 |
|
136 |
|
137 | // --- Die Ausgaenge --- selbst zu definieren -- ggf. im Hauptprogramm Ports anpassen
|
138 |
|
139 | #define A_1 PC0 // Vor Rueck auf Rechts Links -> umschalten (an / aus)
|
140 | #define A_2 PC1 // Schraube auf Geblaese -> umschalten (an / aus)
|
141 | #define A_3 PC2 // Rettungsmaßnahme einholen -> ein / aus = automatischer Stop
|
142 | #define A_4 PC3 // Rettungsmaßnahme 1 Abschuß -> ein / aus = automatischer Stop
|
143 | #define A_5 PC4 // Rettungsmaßnahme 2 Abschuß -> ein / aus = automatischer Stop
|
144 | #define A_6 PC5 // Licht innen (unten) -> an /aus
|
145 |
|
146 | // #define A_21 PC6 // -- nicht belegt da Reset
|
147 |
|
148 | #define A_7 PD0 // Rauchgenerator -> an / aus - oder mit Fuellstandssensor bei "an")
|
149 | #define A_8 PD1 // Ankerwinde -> auf / ab / Freier Fall (= Tastsignal auf Tiny übergeben)
|
150 | #define A_9 PD4 // Sound Voegel / Geraeusche -> an / aus
|
151 | #define A_10 PD5 // Fahrtmusik von MP3 Spieler -> an = Tastsignal an Tiny - Fahrtmusik / Diverse Musik / aus
|
152 | #define A_11 PD6 // Nebelhorn - Sound (PIN = "tastend") MP3 Spieler -> an / aus
|
153 | #define A_12 PD7 // Licht Abschleppbereich (Heck) und Arbeitsbereich (Bug) -> an / aus
|
154 |
|
155 | #define A_13 PB0 // Positionslichter -> an / aus ("an" mit Helligkeitssensor)
|
156 | #define A_14 PB1 // Licht Suchscheinwerfer -> an / aus
|
157 | #define A_15 PB2 // Licht Steuerhaus -> an / aus
|
158 | #define A_16 PB3 // Licht Steuerkonsole -> an / aus
|
159 | #define A_17 PB4 // Querstahlruder -> an = Motor Querstahlruder Bug + Heck => Loeschmonitor A19 und A20 aus! / aus -> A19 mögl. ein
|
160 | #define A_18 PB5 // Loeschwasserpumpe -> an = Servo 1 = Monitor 1 drehen + Servo 2 = Monitor 2 drehen - nur wenn A18 und A20 aus! / aus
|
161 | #define A_19 PB6 // Servo fuer Rettungsmaßnahme rechts / links -> nur wenn A18 aus und A19 aus !!
|
162 | #define A_20 PB7 // Kontroll LED für Microkontroller IC Feedback automatisch und Ton Feedback für Steuersignal (mit Jumper Signal ein / aus)
|
163 |
|
164 | #define A_1_6_Port PORTC // Port des Ausgangssignals 1 bis 6
|
165 | #define A_7_12_Port PORTD // Port des Ausgangssignals 7 bis 12
|
166 | #define A_13_20_Port PORTB // Port des Ausgangssignals 16 bis 20
|
167 |
|
168 |
|
169 | // --- Parameter --- selbst zu definieren
|
170 |
|
171 | volatile unsigned int schaltdauer = 350; // x10 ms; // Zeit bis zum Wechsel des Schaltzustandes in ms für "langen Schaltzustand"
|
172 | // Wert als vielfaches von 10
|
173 |
|
174 | // *******************************************************************
|
175 | //
|
176 | // diverse sonstige Variablen im Programm
|
177 | //
|
178 | // *******************************************************************
|
179 |
|
180 |
|
181 | volatile unsigned int impuls_E1= 0; // Impuls Signal Eingang 1
|
182 | volatile unsigned int impuls_E2= 0; // Impuls Signal Eingang 2
|
183 | volatile unsigned int signal_1 = 0; // Impulslänge Signal Eingang 1
|
184 | volatile unsigned int signal_2 = 0; // Impulslänge Signal Eingang 2
|
185 |
|
186 | volatile unsigned int schaltzeit_cnt = 0; // Zaehler für Schaltzeit
|
187 | volatile unsigned int schaltzeit_cnt1 = 0; // Zaehler für Schaltzeit E1
|
188 | volatile unsigned int schaltzeit_cnt2 = 0; // Zaehler für Schaltzeit E1
|
189 | volatile unsigned char aus_E1 = 0; // Aus Signal E1 kommend
|
190 | volatile unsigned char aus_E2 = 0; // Aus Signal E2 kommend
|
191 |
|
192 |
|
193 |
|
194 | volatile unsigned char schaltzustand = 0; // Allgemeiner Schaltzustand
|
195 | volatile unsigned char schaltzustand_1 = 0; // Schaltzusand E1 / E2 (je max. 255 Stück!!)
|
196 | volatile unsigned char schaltzustand_2 = 0;
|
197 | // volatile unsigned int schaltzustand_ausgabe = 0; // Ausgabe des Schaltzustandes für Hauptprogramm
|
198 | volatile unsigned int schaltzyklus_cnt = 0; // Zaehler für komplette Schaltzyklen
|
199 | volatile unsigned int schalt_cnt_1_o = 0; // Zaehler fuer Schaltzustaende E1_oben
|
200 | volatile unsigned int schalt_cnt_1_u = 0; // Zaehler fuer Schaltzustaende E1_unten
|
201 | volatile unsigned int schalt_cnt_2_o = 0; // Zaehler fuer Schaltzustaende E2_oben
|
202 | volatile unsigned int schalt_cnt_2_u = 0; // Zaehler fuer Schaltzustaende E2_unten
|
203 | volatile unsigned int schaltzeit = 0;
|
204 |
|
205 |
|
206 |
|
207 | volatile unsigned int mid_1 = 0; // signal_mittelwert_1 / 2
|
208 | volatile unsigned int mid_2 = 0;
|
209 | volatile unsigned char i1; // Zählvariable Signal 1 / 2
|
210 | volatile unsigned char i2;
|
211 | volatile unsigned char wechselabwarten_1 = 0; // warten auf mittelstellung_1 / 2
|
212 | volatile unsigned char wechselabwarten_2 = 0;
|
213 | volatile unsigned char t1 = 0; // Merker fuer Schalter als TipTaster 1 - 10
|
214 | volatile unsigned char t2 = 0;
|
215 | volatile unsigned char t3 = 0;
|
216 | volatile unsigned char t4 = 0;
|
217 | volatile unsigned char t5 = 0;
|
218 | volatile unsigned char t6 = 0;
|
219 | volatile unsigned char t7 = 0;
|
220 | volatile unsigned char t8 = 0;
|
221 | volatile unsigned char t9 = 0;
|
222 | volatile unsigned char t10 = 0;
|
223 | volatile unsigned int t_zaehler = 0; // Zaehler fuer TipTaster Merker
|
224 | volatile unsigned char ton = 0; // Merker fuer Ton
|
225 | volatile unsigned int ton_zaehler = 0; // Zaehler fuer Ton
|
226 |
|
227 |
|
228 |
|
229 | volatile unsigned char sound = 0;
|
230 | volatile unsigned int soundpresc = 0;
|
231 | volatile unsigned char watch = 0;
|
232 | volatile unsigned int fail = 0;
|
233 |
|
234 |
|
235 | // *******************************************************************
|
236 | //
|
237 | // Unterprogramme (void), Timer und Interrupts
|
238 | //
|
239 | // *******************************************************************
|
240 |
|
241 |
|
242 | // Interrupts
|
243 |
|
244 | ISR (TIMER1_COMPA_vect) // 100.000 Hz = 10.000 mySekundy
|
245 | {
|
246 |
|
247 | if(PIND & (1<<PD2)) // Signallänge messen -> an E1 = Kanal 1 empfangen
|
248 | {
|
249 | impuls_E1++;
|
250 | }
|
251 | else if(impuls_E1!=0)
|
252 | {
|
253 | if(impuls_E1>255)
|
254 | signal_1=0;
|
255 | else
|
256 | signal_1=impuls_E1;
|
257 | impuls_E1=0;
|
258 | }
|
259 |
|
260 | if(PIND & (1<<PD3)) // Signallänge messen -> an E2 = Kanal 2 empfangen
|
261 | {
|
262 | impuls_E2++;
|
263 | }
|
264 | else if(impuls_E2!=0)
|
265 | {
|
266 |
|
267 | if(impuls_E2>255)
|
268 | signal_2=0;
|
269 | else
|
270 | signal_2=impuls_E2;
|
271 | impuls_E2=0;
|
272 | }
|
273 |
|
274 |
|
275 | watch = 1; //Signal fuer Hauptschlaeife, den (Wach)Hund zu fuettern
|
276 | fail++; //Zeitramen fuer Plausibilitaetstest erhoehen
|
277 | // --- noch implementieren
|
278 |
|
279 |
|
280 |
|
281 | }
|
282 |
|
283 |
|
284 | ISR (TIMER2_OVF_vect) //Alle 10 ms
|
285 | {
|
286 |
|
287 | schaltzeit_cnt++;
|
288 |
|
289 | TCNT2 = 178; // = 0b10110010 = 0xB2 // TCNT2 = 0x06; // = 6
|
290 | OCR2 = 77 ; // = 0b01001101 = 0x4D
|
291 |
|
292 |
|
293 |
|
294 | }
|
295 |
|
296 |
|
297 |
|
298 | // *******************************************************************
|
299 | // Timer
|
300 |
|
301 |
|
302 |
|
303 |
|
304 | void startTimer1() // alle 10 uSec = 100.000 Hz
|
305 | {
|
306 | TCNT1 = 0b1111111111110110;
|
307 | TCCR1B |= (1 << CS11) | (1 << WGM12); // | (1 << CS10) //Timer1 CTC /8
|
308 | OCR1B = 0x0009;
|
309 | TIMSK |= (1 << OCIE1A) | (1<<TOIE1) ; //| (1<<OCIE2) |(1 << OCIE1B) ;
|
310 |
|
311 |
|
312 |
|
313 | }
|
314 |
|
315 |
|
316 | void startTimer2() // als Abfrage 500 ms als vielfaches von 10 (9.9840) ms
|
317 | { // 500 / 10 ms = 50 mal
|
318 |
|
319 | schaltzeit_cnt = 0;
|
320 | schaltzeit_cnt1 = 0;
|
321 | schaltzeit_cnt2 = 0;
|
322 |
|
323 | TCCR2 |= (1 << CS22) | (1 << CS21) | (1 << CS20); // = 0b00000111 // TCCR2 |= (1 << CS22); // 64 Prescaler 2 ms
|
324 |
|
325 | TCNT2 = 178; // = 0b10110010 = 0xB2 // TCNT2 = 0x06; // = 6
|
326 | OCR2 = 77 ; // = 0b01001101 = 0x4D // OCR2 = 0xF9; // = 249
|
327 | TIMSK |= (1 << OCIE2) | (1<<TOIE2) ;
|
328 |
|
329 |
|
330 | }
|
331 |
|
332 |
|
333 |
|
334 |
|
335 |
|
336 |
|
337 |
|
338 |
|
339 |
|
340 | void stopTimer1()
|
341 | {
|
342 | TCCR1B = 0b00000000; // Prescaler auf 0 -> stopt Timer1
|
343 | }
|
344 |
|
345 | void stopTimer2()
|
346 | {
|
347 | TCCR2 = 0b00000000; // Prescaler auf 0 -> stopt Timer2
|
348 | }
|
349 |
|
350 |
|
351 |
|
352 |
|
353 |
|
354 |
|
355 |
|
356 |
|
357 | // *******************************************************************
|
358 | // Unterprogramme
|
359 |
|
360 |
|
361 | void reset_zaehler ()
|
362 | {
|
363 | schalt_cnt_1_u = 0;
|
364 | schalt_cnt_1_o = 0;
|
365 | schalt_cnt_2_u = 0;
|
366 | schalt_cnt_2_o = 0;
|
367 |
|
368 | schaltzustand = 0;
|
369 | schaltzustand_1 = 0;
|
370 | schaltzustand_2 = 0;
|
371 |
|
372 | schaltzeit_cnt = 0;
|
373 | schaltzeit_cnt1 = 0;
|
374 | schaltzeit_cnt2 = 0;
|
375 |
|
376 |
|
377 | }
|
378 |
|
379 |
|
380 |
|
381 | // *******************************************************************
|
382 | //
|
383 | // Hauptprogramm
|
384 | //
|
385 | // *******************************************************************
|
386 |
|
387 |
|
388 | int main(void) // Hauptprogramm Start
|
389 | {
|
390 | cli(); // Interrupts aus für Initialisierung
|
391 |
|
392 |
|
393 | // *******************************************************************
|
394 | // Ports definieren und ggf. vorbelegen
|
395 |
|
396 | DDRC = 0b11111111; // Alles Ausgänge
|
397 | PORTC = 0b00000000; //Alles aus
|
398 |
|
399 | DDRB = 0b11111111; // Alles Ausgänge
|
400 | PORTB = 0b00000000; //Alles aus
|
401 |
|
402 | // Port D mit Eingangsbits 2k20f Programm vorbelegen
|
403 |
|
404 | DDRD = 0b11110011; // Alles Ausgänge
|
405 | PORTD = 0b00000000; //Alles aus
|
406 |
|
407 |
|
408 | // A_13_20_Port = (1<<A_20); // Signal LED ein
|
409 | // A_13_20_Port ^= (1<<A_20); // Siganl LED aus
|
410 | // --- noch implementieren
|
411 |
|
412 | // *******************************************************************
|
413 | // Initialisieren
|
414 | reset_zaehler();
|
415 | startTimer1();
|
416 |
|
417 | schaltzeit = (schaltdauer / 10);
|
418 |
|
419 | sei();
|
420 | // wdt_enable( WDTO_15MS); //Watchdog einschalten
|
421 | // --- noch implementieren
|
422 |
|
423 |
|
424 | // *******************************************************************
|
425 | // Pulslänge mitteln E1 und E2
|
426 |
|
427 |
|
428 | for(i1=0;i1<60;i1++) //Mittlere Periodenlaenge E1 ueber 60 Pulse messen
|
429 | {
|
430 | while(!signal_1);
|
431 | mid_1 += signal_1;
|
432 | }
|
433 | mid_1 /= 60;
|
434 |
|
435 |
|
436 | for(i2=0;i2<60;i2++) //Mittlere Periodenlaenge E2 ueber 60 Pulse messen
|
437 | {
|
438 | while(!signal_2);
|
439 | mid_2 += signal_2;
|
440 | }
|
441 | mid_2 /= 60;
|
442 |
|
443 |
|
444 |
|
445 | // *******************************************************************
|
446 | // Hauptschleife
|
447 |
|
448 |
|
449 | while(1) // Hauptschleife Start
|
450 | {
|
451 |
|
452 |
|
453 |
|
454 | // *******************************************************************
|
455 | // Abfrage und Verarbeitung Eingang 1
|
456 |
|
457 |
|
458 |
|
459 | if(signal_1!=0) //Neuer Impuls E2 ?
|
460 | {
|
461 | schaltzeit_cnt1 =0;
|
462 |
|
463 | if(signal_1>mid_1+20 && !wechselabwarten_1) //Knueppel nach unten und vorher in Mittelstellung?
|
464 | {
|
465 | schaltzeit_cnt1 =0;
|
466 | schaltzeit_cnt = 0;
|
467 |
|
468 | startTimer2();
|
469 |
|
470 | while((signal_1>mid_1+20) && !wechselabwarten_1) //Knueppel nach unten und vorher in Mittelstellung?
|
471 | {
|
472 | schaltzeit_cnt1 = schaltzeit_cnt;
|
473 |
|
474 | if (schaltzeit_cnt1 >= schaltzeit) // Tastend Teil 1
|
475 | {
|
476 | //PORTB ^= (1<<PB1);
|
477 | schaltzeit_cnt1 = 0;
|
478 | schaltzustand_1 = 1;
|
479 |
|
480 | }
|
481 |
|
482 | }
|
483 | stopTimer2();
|
484 |
|
485 | wechselabwarten_1 = 1;
|
486 | schalt_cnt_1_u++; // Anzahl der Schaltvorgaenge
|
487 |
|
488 | if ((1<schaltzeit_cnt1) && (schaltzeit_cnt1< schaltzeit))
|
489 | {
|
490 | //PORTB ^= (1<<PB2);
|
491 | schaltzeit_cnt1 = 0;
|
492 | schaltzustand_1 = 2;
|
493 |
|
494 |
|
495 | }
|
496 | else
|
497 | {
|
498 | schaltzeit_cnt1 = 0;
|
499 | }
|
500 | }
|
501 |
|
502 | schaltzeit_cnt1 =0;
|
503 |
|
504 | if(signal_1<mid_1-20 && !wechselabwarten_1) //Knueppel nach unten und vorher in Mittelstellung?
|
505 | {
|
506 | schaltzeit_cnt1 =0;
|
507 | schaltzeit_cnt = 0;
|
508 |
|
509 | startTimer2();
|
510 |
|
511 | while((signal_1<mid_1-20) && !wechselabwarten_1) //Knueppel nach unten und vorher in Mittelstellung?
|
512 | {
|
513 | schaltzeit_cnt1 = schaltzeit_cnt;
|
514 |
|
515 | }
|
516 | stopTimer2();
|
517 |
|
518 | wechselabwarten_1 = 1;
|
519 | schalt_cnt_1_u++; // Anzahl der Schaltvorgaenge
|
520 |
|
521 | if ((1<schaltzeit_cnt1) && (schaltzeit_cnt1< schaltzeit))
|
522 | {
|
523 | //PORTB ^= (1<<PB3);
|
524 | schaltzeit_cnt1 = 0;
|
525 | schaltzustand_1 = 4;
|
526 | }
|
527 | else if (schaltzeit_cnt1 >= schaltzeit)
|
528 | {
|
529 | //PORTB ^= (1<<PB4);
|
530 | schaltzeit_cnt1 = 0;
|
531 | schaltzustand_1 = 3;
|
532 | }
|
533 |
|
534 | else
|
535 | {
|
536 | schaltzeit_cnt1 = 0;
|
537 | }
|
538 | }
|
539 |
|
540 |
|
541 |
|
542 | if(signal_1>mid_1-10 && signal_1<mid_1+10) //Knueppel in MIttelstellung?
|
543 | {
|
544 | aus_E1 = 1;
|
545 |
|
546 | //schaltzustand_2 = 11;
|
547 |
|
548 | //PORTB &= ~(1 << PB1);
|
549 | wechselabwarten_1 = 0;
|
550 | }
|
551 |
|
552 | fail=0;
|
553 | signal_1=0;
|
554 |
|
555 | }
|
556 |
|
557 |
|
558 |
|
559 | // *******************************************************************
|
560 | // Abfrage und Verarbeitung Eingang 2
|
561 |
|
562 |
|
563 |
|
564 |
|
565 | if(signal_2!=0) //Neuer Impuls E2 ?
|
566 | {
|
567 | schaltzeit_cnt2 =0;
|
568 |
|
569 | if(signal_2>mid_2+20 && !wechselabwarten_2) //Knueppel nach unten und vorher in Mittelstellung?
|
570 | {
|
571 | schaltzeit_cnt2 =0;
|
572 | schaltzeit_cnt = 0;
|
573 |
|
574 | startTimer2();
|
575 |
|
576 | while((signal_2>mid_2+20) && !wechselabwarten_2) //Knueppel nach unten und vorher in Mittelstellung?
|
577 | {
|
578 | schaltzeit_cnt2 = schaltzeit_cnt;
|
579 |
|
580 | if (schaltzeit_cnt2 >= schaltzeit) // Tastend Teil 1
|
581 | {
|
582 | //PORTB ^= (1<<PB1);
|
583 | schaltzeit_cnt2 = 0;
|
584 | schaltzustand_2 = 1;
|
585 |
|
586 | }
|
587 |
|
588 | }
|
589 | stopTimer2();
|
590 |
|
591 | wechselabwarten_2 = 1;
|
592 | schalt_cnt_2_u++; // Anzahl der Schaltvorgaenge
|
593 |
|
594 | if ((1<schaltzeit_cnt2) && (schaltzeit_cnt2< schaltzeit))
|
595 | {
|
596 | //PORTB ^= (1<<PB2);
|
597 | schaltzeit_cnt2 = 0;
|
598 | schaltzustand_2 = 2;
|
599 |
|
600 |
|
601 | }
|
602 | else
|
603 | {
|
604 | schaltzeit_cnt2 = 0;
|
605 | }
|
606 | }
|
607 |
|
608 | schaltzeit_cnt2 =0;
|
609 |
|
610 | if(signal_2<mid_2-20 && !wechselabwarten_2) //Knueppel nach unten und vorher in Mittelstellung?
|
611 | {
|
612 | schaltzeit_cnt2 =0;
|
613 | schaltzeit_cnt = 0;
|
614 |
|
615 | startTimer2();
|
616 |
|
617 | while((signal_2<mid_2-20) && !wechselabwarten_2) //Knueppel nach unten und vorher in Mittelstellung?
|
618 | {
|
619 | schaltzeit_cnt2 = schaltzeit_cnt;
|
620 |
|
621 | }
|
622 | stopTimer2();
|
623 |
|
624 | wechselabwarten_2 = 1;
|
625 | schalt_cnt_2_u++; // Anzahl der Schaltvorgaenge
|
626 |
|
627 | if ((1<schaltzeit_cnt2) && (schaltzeit_cnt2< schaltzeit))
|
628 | {
|
629 | //PORTB ^= (1<<PB3);
|
630 | schaltzeit_cnt2 = 0;
|
631 | schaltzustand_2 = 4;
|
632 | }
|
633 | else if (schaltzeit_cnt2 >= schaltzeit)
|
634 | {
|
635 | //PORTB ^= (1<<PB4);
|
636 | schaltzeit_cnt2 = 0;
|
637 | schaltzustand_2 = 3;
|
638 | }
|
639 |
|
640 | else
|
641 | {
|
642 | schaltzeit_cnt2 = 0;
|
643 | }
|
644 | }
|
645 |
|
646 |
|
647 |
|
648 | if(signal_2>mid_2-10 && signal_2<mid_2+10) //Knueppel in MIttelstellung?
|
649 | {
|
650 | aus_E2 = 1;
|
651 |
|
652 | //schaltzustand_2 = 11;
|
653 |
|
654 | //PORTB &= ~(1 << PB1);
|
655 | wechselabwarten_2 = 0;
|
656 | }
|
657 |
|
658 | fail=0;
|
659 | signal_2=0;
|
660 |
|
661 | }
|
662 |
|
663 |
|
664 |
|
665 | switch (schaltzustand_1)
|
666 | {
|
667 | case 1: {PORTB ^= (1<<PB0); schaltzustand_1=0;}
|
668 | break;
|
669 | case 2: {PORTB ^= (1<<PB1); schaltzustand_1=0;}
|
670 | break;
|
671 | case 3: {PORTB ^= (1<<PB2); schaltzustand_1=0;}
|
672 | break;
|
673 | case 4: {PORTB ^= (1<<PB3); schaltzustand_1=0;}
|
674 | break;
|
675 | }
|
676 |
|
677 | switch (schaltzustand_2)
|
678 | {
|
679 | case 1: {PORTB ^= (1<<PB4); schaltzustand_2=0;}
|
680 | break;
|
681 | //case !1: {PORTB &= ~(1 << PB4); schaltzustand_2=0;} // falls 'aktiv', dann PB4 tastend
|
682 | //break;
|
683 | case 2: {PORTB ^= (1<<PB5); schaltzustand_2=0;}
|
684 | break;
|
685 | case 3: {PORTB ^= (1<<PB6); schaltzustand_2=0;}
|
686 | break;
|
687 | case 4: {PORTB ^= (1<<PB7); schaltzustand_2=0;}
|
688 | break;
|
689 | }
|
690 |
|
691 |
|
692 |
|
693 |
|
694 |
|
695 |
|
696 |
|
697 |
|
698 |
|
699 |
|
700 |
|
701 |
|
702 |
|
703 |
|
704 | // *******************************************************************
|
705 | // Watchdog ueberpruefen und ggf. zuruecksetzen
|
706 |
|
707 |
|
708 | // --- noch implementieren
|
709 |
|
710 |
|
711 | // *******************************************************************
|
712 | // Fail safe
|
713 |
|
714 | // --- noch implementieren
|
715 |
|
716 | } // Hauptschleife Ende
|
717 | } // Hauptprogramm Ende
|