2k_v4_8_switch.c


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