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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.