main.c


1
#include "msp430f5529.h"            // Einbinden der Definitionen
2
3
#define  T_OnOff   0x02     // Taster an P1.1
4
#define  T_Step    0x02     // Taster an P2.1, Veränderung Pulsbreite bzw. Frequenz
5
#define  LED_On    0x80     // LED 2 an P4.7
6
#define  LED_WG    0x10     // Signal sowohl an LED als auch am Pin 7.4
7
8
#define  N_Blinken 3 * 2    // 3x ON 3x OFF ....
9
#define  N_2Hz     5        // 5x wait_0s1 = 0,5s ==> 2Hz
10
11
12
13
14
15
16
// __________ Prototypen der verwenndeten Funktionen _________________
17
//Alle Funktionen, welche im Programm verwendet werden
18
//sind dem Compiler bekann zu machen.
19
20
void Entprell(void);      // Entprellen der Taster
21
void Ports (void);         // Initialisierung der Ports
22
void TimerA1 (void);       // Init des Timers A1
23
void TimerB0 (void);
24
void INIT_TA2(void);
25
void INIT_TA0(void);
26
27
28
void Ausgabe_Pulsbreite (unsigned int Zahl);
29
void Ausgabe_Frequenz (unsigned int Zahl);
30
31
void Ausgabe_Fvorgegeben (unsigned int Zahl);
32
void Ausgabe_Pvorgegeben (unsigned int Zahl);
33
//void Ausgabe_Modus (unsigned int Zahl);
34
35
//void Pulswobbel (void);
36
//void Frequenzwobbel (void);
37
void Modiwechsel (void);
38
39
void System_Start(void);
40
void System_Stop(void);
41
void System_Err(void);
42
void ZahlToEinerZehner(unsigned int);
43
void ZahlToString(unsigned int);
44
45
extern void INIT_UART1(void);
46
extern void TX_String(unsigned char *cx);
47
extern void TX_BYTE(unsigned char xc);
48
49
50
// ___________  Globale Variablen ______________________________________
51
unsigned int ZustandProg = 0;  // Zustans-Merker des Programms
52
                               // 0 : deaktiv
53
                               // 1 : im Hochlauf
54
                               // 2 : aktiv
55
                               // 3 : im Runterlauf
56
unsigned int Counter = 0;      // Zähler mit Startwert = 0 (0...65535)
57
unsigned int tx = 0;           // Aktions-Merker für Timer
58
59
60
unsigned int Frequenz = 20960;        // 50 Hz, 0,02 -> (1,048 MHZ/ 50 HZ)
61
unsigned int Periodendauer = 20960;
62
63
unsigned int Frequenz_Ak = 50;
64
unsigned int Frequenz_Step = 10;   // Schrittweite 10 Prozent von Frequenz
65
unsigned int Frequenz_Min = 10;       // Maximale Frequenz von 100 HZ
66
unsigned int Frequenz_Max = 90;       // Minimale Frequenz von 10 HZ
67
68
unsigned int Pulsbreite_Ak = 50;
69
unsigned int Pulsbreite_Step = 10;
70
unsigned int Pulsbreite_Min = 10;
71
unsigned int Pulsbreite_Max = 90; 
72
73
unsigned int PWM_Min = 5;               // Parameter für Pulswobbel
74
unsigned int PWM_Max = 95;
75
unsigned int PWM_Aktuell = 5;
76
unsigned int PWM_Step = 5;
77
78
unsigned int FRQ_Min = 5;               // Parameter für Frequenzwobbel
79
unsigned int FRQ_Max = 95;
80
unsigned int FRQ_Aktuell = 5;
81
unsigned int FRQ_Step = 5;
82
83
unsigned int PWM_Step_Dir = 1;       // Schrittrichtung
84
                                     // 0 : Rückwärts
85
                                     // 1 : Vorwärts
86
unsigned int FRQ_Step_Dir = 1;       // Schrittrichtung 
87
                                     // 0 : Rückwärts
88
                                     // 1 : Vorwärts
89
 
90
unsigned int FRQ_Dir = 1;            // Wobbelrichtung 
91
                                     // 0: Rückwärts (d.h. von FRQ_Max
92
                                     //                      zu FRQ_Min); 
