1  | /*
  | 
2  |  * Ofensteuerung V2.00c
  | 
3  |  * Mehrstufige Temperaturumrechnung
  | 
4  |  * RS232 über USAT 1
  | 
5  |  * Baud rate auf 19200
  | 
6  |  * Taktfrequenz runter auf 8MHz wegen Problemen
  | 
7  |  * Brennerabschaltung bei Pufferteperatur > 60°C
  | 
8  |  */
  | 
9  | 
  | 
10  | #include <msp430f167.h>
  | 
11  | #include <intrinsics.h>
  | 
12  | #include <stdlib.h>
  | 
13  | #include <string.h>
  | 
14  | 
  | 
15  | #define Offset 2588                //Offset von -50°C zu 0°C beim PT1000 1,79V (*100)
  | 
16  | #define Steigung 1692             //Steigung 1/3 mV/°C (*10000)
  | 
17  | #define Uref 28600                  //ADC Referenzspannung 2860,0mV (*10)
  | 
18  | #define MaxDigit 4095             //Maximale Digits bei 12-Bit adc
  | 
19  | volatile int cycles = 12500;      //Anzahl der Perioden Timer_A, 1sek. bei 100KHz DCO
  | 
20  | 
  | 
21  | #define A1_on (P4OUT |= BIT0)     //Relais 1 ein, Mischer auf
  | 
22  | #define A1_off (P4OUT &= ~BIT0)   //Relais 1 aus
  | 
23  | #define A2_on (P4OUT |= BIT1)     //Relais 2 ein, Mischer zu
  | 
24  | #define A2_off (P4OUT &= ~BIT1)   //Relais 2 aus
  | 
25  | #define A3_on (P4OUT |= BIT2)     //Relais 3 ein, Pumpe Rücklaufanhebung ein
  | 
26  | #define A3_off (P4OUT &= ~BIT2)   //Relais 3 aus, Pumpe Rücklaufanhebung aus
  | 
27  | #define A4_on (P4OUT |= BIT3)
  | 
28  | #define A4_off (P4OUT &= ~BIT3)
  | 
29  | #define A5_on (P4OUT |= BIT4)
  | 
30  | #define A5_off (P4OUT &= ~BIT4)
  | 
31  | #define A6_on (P4OUT |= BIT5)
  | 
32  | #define A6_off (P4OUT &= ~BIT5)
  | 
33  | #define A7_on (P4OUT |= BIT6)     //Relais 7 ein, Heizkessel
  | 
34  | #define A7_off (P4OUT &= ~BIT6)   //Relais 7 aus, Heizkessel
  | 
35  | #define A8_on (P4OUT |= BIT7)
  | 
36  | #define A8_off (P4OUT &= ~BIT7)
  | 
37  | 
  | 
38  | 
  | 
39  | void Timer_A(void);  //Timer A liest ADC und bildet  8 Mittelwerte
  | 
40  | void Init_ADC(void); //ADC initialisierung
  | 
41  | void Read_ADC(void); //Temp. T1 - T8 lesen
  | 
42  | void Format(long l, char *s);
  | 
43  | long int Temperatur (long int Digit);
  | 
44  | void scrPos(char* x, char* y);
  | 
45  | int uart_putc(char c);
  | 
46  | void uart_puts (char* s);
  | 
47  | void init_XT(void); //Ext. Quarz 8MHz
  | 
48  | 
  | 
49  | char buffer_1[6], buffer_2[6], buffer_3[6], buffer_4[6], buffer_5[6], buffer_6[6], buffer_7[6], buffer_8[6];
  | 
50  | volatile long int Digit_1, Digit_2, Digit_3, Digit_4, Digit_5, Digit_6, Digit_7, Digit_8;
  | 
51  | volatile long int Summe_1, Summe_2, Summe_3, Summe_4, Summe_5, Summe_6, Summe_7, Summe_8;
  | 
52  | volatile long int Mittelwert_1, Mittelwert_2, Mittelwert_3, Mittelwert_4, Mittelwert_5, Mittelwert_6, Mittelwert_7, Mittelwert_8;
  | 
