Forum: Mikrocontroller und Digitale Elektronik MSP430 ADC10 bei Taster-Interrupt


von Dominik R. (vision)


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
}

: Bearbeitet durch User
von Dominik R. (vision)


Lesenswert?

So,ich habe nun herausgefunden, das die A/D-Wandlung zwar erfolgt, aber 
der Inhalt des ADC10MEM-Registers nicht in die Variable "value" 
übernommen wird.
Kann mir jemand sagen, wo der Fehler ist?

von Family User Guide ist Spitze (Gast)


Lesenswert?

Dominik R. schrieb:
> __bis_SR_register(CPUOFF + GIE);

was bewirkt die Anweisung?

Dominik R. schrieb:
> __bic_SR_register_on_exit(CPUOFF);

und was passiert danach?

Du hast es programmiert, du musst es wissen.

von Vision (Gast)


Lesenswert?

Stimmt auffallend. Erst Variable zuweisen, dann in LPM... Ist schon 
mist, wenn an den Fingern immer die Copy-Paste klebt...

Danke für den Hinweis

von Family User Guide ist Spitze (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.