93
                                     // 1: Vorwärts
94
unsigned int PWM_Dir = 1;
95
96
unsigned int Zahl = 0;
97
unsigned int Einer = 0;
98
unsigned int Zehner = 0;
99
100
101
unsigned int Modus = 0;  // Wahl zwischen Frequenzwobbel und Pulswobbel 
102
                         // 0: Kein Wobbel aktiv
103
                         // 1: Pulswobbel aktiv
104
                         // 2: Frequenzwobbel aktiv
105
// __________ HAUPT-PROGRAMM __________________________
106
int main( void )
107
{
108
  WDTCTL = WDTPW + WDTHOLD;  // WatchDogTimer abschalten
109
  INIT_UART1();
110
  Ports ();
111
  
112
  
113
  ZustandProg = 0; 
114
  tx = 0;
115
  
116
  TX_String("    >>>>>> System neu aktiviert <<<<<<<<\n\n");
117
  TX_String("\n   Start mit T_OnOff\n\n");
118
   _BIS_SR(GIE);
119
  
120
121
  while(1)
122
   {
123
      _NOP();  // tue nichts
124
      if(tx == 1)   // wird durch dem TimerA1 Interrupt gesetzt
125
      {  
126
         switch(ZustandProg)
127
         {
128
            case 1:  // wenn von AUS --> EIN
129
                   System_Start();
130
                   Modus = 1;
131
                   tx = 0;
132
                   break;  
133
            case 2:  // in Betrieb  ==> EIN
134
                   _NOP();
135
                   _NOP();
136
                   tx = 0;
137
                   break;
138
           case 3:  // wenn von EIN --> AUS
139
                   System_Stop();
140
                   Modus = 0;
141
                   tx = 0;
142
                   break;     
143
           default:
144
                   // dieser Zustand dürfte normalerweise nie auftreten, wenn
145
                   // doch, dann liegt wohl ein Fehler vor. In diesem Fall:
146
                   System_Err();
147
                   Modus = 0;
148
                   tx = 0;
149
                   break;
150
         }
151
      }
152
      _NOP();
153
      _NOP();
154
   } 
155
}
156
157
158
159
160
161
// __________ Funktionen __________________________
162
163
164
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
165
// + Funktion: PORTS()
166
// +     Stand .....: 31.12.2019  / JP
167
// +
168
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
169
void Ports(void)
170
{
171
 // Port 1
172
 P1SEL &= ~ T_OnOff;
173
 P1DIR &= ~ T_OnOff;
174
 P1REN |=  T_OnOff;
175
 P1OUT |= T_OnOff;
176
 P1IES &= ~ T_OnOff;
177
 P1IE  |= T_OnOff;
178
 P1IFG &= ~ T_OnOff;
179
   
180
 // Port 2
181
 P2SEL &= ~ T_Step;  
182
 P2DIR &= ~ T_Step;
183
 P2REN |= T_Step;
184
 P2OUT |= T_Step;
185
 P2IES |= T_Step;
186
 P2IE &=~ T_Step;
187
 P2IFG &=~ T_Step;
188
   
189
 // Port 4
190
 P4SEL  &= ~(LED_On);         
191
 P4DIR  |= LED_On;             
192
 P4OUT  &= ~(LED_On);
193
}
194
 
195
    