53  | volatile long int Mittelwert_11, Mittelwert_12, Mittelwert_13, Mittelwert_14, Mittelwert_15, Mittelwert_16, Mittelwert_17, Mittelwert_18;
  | 
54  | volatile int Temperatur_1, Temperatur_2, Temperatur_3, Temperatur_4, Temperatur_5, Temperatur_6, Temperatur_7, Temperatur_8;
  | 
55  | volatile int i_scr = 0;
  | 
56  | unsigned short int i_init;
  | 
57  | short int delta_1;  //Differenz zur Mischersteuerung
  | 
58  | short int delta_2;  //Differenz zur Pumpensteuerung
  | 
59  | 
  | 
60  | 
  | 
61  | 
  | 
62  | void main(void)
  | 
63  | {
 | 
64  | //Ext. Quarz 8MHz und Stop WDT
  | 
65  | //DCO auf 100KHz
  | 
66  |   init_XT();
  | 
67  | 
  | 
68  |   //Definition des Ports A für Schalter S1 bis S8
  | 
69  |   P1SEL = 0x00;  //Port A I/O Funktion
  | 
70  |   P1DIR = 0x00;  //Port A Input
  | 
71  |   P1OUT = 0x00;  //Port A
  | 
72  |   P1IE = 0xFF;   //Port A Interrupt freigegeben
  | 
73  |   P1IES = 0xFF;  //Port A Interrupt H -> L
  | 
74  |   P1IFG = 0x00;  //Port A Iterrupt Flag löschen
  | 
75  | 
  | 
76  |   //Definition des Ports B für 8 Bit Display
  | 
77  |   P2SEL = 0x00;  //Port B I/O Funktion
  | 
78  |   P2DIR = 0xFF;  //Port B Output
  | 
79  |   P2OUT = 0x00;  //Port B Low
  | 
80  |   P2IE = 0x00;   //Port B Interrupt nicht freigegeben
  | 
81  |   P2IES = 0xFF;  //Port B Interrupt H -> L
  | 
82  |   P2IFG = 0x00;  //Port B Iterrupt Flag löschen
  | 
83  | 
  | 
84  | 
  | 
85  |   //Definition des Ports C für P3.0 und P3.2 (Stecker SV)
  | 
86  |   P3SEL &= ~(BIT0 | BIT2);  //Port C P3.0 und P3.2 I/O Funktion
  | 
87  |   P3DIR |= BIT0 + BIT2;  //Port C P3.0 und P3.2 Output
  | 
88  |   P3OUT &= ~(BIT0 | BIT2);  //Port C P3.0 und P3.2 Low
  | 
89  | 
  | 
90  |   //Definition des Ports C für P3.1 und P3.3 für I2C
  | 
91  |   //P3SEL |= BIT1 + BIT3;  //Port C P3.0 und P3.2 Aux Funktion
  | 
92  |   //U0CTL |= I2C + SYNC;                      // Switch USART0 to I2C mode
  | 
93  |   //U0CTL &= ~I2CEN;                          // Recommended I2C init procedure
  | 
94  |   //I2CTCTL = I2CSSEL_2;                      // SMCLK
  | 
95  |   //I2CSCLH = 0x03;                           // High period of SCL
  | 
96  |   //I2CSCLL = 0x03;                           // Low period of SCL
  | 
97  |   //I2CNDAT = 0x01;                           // Transmit one byte
  | 
98  |   //I2CSA = 0x01;                             // Slave address
  | 
99  |   //U0CTL |= I2CEN;                           // Enable I2C, 7 bit addr,
  | 
100  |   //I2CIE = RXRDYIE;                          // I2C receive ready interrupt enable
  | 
101  | 
  | 
102  |   //Definition des Port C für P3.6 bis P3.7 (UART1) für RS232
  | 
103  |   P3SEL |= BIT6 + BIT7;  //Port C P3.6 bis P3.7 Aux Funktion
  | 
104  | 
  | 
105  |   ME2 |= UTXE1 + URXE1;        //USART1 Rx + Tx einschalten
  | 
106  |   UCTL1 |= CHAR;               //USART1 8N1
  | 
107  |   UTCTL1 |= SSEL0;             //ACLK
  | 
108  |     UBR01 = 0xA0;                       // 19200 baud bei 8 MHz erzeugen
  | 
109  |     UBR11 = 0x01;                       // 19200 baud bei 8 MHz erzeugen
  | 
110  |     UMCTL1 = 0x5B;                      // Korrektur der division noetig
  | 
111  |     UCTL1 &= ~SWRST;                // USART1 freigeben
  | 
112  |    // IE2 |= UTXIE1;                  // TX-interrupt anschalten
  | 
113  |    // IFG2 &= ~UTXIFG1;            // initales interrupt-flag loeschen
  | 
114  | 
  | 
115  | 
  | 
116  | 
  | 
117  | 
  | 
118  |   //Definition des Ports D für 8 Relais Ausgänge
  | 
119  |   P4SEL = 0x00;  //Port D I/O Funktion
  | 
120  |   P4DIR = 0xFF;  //Port D Output
  | 
121  |   P4OUT = 0x00;  //Port D Low
  | 
122  | 
  | 
123  | // Interrupts freigeben
  | 
124  |   __enable_interrupt();
  | 
125  | 
  | 
126  | 
  | 
127  | //ADC initieren
  | 
128  | //Timer A starten
  | 
129  |   Init_ADC();
  | 
130  |   Timer_A ();
  | 
131  | 
  | 
132  | //Zeit um genügend Mittelwerte zu bilden
  | 
133  |   for (i_init = 0; i_init <= 1625; i_init++)
  | 
134  |   {
 | 
135  |     uart_puts ("System startet...\t\t");
 | 
136  |   }
  | 
137  |   uart_puts ("\x1b\[2J"); //Bildschirm löschen
 | 
138  | 
  | 
139  | while (1)
  | 
140  | {
 | 
141  | 
  | 
142  | // Gemittelte Digits in Temperatur umrechen lassen
  | 
143  |   Temperatur_1 = Temperatur (Mittelwert_11); // Temp. Puffer oben
  | 
144  |   Temperatur_2 = Temperatur (Mittelwert_12); // Temp. Heizkreis-Rücklauf
  | 
145  |   Temperatur_3 = Temperatur (Mittelwert_13); // Temp. Holzofen
  | 
146  |   Temperatur_4 = Temperatur (Mittelwert_14); // Temp. Puffer- Rücklauf
  | 
147  |   Temperatur_5 = Temperatur (Mittelwert_15);
  | 
148  |   Temperatur_6 = Temperatur (Mittelwert_16);
  | 
149  |   Temperatur_7 = Temperatur (Mittelwert_17);
  | 
150  |   Temperatur_7 = Temperatur (Mittelwert_18);
  | 
151  | 
  | 
152  | // Differenzbildung aus Puffer-Temperatur oben
  | 
153  | // und Heizkreis-Rücklauf
  | 
154  | // Ansteuerung der Ausgänge A1 und A2 zur
  | 
155  | // Mischersteuerung
  | 
156  | delta_1 = Temperatur_1 - Temperatur_2;
  | 
157  | 
  | 
158  |         if (delta_1 >= 7)
  | 
159  |         {
 | 
160  |           A2_off;
  | 
161  |           A1_on;
  | 
162  |         }
  | 
163  | 
  | 
164  | 
  | 
165  |         if (delta_1 <= 2)
  | 
166  |         {
 | 
167  |             A1_off;
  | 
168  |              A2_on;
  | 
169  |         }
  | 
170  | 
  | 
171  | //Rücklaufanhebung an A3 ein- und ausschalten
  | 
172  | delta_2 = Temperatur_3 - Temperatur_1;
  | 
173  | 
  | 
174  | if (Temperatur_3 >= 90)
  | 
175  |   A3_on;
  | 
176  | else
  | 
177  |    {
 | 
178  |       if (delta_2 >= 2)
  | 
179  |         {
 | 
180  |           if (Temperatur_3 >= 65)
  | 
181  |             A3_on;
  | 
182  | 
  | 
183  |           if (Temperatur_3 <= 60)
  | 
184  |             A3_off;
  | 
185  |         }
  | 
186  |       else
  | 
187  |      A3_off;
  | 
188  |    }
  | 
189  | 
  | 
190  | //Brennerabschaltung bei Puffertemp. > 60°C
  | 
191  | if (Temperatur_1 >= 60)
  | 
192  |   A7_on;
  | 
193  | 
  | 
194  | if (Temperatur_1 <= 58)
  | 
195  |   A7_off;
  | 
196  | 
  | 
197  | 
  | 
198  | 
  | 
199  | 
  | 
200  | //Umwandlung INT -> ASCII, Zuweisung buffer_x
  | 
201  |   Format (Temperatur_1, buffer_1);  //Temp. Puffer oben
  | 
202  |   Format (Temperatur_2, buffer_2);  //Temp. Heizkreis Rücklauf
  | 
203  |   Format (Temperatur_3, buffer_3);  //Temp. Holzofen
  | 
204  |   Format (Temperatur_4, buffer_4);  //Temp. Puffer Rücklauf
  | 
205  |   Format (delta_1, buffer_5);       //Differenz zw. Puffer oben und Heizkreis Rücklauf
  | 
206  |   Format (Mittelwert_11, buffer_6); //Digits Puffer oben
  | 
207  | 
  | 
208  | 
  | 
209  | 
  | 
210  | // Positionen, Texte und Werte (Maske) setzen
  | 
211  |   scrPos ("1", "25"); uart_puts ("\x1b\[1K"); uart_puts("Holzofensteuerung v2.00c");
 | 
212  |   scrPos ("2", "25"); uart_puts ("\x1b\[1K"); uart_puts("von Stefan Sachs");
 | 
213  |   scrPos ("4", "1"); uart_puts ("Temperatur Holzofen: ");
 | 
214  |   scrPos ("5", "1"); uart_puts ("Temperatur Puffer oben: ");
 | 
215  |   scrPos ("6", "1"); uart_puts ("Temperatur Heizkreis-Ruecklauf: ");
 | 
216  |   scrPos ("7", "1"); uart_puts ("Temperatur Differenz: ");
 | 
217  |   scrPos ("8", "1"); uart_puts ("Temperatur Puffer-Ruecklauf: ");
 | 
218  |   scrPos ("4", "34"); uart_puts (buffer_3);
 | 
219  |   scrPos ("5", "34"); uart_puts (buffer_1);
 | 
220  |   scrPos ("5", "40"); uart_puts (buffer_6);
 | 
221  |   scrPos ("6", "34"); uart_puts (buffer_2);
 | 
222  |   scrPos ("7", "34"); uart_puts (buffer_5);
 | 
223  |   scrPos ("8", "34"); uart_puts (buffer_4);
 | 
224  | 
  | 
225  | 
  | 
226  |   }
  | 
227  | }
  | 
