main.c


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