196
// +----------------------------------------------------------------------
197
// |  SubRoutine zum Entprellen eines Tastes 
198
// |     08.12.2019 /JP
199
// +----------------------------------------------------------------------
200
void Entprell(void)     // Künstliche Programmpause
201
{
202
  unsigned int k = 0x0FFF;
203
  while(k > 0) k--;
204
}
205
206
// +----------------------------------------------------------------------
207
// |  SubRoutinen zur Ausgabe einer Zahl im ZehnerEiner-Format
208
// |    
209
// +----------------------------------------------------------------------
210
211
//Für Pulswobbel
212
void Ausgabe_Pulsbreite(unsigned int Zahl)
213
{
214
  Zehner = 0;
215
  Einer = Zahl;
216
  
217
  while(Einer > 9)
218
  {
219
    Zehner++;
220
    Einer = Einer - 10;
221
  }
222
  
223
  TX_String("Aktuelle Pulsbreite = ");
224
  ZahlToString(Zehner);
225
  ZahlToString(Einer);
226
  TX_String("%\n");
227
}
228
229
// Für Frequenzwobbel
230
void Ausgabe_Frequenz(unsigned int Zahl)
231
{
232
  Zehner = 0;
233
  Einer = Zahl;
234
  
235
  while(Einer > 9)
236
  {
237
    Zehner++;
238
    Einer = Einer - 10;
239
  }
240
  
241
  TX_String("Aktuelle Frequenz = ");
242
  ZahlToString(Zehner);
243
  ZahlToString(Einer);
244
  TX_String("%\n");
245
}
246
247
// Für Ausgabe der aktuell eingestellten Periodendauer in Prozent
248
void Ausgabe_Pvorgegeben(unsigned int Zahl)
249
{
250
  Zehner = 0;
251
  Einer = Zahl;
252
  
253
  while(Einer > 9)
254
  {
255
    Zehner++;
256
    Einer = Einer - 10;
257
  }
258
  
259
  TX_String("Aktuell eingestellte Pulsbreite = ");
260
  ZahlToString(Zehner);
261
  ZahlToString(Einer);
262
  TX_String("%\n");
263
}
264
265
// Für Ausgabe der aktuell eingestellten Frequenz in Prozent
266
void Ausgabe_Fvorgegeben(unsigned int Zahl)
267
{
268
  Zehner = 0;
269
  Einer = Zahl;
270
  
271
  while(Einer > 9)
272
  {
273
    Zehner++;
274
    Einer = Einer - 10;
275
  }
276
  
277
  TX_String("Aktuell eingestellte Frequenz= ");
278
  ZahlToString(Zehner);
279
  ZahlToString(Einer);
280
  TX_String("%\n");
281
}
282
283
284
void ZahlToString(unsigned int Zahl)
285
{
286
  if(Zahl == 0) { TX_String("0"); }
287
  else if(Zahl == 1) { TX_String("1"); }
288
  else if(Zahl == 2) { TX_String("2"); }
289
  else if(Zahl == 3) { TX_String("3"); }
290
  else if(Zahl == 4) { TX_String("4"); }
291
  else if(Zahl == 5) { TX_String("5"); }
292
  else if(Zahl == 6) { TX_String("6"); }
293
  else if(Zahl == 7) { TX_String("7"); }
294
  else if(Zahl == 8) { TX_String("8"); }
295
  else if(Zahl == 9) { TX_String("9"); }
296
}
297
298
299
// +----------------------------------------------------------------------
300
// |  SubRoutine zum Initialisiern und starten des Timers A1 Frequenzwobbel
301
// |     01.01.2019 / JP
302
// +----------------------------------------------------------------------            
303
              
304
void TimerA1 (void)
305
{
306
  TA1CTL = TACLR;       // Timer-Counter RESET auf Null
307
  TA1CCR0 = (int) ((float) (FRQ_Aktuell) / 100 *(float)(Periodendauer));
308
  TA1CCTL0 = OUTMOD_7;       // Interrupt bei TA1CCR0
309
  TA1CCR1 = Periodendauer; 
310
  TA1CTL = TASSEL_2;      // Taktquelle SMCLK; 1,048 MHz kHz
311
  TA1CTL = ID_0;         // Teiler 1
312
  TA1CTL = MC_1;         // UP-Modus gewählt    
313
}
314
315
// +----------------------------------------------------------------------
316
// |  SubRoutine zum Initialisiern und starten des Timers B0 Pulswobbel
317
// |     01.01.2019 / JP
318
// +----------------------------------------------------------------------  
319
void TimerB0 (void)
320
{
321
  TB0CTL = TBCLR; 
322
  TB0CCR0 = Frequenz; 
323
  TB0CCTL2 = OUTMOD_7; 
324
  TB0CCR2 = (int)((float)(PWM_Aktuell) / 100 * (float)(Frequenz));
325
  TB0CTL = TBSSEL_2 + MC_1 + ID_0;   // SMCLK, 1:1, UP-Mode
326
}
327
328
329
// +----------------------------------------------------------------------
330
// |  SubRoutine zum Initialisiern und starten des Timers
331
// |     
332
// +----------------------------------------------------------------------
333
void INIT_TA2(void)
334
{
335
  TA2CTL = TACLR;   // Timer-Counter RESET auf Null
336
  TA2CCR0 = 16384;  // für 0,5s bei ACLKK, 1:1 und UP-Mode
337
  TA2CCTL0 = CCIE;  // Interrupt wenn Timer-Counter == TA1CCR0
338
  TA2CTL = TASSEL_1 + ID_0 + MC_1;
339
}
340
  