228  | 
  | 
229  | //Ab hier Funktionen
  | 
230  | 
  | 
231  | // Hier werden die Positionen auf dem
  | 
232  | // Bildschirm angefahren
  | 
233  | void scrPos(char* x, char* y)
  | 
234  | {
 | 
235  |   uart_puts ("\x1b\[");  // x1b ESC- Zeichen
 | 
236  |   uart_puts (x);         // Zeilenauswahl
  | 
237  |   uart_putc (';');       // Gehört zur ESC- Sequenz
 | 
238  |   uart_puts (y);         // Spaltenauswahl
  | 
239  |   uart_putc ('H');       // Gehört zur ESC- Sequenz
 | 
240  |   //uart_puts ("\x1b\[K");
 | 
241  | 
  | 
242  | }
  | 
243  | 
  | 
244  | 
  | 
245  | //Hier wird der Timer A eigestellt
  | 
246  | void Timer_A (void)
  | 
247  | {
 | 
248  |   TACTL = TASSEL_2 + TACLR;   //SMCLK (DCO) + Clear Timer A
  | 
249  |   TACCTL0 = CCIE;             //Capture / compare interrupt en.
  | 
250  |   TACCR0 = cycles;            //s. #define cycles
  | 
251  |   TACTL |= MC_2 |ID_3;        //Continuous- Mode to TACCR0 + clock/8
  | 
252  | }
  | 
