1 | #include <msp430x16x.h>
|
2 |
|
3 | #include <msp430def.h>
|
4 |
|
5 | #pragma interrupt_handler timera_isr: TIMERA0_VECTOR timera_isr: TIMERA1_VECTOR
|
6 | #pragma interrupt_handler timerb_isr: TIMERB0_VECTOR timerb_isr: TIMERB1_VECTOR
|
7 | #pragma interrupt_handler adc_isr: ADC_VECTOR
|
8 | #pragma interrupt_handler sio0_isr: USART0TX_VECTOR
|
9 |
|
10 | void init_Clock();
|
11 | void timera_init();
|
12 | void timerb_init();
|
13 | void mittel();
|
14 | void init_DAC();
|
15 | void init_SIO();
|
16 | void init_ADC();
|
17 | //void wait_05ms();
|
18 | void wait_250us(unsigned int ui_Faktor);
|
19 |
|
20 | unsigned int temp;
|
21 | unsigned int val_DAC;
|
22 | unsigned char n_tb = 0;
|
23 | volatile n_led = 0;
|
24 | unsigned char n_mw = 0;
|
25 | unsigned int Messwerte[4];
|
26 | unsigned int Messwerte_LED0[4];
|
27 | unsigned int Messwerte_LED1[4];
|
28 | unsigned int Messwerte_LED2[4];
|
29 | unsigned long Summe;
|
30 | unsigned long dunkel;
|
31 | unsigned char Ziffern[4];
|
32 | unsigned int ui_Faktor;
|
33 | unsigned char text[1] = "A";
|
34 | unsigned char text2[1] = "B";
|
35 | unsigned int *ptr_mw0;
|
36 | unsigned int *ptr_mw1;
|
37 | unsigned int *ptr_mw2;
|
38 | unsigned int *ptr_mw;
|
39 | unsigned int mw = 0;
|
40 | unsigned int mw0 = 0;
|
41 | unsigned int mw1 = 0;
|
42 | unsigned int mw2 = 0;
|
43 | unsigned int mw0_a;
|
44 | unsigned int mw0_b;
|
45 | unsigned long value;
|
46 | unsigned char split[2];
|
47 | unsigned char n_send = 0;
|
48 | unsigned char Ziffern_send[4];
|
49 | unsigned long Mittelwert_send = 0;
|
50 |
|
51 | void main(void)
|
52 | {
|
53 | _STOP_WATCHDOG(); //definiert in "msp430def.h"
|
54 |
|
55 | ptr_mw = &mw;
|
56 | ptr_mw0 = &mw0;
|
57 | ptr_mw1 = &mw1;
|
58 | ptr_mw2 = &mw2;
|
59 |
|
60 | P1SEL = 0x00; //Std.IO
|
61 | P1DIR = 0xFF; //alles Ausgänge
|
62 | P1OUT = 0x00; // at startup all outputs off
|
63 | P1OUT |= 0x10; // Verstaerkung -1
|
64 | //P1OUT |= 0x01;
|
65 | P2SEL = 0x00; //Std.IO
|
66 | P2DIR = 0xFF; //alles Ausgänge
|
67 |
|
68 | P5SEL = 0xFF; //Std.IO
|
69 |
|
70 | P3SEL = 0xf0; //P3.0..3 Standard I/O; P3.4..7 Peripheral Modul Function (UART)
|
71 | P3DIR = 0x00; //P3.0..3 Ausgaenge; P3.4..7 = x
|
72 |
|
73 | P6SEL = 0xFF; //Peripheral Modul Function (ADC12)
|
74 |
|
75 | init_Clock();
|
76 | timera_init();
|
77 | timerb_init();
|
78 | init_DAC();
|
79 | init_ADC();
|
80 | init_SIO();
|
81 |
|
82 |
|
83 | //Interruptfreigaben
|
84 | //ADC12IE = 0xFFFF; //Int-Freigabe für das Ergebnisregister ADC12MEM0
|
85 | //ADC12IE = ADC12IE2;
|
86 | //ADC12IE = 0x0004; // ADC12 memory 0,2,
|
87 | ADC12IE = 0x0001;
|
88 | TACCTL0 |= CCIE; //Timer A C/C Int Enable (für TACCR0)
|
89 |
|
90 | TBCCTL0 |= CCIE; //Tiemr_B C/C Int Enable (für TBCCR0)
|
91 |
|
92 | IE1 |= UTXIE0; //SIO0 TX-Int freigeben
|
93 |
|
94 | _BIS_SR(GIE); //GIE = 1, globale Interruptfreigabe
|
95 |
|
96 |
|
97 | TACTL |= MC_1; //Timer_A starten
|
98 | // CPU Takt
|
99 | DCOCTL = DCO0 + DCO1 + DCO2;
|
100 | BCSCTL1 = RSEL0 + RSEL1 + RSEL2 + DIVA_0;
|
101 | BCSCTL2 = SELM_2 + DIVM_0 + DIVS_0 + SELS;
|
102 |
|
103 |
|
104 | while(1); //Endlosschleife - Warten auf Interrupts
|
105 |
|
106 | }
|
107 |
|
108 |
|
109 | void init_Clock( void )
|
110 | { unsigned char i = 0;
|
111 | // Turning XT1 (32kHz) on
|
112 | _BIC_SR (OSCOFF); // Turn on XT1
|
113 | BCSCTL1 &= ~XTS; // LF mode
|
114 | for (i = 0xFFFF; i > 0; i--); // Time for osc. to set
|
115 | // XT1 is on
|
116 |
|
117 | // Turning XT2 (8MHz) on
|
118 | BCSCTL1 &= ~XT2OFF; // Turn on XT2
|
119 | do
|
120 | { // pruefroutine, ob 8 Mhz-oszillator schon stabil ist
|
121 | IFG1 &= ~OFIFG; // OSCFault flag loeschen (zeigt oszillatorfehler an)
|
122 | for (i=0xFF;i>0;i--); // warten, ob es wieder gesetzt wird
|
123 | }
|
124 | while ((IFG1 & OFIFG) != 0); // OSCFault immer noch gesetzt?
|
125 |
|
126 | }
|
127 |
|
128 |
|
129 | void timera_init()
|
130 | {
|
131 | TACTL = TASSEL_2 | ID_3; //SourceClock = SMCLK
|
132 |
|
133 | TACCR0 = 0x3000;
|
134 |
|
135 | }
|
136 |
|
137 |
|
138 | void timerb_init()
|
139 | {
|
140 |
|
141 | TBCTL = TBSSEL_1 | ID_0; //SourceClock = ACLK
|
142 |
|
143 | TBCCR0 = 0x15;
|
144 | }
|
145 |
|
146 |
|
147 | void init_DAC(void)
|
148 | {
|
149 | DAC12_0CTL = DAC12IR + DAC12SREF_2 + DAC12AMP_5 + DAC12ENC; // 1 reference voltage, medium speed
|
150 | DAC12_1CTL = DAC12IR + DAC12SREF_2 + DAC12AMP_5 + DAC12ENC; // 1 reference voltage, medium speed
|
151 | }
|
152 |
|
153 | void init_ADC(void)
|
154 | {
|
155 | ADC12CTL0 = SHT0_14 + ADC12ON ;
|
156 | ADC12CTL1 = CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_0 + ADC12SSEL_2 + CONSEQ_0;
|
157 | //ADC12MCTL0 = SREF_2 + INCH_2; //ADC12MEM0, A2 PIN62
|
158 | ADC12MCTL0 = SREF_2 + INCH_3; //ADC12MEM0, A3 PIN5
|
159 | ADC12CTL0 |= ENC; //ADC startfähig machen
|
160 |
|
161 | }
|
162 |
|
163 | void init_SIO(void)
|
164 | {
|
165 | //SIO0
|
166 | ME1 |= UTXE0; //Transmitter enablen
|
167 | U0CTL |= CHAR; //8 data bits, 1 stop bit, no parity (8N1)
|
168 | //U0TCTL |= 0x10; //ACLK als UCLK festlegen
|
169 | U0TCTL |= SSEL1; // SMCLK als UCLK festlegen
|
170 | //UBR00=0xA0; UBR10=0x01; UMCTL0=0x00; /* uart0 8000000Hz 19198bps */
|
171 | //UBR00=0x41; UBR10=0x03; UMCTL0=0x09; /* uart0 8000000Hz 9600bps */
|
172 | UBR00=0x45; UBR10=0x00; UMCTL0=0xAA; /* uart0 8000000Hz 115107bp */
|
173 | //UBR00=0x45; UBR10=0x00; UMCTL0=0xD6; /* uart0 8000000Hz 114942bps */
|
174 |
|
175 | //UBR00=0x22; UBR10=0x00; UMCTL0=0xDD; /* uart0 8000000Hz 230547bps */
|
176 |
|
177 |
|
178 | U0BR1 = 0x00;
|
179 |
|
180 | U0CTL &= ~SWRST; //USART freigeben
|
181 |
|
182 | // IFG1 &= ~UTXIFG0; //initales Int-Flag löschen
|
183 | }
|
184 |
|
185 | void sio0_isr(void)
|
186 |
|
187 | {
|
188 |
|
189 | if(n_send < 4)
|
190 |
|
191 | {
|
192 |
|
193 | U0TXBUF = Ziffern[n_send];
|
194 |
|
195 | n_send++;
|
196 |
|
197 | }
|
198 |
|
199 | else
|
200 |
|
201 | {
|
202 |
|
203 | n_send = 0;
|
204 |
|
205 |
|
206 | }
|
207 |
|
208 | }
|
209 |
|
210 | void write_DAC0(unsigned int val_DAC)
|
211 | {
|
212 | DAC12_0DAT = val_DAC;
|
213 | }
|
214 | void write_DAC1(unsigned int val_DAC2)
|
215 | {
|
216 | DAC12_1DAT = val_DAC2;
|
217 | }
|
218 | void timera_isr()
|
219 |
|
220 | { /////// Initphase ////
|
221 | /// sekunden einlesen.. mitteln .. wert in unteres drittel des Wertebereichs ziehen, offset spannung waehlen und setzen,..verstaerkung auf Grundwert zurueck rechnen
|
222 | ///DAC1 Ref 2.5V
|
223 |
|
224 | //TESTOV:
|
225 | write_DAC0(0xa00);
|
226 |
|
227 | if(n_led == 0)
|
228 | {
|
229 | P1OUT = 0x00;
|
230 |
|
231 | }
|
232 | if(n_led == 1)
|
233 | {
|
234 | P1OUT |= 0x80; //P1.7 einschalten
|
235 | write_DAC1(0xa00);
|
236 |
|
237 | }
|
238 | if(n_led == 2)
|
239 | {
|
240 | P1OUT |= 0x40; //P1.6 einschalten
|
241 | write_DAC1(0x851); //LED
|
242 |
|
243 | }
|
244 | if(n_led == 3)
|
245 | {
|
246 | //write_DAC0(0x00);
|
247 | //a00 1,5V, 334 0.5V, 670 1V
|
248 | P1OUT |= 0x20; //P1.5 einschalten
|
249 | write_DAC1(0xfff); //LED
|
250 | }
|
251 |
|
252 | TBCCR0 = 0x15; //Timer_B starten (wirksam erst nach dem ersten
|
253 |
|
254 | TBCTL |= MC_1; //Timer_B erstmalig starten
|
255 | //P2OUT &= 0xfe;
|
256 | }
|
257 |
|
258 |
|
259 |
|
260 | void timerb_isr()
|
261 |
|
262 | {
|
263 | //P2OUT |= 0x02;
|
264 | n_tb++; //Inkrement des Timer_B Periodenzählers
|
265 |
|
266 | if(n_tb == 8) //4 Durchlaeufe (n_tb=4)
|
267 | { P1OUT = 0x00; //P1 ausschalten
|
268 | write_DAC1(0x00);
|
269 | P1OUT |= 0x10; //verstaerkung -1 an
|
270 | //P1OUT |= 0x01; //
|
271 | TBCCR0 = 0; //Timer_B stoppen
|
272 | n_tb = 0; //Rücksetzen des Timer_B Periodenzählers
|
273 |
|
274 | n_led++; // Zaehler naechste LED
|
275 | if(n_led == 4)
|
276 | {
|
277 | n_led = 0;
|
278 | }
|
279 | }
|
280 |
|
281 | ADC12CTL0 |= ADC12SC; //SC = Start Conversion
|
282 | while ((ADC12CTL1 & ADC12BUSY) == 1);
|
283 | //P2OUT &= 0xfd;
|
284 | }
|
285 |
|
286 | void adc_isr()
|
287 | {
|
288 | //P2OUT |= 0x04; //Pin4
|
289 | Messwerte[n_mw] = ADC12MEM0;;
|
290 | n_mw++;
|
291 |
|
292 | if(n_mw == 8)
|
293 | {
|
294 |
|
295 | n_mw = 0;
|
296 | if(n_led == 0)
|
297 | {
|
298 | mitteln();
|
299 |
|
300 |
|
301 | }
|
302 |
|
303 | if(n_led == 1)
|
304 | {
|
305 | mitteln();
|
306 | to_ascii();
|
307 | senden0();
|
308 |
|
309 | }
|
310 | if(n_led == 2)
|
311 | {
|
312 | mitteln();
|
313 | to_ascii();
|
314 | senden1();
|
315 | }
|
316 | if(n_led == 3)
|
317 | {
|
318 | mitteln();
|
319 | to_ascii();
|
320 | senden2();
|
321 | }
|
322 |
|
323 |
|
324 | }
|
325 |
|
326 |
|
327 |
|
328 | ADC12IFG = 0x0000;
|
329 |
|
330 | }
|
331 |
|
332 |
|
333 |
|
334 |
|
335 |
|
336 |
|
337 | void senden0(unsigned long value)
|
338 |
|
339 | {
|
340 | //split[0]= mw0 ; // low byte
|
341 | //split[1]= mw0/256; // high byte
|
342 | U0TXBUF = 0x23; //initiales Senden #
|
343 | }
|
344 |
|
345 | void senden1(unsigned long value)
|
346 |
|
347 | {
|
348 | //split[0]= mw1 ; // low byte
|
349 | //split[1]= mw1/256; // high byte
|
350 | U0TXBUF = 0x21; //initiales Senden "
|
351 | }
|
352 |
|
353 | void senden2(unsigned long value)
|
354 |
|
355 | {
|
356 | //split[0]= mw2; // low byte
|
357 | //split[1]= mw2/256; // high byte
|
358 | //mw2=0x600;
|
359 | U0TXBUF = 0x25; //initiales Senden %
|
360 | }
|
361 |
|
362 | void mitteln()
|
363 |
|
364 | {
|
365 |
|
366 | unsigned char i = 0;
|
367 |
|
368 |
|
369 |
|
370 | Summe = 0;
|
371 |
|
372 |
|
373 |
|
374 | for(i=0; i<8; i++)
|
375 |
|
376 | {
|
377 |
|
378 | Summe += Messwerte[i];
|
379 |
|
380 | }
|
381 |
|
382 |
|
383 |
|
384 | Summe /= i;
|
385 |
|
386 |
|
387 | i = 0;
|
388 |
|
389 | }
|
390 |
|
391 |
|
392 |
|
393 |
|
394 |
|
395 | void to_ascii()
|
396 |
|
397 | {
|
398 |
|
399 | unsigned char i;
|
400 |
|
401 |
|
402 |
|
403 | //Beschreiben des Ziffern-Arrays mit ASCII-Nullen
|
404 |
|
405 | for(i=0; i<4; i++)
|
406 |
|
407 | {
|
408 |
|
409 | Ziffern[i] = 0x30;
|
410 |
|
411 | }
|
412 |
|
413 |
|
414 |
|
415 | //Algorithmus zur Zerlegung des Spannungswertes in die einzelnen Ziffern
|
416 |
|
417 | while(Summe > 999) //1.000er Stelle abspalten
|
418 |
|
419 | {
|
420 |
|
421 | Summe -= 1000;
|
422 |
|
423 | Ziffern[0]++;
|
424 |
|
425 | }
|
426 |
|
427 |
|
428 |
|
429 | while(Summe > 99) //100er Stelle abspalten
|
430 |
|
431 | {
|
432 |
|
433 | Summe -= 100;
|
434 |
|
435 | Ziffern[1]++;
|
436 |
|
437 | }
|
438 |
|
439 |
|
440 |
|
441 | while(Summe > 9) //10er Stelle abspalten
|
442 |
|
443 | {
|
444 |
|
445 | Summe -= 10;
|
446 |
|
447 | Ziffern[2]++;
|
448 |
|
449 | }
|
450 |
|
451 |
|
452 |
|
453 | while(Summe > 0) //1er Stelle abspalten
|
454 |
|
455 | {
|
456 |
|
457 | Summe -= 1;
|
458 |
|
459 | Ziffern[3]++;
|
460 |
|
461 | }
|
462 |
|
463 | }
|