341
// +----------------------------------------------------------------------
342
// |  SubRoutine zum Initialisiern und starten des Timers
343
// |     
344
// +----------------------------------------------------------------------
345
void INIT_TA0(void)
346
{
347
  TA0CTL = TACLR;                               // Timer-Counter RESET auf Null
348
  TA0CCR0 = 65535;                              // 2s
349
  TA0CCTL0 = CCIE;                              // Interrupt bei TA2CCR0
350
  TA0CTL = TASSEL_1 + ID_0 + MC_1;              // ACLKK, 1:1, UP-Mode
351
}
352
353
354
  // +----------------------------------------------------------------------
355
// |  SubRoutine beim System aktivieren von Zustand AUS --> EIN
356
// |     05.01.2020/ JP
357
// +----------------------------------------------------------------------
358
void System_Start(void)
359
{
360
   if(P4OUT & LED_On)   // wenn LED_ON = EIN
361
   {
362
     P4OUT &= ~(LED_On);
363
     TX_BYTE('o');
364
   }
365
   else
366
   {
367
     P4OUT |= LED_On;
368
   }
369
   Counter++;   // Erhöhe Blink-Zähler um 1
370
   
371
   if(Counter  >= N_Blinken)
372
   {
373
     
374
     ZustandProg = 2;     // Zustand: EIN
375
     
376
     
377
     TA2CTL = 0x00;       // Timer für Start / Stop = AUS
378
     tx = 1;              // weil über den Timer nicht mehr gesetzt wird
379
     
380
     P7SEL |= LED_WG;   // LED_WG = Spez. Out 
381
     P7DIR |= LED_WG;   // LED_WG auf Timer TB0
382
     
383
     // Hier Grundeinstellung auf Pulswobbel
384
     
385
     
386
     TimerB0();              // START Timer Pulswobbel
387
     Modus = 1;              // Modus Pulswobbel
388
     PWM_Dir = 1,            // Pulsbreite wird größer 
389
     
390
     
391
     P2IFG &= ~(T_Step);
392
     P2IE |= T_Step;       // Freigebe Taster für Interrupt
393
     P4OUT |= LED_On;     // LED_ON sicher auf EIN setzen
394
     TX_String("\n\nSystem aktiviert\n\n");
395
     
396
  
397
     Ausgabe_Pulsbreite(PWM_Aktuell);
398
     if(PWM_Step_Dir == 0)
399
     {TX_String("T_Step : +5%\n\n");}
400
     else
401
     {TX_String("T_Step : +5%\n\n");}
402
   }  
403
}
404
     
405
406
// +----------------------------------------------------------------------
407
// |  SubRoutine beim System deaktivieren von Zustand EIN --> AUS
408
// |     05.01.2020/ JP
409
// +----------------------------------------------------------------------
410
void System_Stop(void)
411
{
412
    P7SEL &= ~(LED_WG);            // LED_WG = Spez. Out 
413
    P7DIR |= LED_WG;            // LED_WG auf Timer TB0  
414
  
415
   if(P4OUT & LED_On)   // wenn LED_On = EIN
416
   {
417
     // LED's EIN, dann --> AUS
418
     P4OUT &= ~(LED_On);
419
     P7OUT &= ~(LED_WG);
420
     TX_BYTE('o');
421
   }
422
   else
423
   {
424
     // LED's AUS, dann --> EIN
425
     P4OUT |= LED_On;
426
     P7OUT |= LED_WG;
427
   }
428
   
429
   Counter++;   // ERhöhe Blink-Zähler um 1
430
   if( Counter  >= N_Blinken)
431
   {
432
      ZustandProg = 0;
433
      TA2CTL = 0x00;       // // Timer für Start / Stop = AUS
434
      TX_String("\n\n System = AUS\n");
435
      TX_String("\nStart mit T_OnOff\n\n");
436
      
437
      if ( Modus == 1)
438
      {
439
        TB0CTL = 0x00;          // Timer = AUS
440
        Modus = 0;
441
      }            
442
      else if (Modus ==2 )
443
      {
444
        TA1CTL = 0x00;             
445
        Modus = 0;              // Doppelt? Siehe Main
446
      }
447
      //unabhängig vom Modus Reset durchführen
448
      PWM_Aktuell = 5;       // PWM Reset
449
      FRQ_Aktuell = 5;
450
      
451
      P2IFG &= ~(T_Step);
452
      P2IE &= ~(T_Step);    // Freigebe Interrupt sperren Taster T_SET 
453
      P4OUT &= ~(LED_On);  // LED_ON sicher auf AUS setzen
454
      P7OUT &= ~(LED_WG);   // LED_WG sicher auf AUS setzen
455
   }
456
}
457
                     