253  | 
  | 
254  | 
  | 
255  | // Hier wird der 8MHz Quarz aktiviert
  | 
256  | // und der DCO auf 100KHz eigestellt
  | 
257  | void init_XT(void)
  | 
258  | {
 | 
259  |   unsigned int i;
  | 
260  |   WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  | 
261  |   DCOCTL = DCO1 + DCO0;                 // SMCLK 100KHz
  | 
262  |   BCSCTL1 &= ~RSEL2 |RSEL1 |RSEL0;      // SMCLK 100KHz
  | 
263  |   BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL
  | 
264  |   do
  | 
265  |   {
 | 
266  |     IFG1 &= ~OFIFG;                    // Clear OSCFault flag
  | 
267  |     for (i = 0xFF; i > 0; i--);        // Time for flag to set
  | 
268  |   }
  | 
269  |   while ((IFG1 & OFIFG) == OFIFG);     // OSCFault flag still set?
  | 
270  |   BCSCTL2 |= SELM1+SELM0;              // MCLK = LFXT1 (safe)
  | 
271  | }
  | 
272  | 
  | 
273  | // Hier werden INT- Zahlen in ASCII umgewandelt (einfache Version)
  | 
274  | void Format(long zahl, char* string) {
 | 
275  |   int i;
  | 
276  | 
  | 
277  |   string[5]='\0';                  // String Terminator
  | 
278  |   if( zahl < 0 ) {                  // ist die Zahl negativ?
 | 
279  |     string[0] = '-';
  | 
280  |     zahl = -zahl;
  | 
281  |   }
  | 
282  |   else string[0] = ' ';             // Zahl ist positiv
  | 
283  | 
  | 
284  |   for(i=4; i>=1; i--) {
 | 
285  |     string[i]=(zahl % 10) +'0';     // Modulo rechnen, dann den ASCII-Code von '0' addieren
  | 
286  |     zahl /= 10;
  | 
287  |   }
  | 
288  | }
  | 
289  | 
  | 
290  | 
  | 
291  | 
  | 
292  | // Umrechnung der Digits in Temperatur
  | 
293  | long int Temperatur (long int Digit)
  | 
294  | {
 | 
295  | 
  | 
296  |   if (Digit <= 2824)
  | 
297  |       return (((Digit - Offset) * 1471) / 10000);
  | 
298  | 
  | 
299  |   if ((Digit >= 2825) && (Digit <= 2884))
  | 
300  |     return (((Digit - Offset) * 1493) / 10000);
  | 
301  | 
  | 
302  |   if ((Digit >= 2885) && (Digit <= 2938))
  | 
303  |       return (((Digit - Offset) * 1548) / 10000);
  | 
304  | 
  | 
305  |   if ((Digit >= 2939) && (Digit <= 2988))
  | 
306  |       return (((Digit - Offset) * 1595) / 10000);
  | 
307  | 
  | 
308  |   if ((Digit >= 2989) && (Digit <= 3036))
  | 
309  |       return (((Digit - Offset) * 1650) / 10000);
  | 
310  | 
  | 
311  |   if ((Digit >= 3037) && (Digit <= 3081))
  | 
312  |       return (((Digit - Offset) * 1695) / 10000);
  | 
313  | 
  | 
314  |   if ((Digit >= 3082) && (Digit <= 3123))
  | 
315  |       return (((Digit - Offset) * 1751) / 10000);
  | 
316  | 
  | 
317  |   if ((Digit >= 3124) && (Digit <= 3162))
  | 
318  |       return (((Digit - Offset) * 1799) / 10000);
  | 
319  | 
  | 
320  |   if ((Digit >= 3163) && (Digit <= 3196))
  | 
321  |       return (((Digit - Offset) * 1862) / 10000);
  | 
322  | 
  | 
323  |   if (Digit >= 3197)
  | 
324  |       return (((Digit - Offset) * 1919) / 10000);
  | 
325  | 
  | 
326  | 
  | 
327  |   //return (((Digit * ((Uref / MaxDigit) * Steigung)) / 10000) - Offset);
  | 
328  |   //return (Digit - 2588);
  | 
329  | }
  | 
