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