458
// +----------------------------------------------------------------------
459
// |  SubRoutine wenn ein falscher Zustand aktiv sein sollte, dann
460
// |          System auf "sofort AUS"
461
// |     05.01.2020
462
// +----------------------------------------------------------------------                     
463
void System_Err(void)
464
{
465
   // dieser Zustand dürfte normalerweise nie auftreten, wenn
466
   // doch, dann liegt wohl ein Fehler vor. In diesem Fall:
467
   TA2CTL = 0x00;     // Timer = AUS
468
   tx = 0;
469
   ZustandProg = 0;
470
   Modus = 0;
471
   P2IFG &= ~(T_Step);
472
   P2IE &= ~(T_Step);    // Freigebe Interrupt sperren Taster T_SET               
473
   P1IFG &= ~(T_OnOff);
474
   P4OUT &= ~(LED_On);  // LED_ON sicher auf AUS setzen
475
   P7OUT &= ~(LED_WG);  // LED_WG sicher auf AUS setzen              
476
   Counter = 0;    
477
}
478
479
480
481
// +----------------------------------------------------------------------
482
// |  SubRoutine zum Wechsel zwischen den beiden Modi
483
// |     07.01.2020/ JP
484
// +----------------------------------------------------------------------
485
 void Modiwechsel (void)
486
 {
487
   // Von Pulswobbel auf Frequenzwobbel
488
   if ( Modus == 1 && P1IFG & T_OnOff && P2IFG & T_Step)
489
   {
490
     TB0CTL = 0x00;  // TimerB0 ausschalten
491
     Modus = 2;
492
     TimerA1();      // TimerA1 einschalten
493
     FRQ_Dir = 1;    // zuerst wird Frequenz vergrößert
494
   }
495
   // Von Frequenzwobbel auf Pulswobbel
496
   else if (Modus == 2 && P1IFG & T_OnOff && P2IFG & T_Step)
497
   {
498
     TA1CTL = 0x00;
499
     Modus = 1;
500
     TimerB0();
501
     PWM_Dir = 1;   // Pulsweite wird vergrößert
502
   }  
503
   // Flankenereignisse löschen
504
   P1IFG &=~ T_OnOff;
505
   P2IFG &=~ T_Step;
506
 }
507
   
508
   
509
   
510
511
   
512
//__________ Interrupt-Funktionen __________________________
513
514
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
515
// + Funktion: TimerB0_B1_ISR()
516
// +     Stand .....: 05.01.2020
517
// +
518
// + 
519
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
520
521
522
//void Pulswobbel (void)
523
#pragma vector = TIMER0_B1_VECTOR
524
 __interrupt void TIMER0_B1_ISR (void)
525
{
526
  switch (TB0IV)
527
  {
528
  case TB0IV_TBCCR2:                 // TB0CCR2 
529
    {
530
      if (PWM_Aktuell < PWM_Max && PWM_Dir == 1)
531
     {
532
       PWM_Aktuell += PWM_Step;
533
     }
534
     else if(PWM_Aktuell > PWM_Max && PWM_Dir == 1)
535
     {
536
      PWM_Aktuell -= PWM_Step;
537
      PWM_Dir = 0;
538
     }
539
     if (PWM_Aktuell > PWM_Min && PWM_Dir == 0)
540
     {
541
       PWM_Aktuell -= PWM_Step;
542
     }
543
     else if(PWM_Aktuell < PWM_Min && PWM_Dir == 0)
544
     {
545
      PWM_Aktuell += PWM_Step;
546
      PWM_Dir = 0;
547
     }
548
     break;
549
    }
550
  }
551
}
552
553
554
555
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
556
// + Funktion: TimerA1_A0_ISR()
557
// +     Stand .....: 05.01.2020
558
// +
559
// +   
560
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
561
//void Frequenzwobbel (void)
562
#pragma vector = TIMER1_A0_VECTOR
563
__interrupt void Timer1_A0_ISR( void )
564
{
565
  if (FRQ_Aktuell < FRQ_Max && FRQ_Dir == 1)
566
  {
567
    FRQ_Aktuell += FRQ_Step;
568
  }
569
  else if(FRQ_Aktuell > FRQ_Max && FRQ_Dir == 1)
570
  {
571
   FRQ_Aktuell -= FRQ_Step;
572
   FRQ_Dir = 0;
573
  }
574
  if (FRQ_Aktuell > FRQ_Min && FRQ_Dir == 0)
575
  {
576
    FRQ_Aktuell -= FRQ_Step;
577
  }
578
  else if(FRQ_Aktuell < FRQ_Min && FRQ_Dir == 0)
579
  {
580
   FRQ_Aktuell += FRQ_Step;
581
   FRQ_Dir = 1;
582
  }
583
}
584
585
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
586
// + Funktion: TimerA1_0_ISR()
587
// +    
588
// +
589
// +     Wenn dT erreicht wurde
590
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
591
#pragma vector=TIMER2_A0_VECTOR
592
__interrupt void TA2_0_ISR()
593
{
594
  tx = 1;
595
}
596
597
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
598
// + Funktion: TimerA1_0_ISR()
599
// +     
600
// +
601
// +     Wenn dT erreicht wurde
602
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
603
#pragma vector=TIMER0_A0_VECTOR
604
__interrupt void TA0_0_ISR()
605
{
606
  P2IES |= T_Step;      // Zurück auf negative Flanke
607
  
608
  // für Freque
609
  if ( Modus == 1)
610
  {
611
   if(PWM_Step_Dir == 0)
612
   {
613
    PWM_Step_Dir = 1;
614
    TX_String("\nT_SET: +5%\n");
615
   }
616
   else
617
   {
618
    PWM_Step_Dir = 0;
619
    TX_String("\nT_SET: -5%\n");
620
   }
621
  }
622
  
623
  // für Frequenzwobbel
624
  else if ( Modus == 2)
625
  {
626
    if(FRQ_Step_Dir == 0)
627
   {
628
    FRQ_Step_Dir = 1;
629
    TX_String("\nT_SET: +5%\n");
630
   }
631
   else
632
   {
633
    FRQ_Step_Dir = 0;
634
    TX_String("\nT_SET: -5%\n");
635
   }
636
  }
637
  
638
  P2IFG &= ~(T_Step); 
639
}
640
641
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
642
// + Funktion: P1_ISR()
643
// +     
644
// +
645
// +     Abfrage von Taster T_OnOff
646
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
647
#pragma vector=PORT1_VECTOR
648
__interrupt void P1_ISR()
649
{
650
  
651
  Entprell();
652
  
653
  if (P1IFG & T_OnOff)
654
  {
655
  // Negation des Taster T_Step, für Modiwechsel relevant
656
  if(P1IFG & T_OnOff && !(P2IFG & T_Step))   // Wenn Int. von T_OnOff, dann 
657
  {
658
    // hier weiter
659
    if((ZustandProg == 1)|| (ZustandProg ==2)) // TEST ob Programm bereists aktiv
660
    {
661
      // wenn ja, dann EIN --> AUS
662
      P2IFG &= ~(T_Step);    // Flanken ereignis löschen
663
      P2IE  &= ~(T_Step);    // Taster T_SET Interrupt sperren
664
      
665
      P7OUT |= LED_WG;
666
      P4OUT |= LED_On;
667
      
668
        if ( Modus == 1)
669
      {
670
        TB0CTL = 0x00;          // Timer = AUS
671
        Modus = 0;
672
      }            
673
      else if (Modus ==2 )
674
      {
675
        TA1CTL = 0x00;
676
        Modus = 0;              
677
      }
678
      
679
      TX_String("\nSystem wird herunter gefahren\n");
680
      ZustandProg = 3;
681
      Counter = 0;      
682
      tx = 0;  // das statische tx auf aus, übernimmt jetzt der Timer
683
    }
684
    else
685
    {
686
      // wenn nein, dann AUS --> EIN  (war im Zustand 0 oder 3)
687
      P2IFG &= ~(T_Step);    // Flanken ereignis löschen
688
      TX_String("System wird hoch gefahren\n");
689
      ZustandProg = 1;
690
      Counter = 0;
691
      Modus = 1;   // ist doch doppelt? SIEHE MAIN
692
    }
693
    INIT_TA2();             // Initialisiuerung und Start des Timers
694
   
695
  }
696
   void Modiwechsel();
697
   P1IFG &= ~(T_OnOff);    // Flanken Ereignis löschen
698
}
699
}
700
701
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
702
// + Funktion: P2_ISR()
703
// +     
704
// +
705
// +     Abfrage von Taster T_Step
706
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
707
#pragma vector=PORT2_VECTOR
708
__interrupt void P2_ISR()
709
{
710
  Entprell();
711
  if (P2IFG & T_Step)
712
  {
713
  // Logisches Nicht des Tasters T_On Off, für Modiwechsel relevant
714
  if(P2IFG & T_Step && !(P1IFG & T_OnOff) )       // Wenn Int. von T_Step, dann
715
  {
716
    if(P2IES && 0x02 == T_Step)   // Wenn T_Step in P1IES == 1 ist, negative Flanke
717
    {
718
      INIT_TA0();               // aktiviere 2s-Timer
719
      P2IES &= ~(T_Step);        // Int. bei positiver Flanke
720
    }
721
    
722
    else                        
723
    {
724
      // kurz gedrückt
725
      TA0CTL = 0x00;                            // Timer Stopp
726
      P2IES |= T_Step;                           // Zurück auf negative Flanke
727
      
728
      
729
      
730
      
731
      // für Pulswobbel
732
      if ( Modus == 1)
733
      {
734
        if(PWM_Step_Dir == 1)                     // Vorwärts
735
       {
736
        Frequenz_Ak += Frequenz_Step;           
737
        if (Frequenz_Ak > Frequenz_Max)
738
        {Frequenz_Ak = Frequenz_Min;}
739
       }
740
       else                                      // Rückwärts        
741
       {
742
        Frequenz_Ak -= Frequenz_Step;
743
        if (Frequenz_Ak < Frequenz_Min)
744
        {Frequenz_Ak = Frequenz_Max;}
745
       }
746
       Frequenz =  Frequenz_Ak / 100 * Frequenz;
747
       TB0CCR0 = Frequenz;
748
       
749
       // Ausgabe für Einstellung der vorgegeben Frequenz in Prozent 
750
       Ausgabe_Fvorgegeben (Frequenz_Ak);
751
      }
752
      
753
      // für Frequenzwobbel
754
      else if ( Modus == 2)
755
      {
756
         if(FRQ_Step_Dir == 1)                     // Vorwärts
757
       {
758
        Pulsbreite_Ak += Pulsbreite_Step;       
759
        if (Pulsbreite_Ak > Pulsbreite_Max)
760
        {Pulsbreite_Ak = Pulsbreite_Min;}
761
       }
762
       else                                      // Rückwärts        
763
       {
764
        Pulsbreite_Ak -= Pulsbreite_Step;
765
        if (Pulsbreite_Ak < Pulsbreite_Min)
766
        {Pulsbreite_Ak = Pulsbreite_Max;}
767
       }
768
        Periodendauer = Pulsbreite_Ak / 100 *  Periodendauer;
769
        TA1CCR1 = Periodendauer; 
770
        
771
       // Ausgabe für Einstellung der vorgegeben periodendauer in Prozent
772
       Ausgabe_Pvorgegeben(Pulsbreite_Ak);   
773
      }
774
    }
775
776
  }
777
       void Modiwechsel ();
778
     P2IFG &= ~(T_Step);                          // Flanken Ereignis löschen
779
  }
780
}