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 | }
|