MSP430 ADC10 bei Taster-Interrupt

OP #3358172
Lesenswert?

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
}
Gast #3360028
Lesenswert?

Vision schrieb:
> Erst Variable zuweisen, dann in LPM... Ist schon
> mist, wenn an den Fingern immer die Copy-Paste klebt...

Das ist aber nur ein Teil des Übels.

delay in ISR, mitten in der ISR in den LPM wechseln, ...

Da fehlt grundsätzliches Wissen. Wenn man den LPM nicht versteht, sollte 
man ohne programmieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren