Hallo, ich habe mal wieder ein kleines Problemmit dem MSP430. Und zwar möchte ich mittels ADC10 die Spannung am P1.0 ermitteln. So lange ich das normal in der Endlosschleife mache ist das auch kein Problem. Nun möchte ich die Messung aber durch einen Taster-Intterrupt auslösen und dann funktioniert es nicht mehr. Hat irgend jemand eine Idee?
1 | #include <msp430.h> |
2 | #include "stdint.h" |
3 | |
4 | #define BUTTON_T BIT6 |
5 | #define BUTTON_Z BIT7 |
6 | #define LED_GREEN BIT5 |
7 | #define LED_YELLOW BIT6 |
8 | #define LED_RED BIT7 |
9 | |
10 | volatile uint16_t value; |
11 | |
12 | void configureADC(void){ |
13 | ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; |
14 | ADC10CTL1 = INCH_0; // Channel 0 |
15 | ADC10AE0 |= BIT0; |
16 | } |
17 | |
18 | void sampleADC(void){ |
19 | //start sampling |
20 | ADC10CTL0 |= ENC + ADC10SC; |
21 | __bis_SR_register(CPUOFF + GIE); |
22 | value = ADC10MEM; |
23 | |
24 | if(value < 341){ |
25 | P1OUT ^= LED_GREEN; |
26 | } |
27 | else if(value < 682){ |
28 | P1OUT ^= LED_YELLOW; |
29 | } |
30 | else{ |
31 | P1OUT ^= LED_RED; |
32 | } |
33 | } |
34 | |
35 | |
36 | void init(void){ |
37 | WDTCTL = WDTPW + WDTHOLD; // Watchdog Timer ausschalten |
38 | P1DIR |= (LED_GREEN + LED_YELLOW + LED_RED); // Set 1.5, 1.6, 1.7 to output direction |
39 | P2SEL &= ~(BUTTON_T + BUTTON_Z); // 2.6 and 2.7 as GPIO |
40 | P1OUT |= (LED_GREEN + LED_YELLOW + LED_RED); // turn off all LEDs |
41 | __enable_interrupt(); |
42 | } |
43 | |
44 | void buttonTinit(void){ |
45 | P2REN |= (BUTTON_T + BUTTON_Z); // Buttons |
46 | P2OUT |= (BUTTON_T + BUTTON_Z); // with PullUP |
47 | |
48 | P2IE |= (BUTTON_T + BUTTON_Z); // Button_T interrupt enabled |
49 | P2IFG &= ~(BUTTON_T + BUTTON_Z);// Interrupt-Flag clear |
50 | } |
51 | |
52 | |
53 | int main(void) { |
54 | |
55 | init(); |
56 | configureADC(); |
57 | buttonTinit(); |
58 | __low_power_mode_1(); |
59 | |
60 | for(;;) { |
61 | } |
62 | |
63 | //für Compiler |
64 | //return 0; |
65 | } |
66 | |
67 | //Button ISR |
68 | #pragma vector=PORT2_VECTOR |
69 | __interrupt void Port_2 (void){ |
70 | __delay_cycles(20); |
71 | sampleADC(); |
72 | P2IFG &= ~(BUTTON_T + BUTTON_Z); |
73 | } |
74 | |
75 | //ADC10 ISR |
76 | #pragma vector=ADC10_VECTOR |
77 | __interrupt void ADC10_ISR (void){ |
78 | __bic_SR_register_on_exit(CPUOFF); |
79 | } |