330  | 
  | 
331  | 
  | 
332  | 
  | 
333  | // Senden eines Zeichens
  | 
334  | int uart_putc(char c)
  | 
335  | {
 | 
336  |   while (!(IFG2 & UTXIFG1));  /* warten bis Senden moeglich */
  | 
337  | 
  | 
338  |     U1TXBUF = c;                      /* sende Zeichen */
  | 
339  |     return 0;
  | 
340  | }
  | 
341  | 
  | 
342  | 
  | 
343  | // Senden eines Strings
  | 
344  | void uart_puts (char *s)
  | 
345  | {
 | 
346  |     while (*s)
  | 
347  |     {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
 | 
348  |         uart_putc(*s);
  | 
349  |         s++;
  | 
350  |     }
  | 
351  | }
  | 
352  | 
  | 
353  | 
  | 
354  | //Hier wird der ADC eingestellt
  | 
355  | void Init_ADC(void)
  | 
356  | {
 | 
357  |   P6SEL = 0xFF;  // Analogeingänge A0 - A7 (P6.0 - P6.7)
  | 
358  |   ADC12CTL0 = ADC12ON + REFON + REF2_5V + MSC + SHT0_12 + SHT1_12;
  | 
359  |   ADC12CTL1 = ADC12SSEL_1 + ADC12DIV_7 + SHP + CONSEQ_1;
  | 
360  |   ADC12MCTL0 = SREF_7 + INCH_0; // Wert von A0 landet in ADC12MEM0
  | 
361  |   ADC12MCTL1 = SREF_7 + INCH_1; // Wert von A1 landet in ADC12MEM1
  | 
362  |   ADC12MCTL2 = SREF_7 + INCH_2; // Wert von A2 landet in ADC12MEM2
  | 
363  |   ADC12MCTL3 = SREF_7 + INCH_3; // Wert von A3 landet in ADC12MEM3
  | 
364  |   ADC12MCTL4 = SREF_7 + INCH_4; // Wert von A4 landet in ADC12MEM4
  | 
365  |   ADC12MCTL5 = SREF_7 + INCH_5; // Wert von A5 landet in ADC12MEM5
  | 
366  |   ADC12MCTL6 = SREF_7 + INCH_6; // Wert von A6 landet in ADC12MEM6
  | 
367  |   ADC12MCTL7 = SREF_7 + INCH_7 + EOS; // Wert von A7 landet in ADC12MEM7
  | 
368  |   ADC12IE = 0x80;  //ADC Interrupts freigeben
  | 
369  |   ADC12CTL0 |= ENC;  // Konvertierung freigenben
  | 
370  | }
  | 
371  | 
  | 
372  | 
  | 
373  | 
  | 
374  | //Hier wird der ADC gestartet
  | 
375  | void Read_ADC(void)
  | 
376  | {
 | 
377  |   while (ADC12CTL1 & ADC12BUSY);  //ADC noch beschäftigt?
  | 
378  |   ADC12CTL0 |= ADC12SC;   // Neue Konvertierung starten
  | 
379  | }
  | 
380  | 
  | 
381  | 
  | 
382  | 
  | 
383  | 
  | 
384  | 
  | 
385  | 
  | 
386  | //Ab hier ISR's
  | 
387  | 
  | 
388  | // Hier wird der ADC angestoßen
  | 
389  | // und 8 Mittelwerte gebildet
  | 
390  | #pragma vector=TIMERA0_VECTOR
  | 
391  | __interrupt void TimerA0_VECTOR (void)
  | 
392  | {
 | 
393  |     Read_ADC();
  | 
394  | 
  | 
395  | //a=1/4
  | 
396  |       Mittelwert_1 = ((Mittelwert_1 * 3) >> 2) + (Digit_1 >> 2);
  | 
397  |       Mittelwert_2 = ((Mittelwert_2 * 3) >> 2) + (Digit_2 >> 2);
  | 
398  |       Mittelwert_3 = ((Mittelwert_3 * 3) >> 2) + (Digit_3 >> 2);
  | 
399  |       Mittelwert_4 = ((Mittelwert_4 * 3) >> 2) + (Digit_4 >> 2);
  | 
400  |       Mittelwert_5 = ((Mittelwert_5 * 3) >> 2) + (Digit_5 >> 2);
  | 
401  |       Mittelwert_6 = ((Mittelwert_6 * 3) >> 2) + (Digit_6 >> 2);
  | 
402  |       Mittelwert_7 = ((Mittelwert_7 * 3) >> 2) + (Digit_7 >> 2);
  | 
403  |       Mittelwert_8 = ((Mittelwert_8 * 3) >> 2) + (Digit_8 >> 2);
  | 
404  | 
  | 
405  | //a=1/2
  | 
406  |       Mittelwert_11 = (Mittelwert_11 >> 1) + (Mittelwert_1 >> 1);
  | 
407  |       Mittelwert_12 = (Mittelwert_12 >> 1) + (Mittelwert_2 >> 1);
  | 
408  |       Mittelwert_13 = (Mittelwert_13 >> 1) + (Mittelwert_3 >> 1);
  | 
409  |       Mittelwert_14 = (Mittelwert_14 >> 1) + (Mittelwert_4 >> 1);
  | 
410  |       Mittelwert_15 = (Mittelwert_15 >> 1) + (Mittelwert_5 >> 1);
  | 
411  |       Mittelwert_16 = (Mittelwert_16 >> 1) + (Mittelwert_6 >> 1);
  | 
412  |       Mittelwert_17 = (Mittelwert_17 >> 1) + (Mittelwert_7 >> 1);
  | 
413  |       Mittelwert_18 = (Mittelwert_18 >> 1) + (Mittelwert_8 >> 1);
  | 
414  | 
  | 
415  |   CCR0 += cycles;                        // Add Offset to CCR0
  | 
416  | }
  | 
417  | 
  | 
418  | 
  | 
419  | 
  | 
420  | // Hier werden 8 ADC-Werte zugewiesen
  | 
421  | #pragma vector=ADC12_VECTOR
  | 
422  | __interrupt void ADC12ISR (void)
  | 
423  | {
 | 
424  |   Digit_1 = ADC12MEM0;
  | 
425  |   Digit_2 = ADC12MEM1;
  | 
426  |   Digit_3 = ADC12MEM2;
  | 
427  |   Digit_4 = ADC12MEM3;
  | 
428  |   Digit_5 = ADC12MEM4;
  | 
429  |   Digit_6 = ADC12MEM5;
  | 
430  |   Digit_7 = ADC12MEM6;
  | 
431  |   Digit_8 = ADC12MEM7;
  | 
432  | 
  | 
433  | }
  | 
434  | 
  | 
435  | 
  | 
436  | /*
  | 
437  | // UART0 TX ISR
  | 
438  | #pragma vector=USART0TX_VECTOR
  | 
439  | __interrupt void usart0_tx (void)
  | 
440  | {
 | 
441  |   char i, j;
  | 
442  |   for (j=0; j<2; j++)
  | 
443  |   {
 | 
444  |   for (i=0; i < sizeof Digit[j]; i++)
  | 
445  |     TXBUF0 = Digit[j];
  | 
446  | 
  | 
447  |   }
  | 
448  | }
  | 
449  | */
  | 
450  | 
  | 
451  | //Hier werden die Tasten abgefragt
  | 
452  | #pragma vector = PORT1_VECTOR
  | 
453  | __interrupt void PORT1_ISR (void)
  | 
454  | {
 | 
455  | //  __low_power_mode_off_on_exit();
  | 
456  | 
  | 
457  |   int i;
  | 
458  | 
  | 
459  |   //funktion = funktion + set;
  | 
460  |       //  set = 0;
  | 
461  |       //  if (funktion > 5) {funktion = 0;}
 | 
462  |       //  if (funktion < 0) {funktion = 5;}
 | 
463  | 
  | 
464  |         if (!(P1IN & BIT0))
  | 
465  |         {
 | 
466  |           //P4OUT ^= BIT0;
  | 
467  |           for (i=1; i <= 1200; i++){}
 | 
468  | 
  | 
469  |         //  set = 1;
  | 
470  |         }
  | 
471  | 
  | 
472  |         P1IFG &= ~BIT0;  // Interrupt Flag löschen
  | 
473  | 
  | 
474  | 
  | 
475  |         if (!(P1IN & BIT1))
  | 
476  |         {
 | 
477  |           //P4OUT ^= BIT1;
  | 
478  |           for (i=1; i <= 1200; i++){}
 | 
479  | 
  | 
480  |         //  set = -1;
  | 
481  |         }
  | 
482  |         P1IFG &= ~BIT1;  // Interrupt Flag löschen
  | 
483  | 
  | 
484  | 
  | 
485  |         if (!(P1IN & BIT2))
  | 
486  |         {
 | 
487  |           //P4OUT ^= BIT2;
  | 
488  |           for (i=1; i <= 1200; i++){}
 | 
489  | 
  | 
490  |           //  set = -1;
  | 
491  |         }
  | 
492  |         P1IFG &= ~BIT2;  // Interrupt Flag löschen
  | 
493  | 
  | 
494  | 
  | 
495  |         if (!(P1IN & BIT3))
  | 
496  |         {
 | 
497  |           P4OUT ^= BIT3;
  | 
498  |           for (i=1; i <= 1200; i++){}
 | 
499  | 
  | 
500  |           //  set = -1;
  | 
501  |         }
  | 
502  |         P1IFG &= ~BIT3;  // Interrupt Flag löschen
  | 
503  | 
  | 
504  | 
  | 
505  |         if (!(P1IN & BIT4))
  | 
506  |         {
 | 
507  |           P4OUT ^= BIT4;
  | 
508  |           for (i=1; i <= 1200; i++){}
 | 
509  | 
  | 
510  |           //  set = -1;
  | 
511  |         }
  | 
512  |         P1IFG &= ~BIT4;  // Interrupt Flag löschen
  | 
513  | 
  | 
514  | 
  | 
515  |         if (!(P1IN & BIT5))
  | 
516  |         {
 | 
517  |           P4OUT ^= BIT5;
  | 
518  |           for (i=1; i <= 1200; i++){}
 | 
519  | 
  | 
520  |           //  set = -1;
  | 
521  |         }
  | 
522  |         P1IFG &= ~BIT5;  // Interrupt Flag löschen
  | 
523  | 
  | 
524  | 
  | 
525  |         if (!(P1IN & BIT6))
  | 
526  |         {
 | 
527  |           P4OUT ^= BIT6;
  | 
528  |           for (i=1; i <= 1200; i++){}
 | 
529  | 
  | 
530  |           //  set = -1;
  | 
531  |         }
  | 
532  |         P1IFG &= ~BIT6;  // Interrupt Flag löschen
  | 
533  | 
  | 
534  | 
  | 
535  |         if (!(P1IN & BIT7))
  | 
536  |         {
 | 
537  |           P4OUT ^= BIT7;
  | 
538  |           for (i=1; i <= 1200; i++){}
 | 
539  | 
  | 
540  |           //  set = -1;
  | 
541  |         }
  | 
542  |         P1IFG &= ~BIT7;  // Interrupt Flag löschen
  | 
543  | 
  | 
544  | 
  | 
545  | 
  | 
546  | }
  |