Forum: Mikrocontroller und Digitale Elektronik Problem ADC10 MSP430 interner Tempsensor


von Jonas E. (joenten)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem, ich habe eine Programm geschrieben, dass den 
interen Temperatursensor zur Temperaturmessung benutzt und mir diese 
Temperatur auf einem LCD-Display ausgibt. Das glaubt auch alles 
wunderbar.

Nur wenn ich jetzt den oberen Teil meiner While-Schleife
1
 
2
char ch_repeat = 0;
3
    float f_messureSum = 0;
4
    float f_messure = 0;
5
        
6
    for ( ch_repeat = 5;  ch_repeat > 0; ch_repeat--)
7
    {
8
      ADC10_start();
9
      f_messure = ADC10MEM;                  // Messergeniss von ADC10 speichern  
10
      f_messureSum += f_messure;
11
    }
12
    f_messureAverage = f_messureSum/5;

in eine Funktion einbauen will und dann nur noch die Funktion in der 
While-Schleife aufrufen möchte, geht das irgendwie nicht mehr. Er misst 
dann erst gar nichts mehr und ruft auch nicht die Mess-Funktionen auf.
Weiß jemand an was das liegen könnte?
Das ist der komplette  Code:
1
#include <msp430g2452.h>
2
#include "init.h"
3
#include "lcdroutine.h"
4
#include <string.h>
5
#include <stdlib.h>
6
#include <stdio.h>
7
8
9
10
/************************************************************
11
* declarations
12
************************************************************/
13
14
void ADC10_start(void);        // ADC10 start
15
float f_messureAverage;
16
float f_messure;
17
long l_temperature;
18
char ch_outTemperature[];
19
char ch_repeat = 0;
20
  float f_messureSum = 0;
21
  float f_messure = 0;
22
23
void TA_start(void);
24
void ADC10_start(void);
25
//void ADC10_messure(void);
26
27
/************************************************************
28
* main
29
************************************************************/
30
31
int main(void)
32
{
33
  INIT_msp();              // Initialisierung MSP  
34
  LCD_Init();                    // Initialisierung LCD
35
  LCD_CursorOn(0);          // LCD Cursor off   
36
  
37
  LCD_SetCursorPos(1,1);        // Cursor Postion setzen  
38
  LCD_OutString("Temperatur:");     // Ausgabe
39
  
40
  while(1)
41
    {
42
    char ch_repeat = 0;
43
    float f_messureSum = 0;
44
    float f_messure = 0;
45
        
46
    for ( ch_repeat = 5;  ch_repeat > 0; ch_repeat--)
47
    {
48
      ADC10_start();
49
      f_messure = ADC10MEM;                  // Messergeniss von ADC10 speichern  
50
      f_messureSum += f_messure;
51
    }
52
    f_messureAverage = f_messureSum/5;  
53
        
54
    l_temperature = ((((f_messureAverage/1024)*1.5)-0.986)/0.00355);
55
    ltoa (l_temperature, ch_outTemperature);
56
    LCD_SetCursorPos(2,8);        // Cursor Postion setzen  
57
    LCD_OutString(ch_outTemperature);   // Ausgabe
58
    LCD_OutString(" Grad   ");        // Ausgabe
59
    }
60
}
61
62
/************************************************************
63
* functions
64
************************************************************/
65
void TA_start(void)
66
{
67
  TACTL   |= TACLR        // Clear Timer
68
       + MC_1;        // UP-Mode/Timer startet
69
}
70
void ADC10_start(void)
71
{  
72
  TA_start();
73
  ADC10CTL0 |= ENC           // ADC10 Enable Conversion
74
        + ADC10SC;        // ADC10 Start Conversion
75
  __bis_SR_register(CPUOFF + GIE);    // LPM0, ADC10_ISR will force exit
76
}
77
78
//void ADC10_messure(void)
79
//{
80
//
81
//}
82
83
/************************************************************
84
* Interrupt Service Routines
85
************************************************************/
86
87
#pragma vector=TIMER0_A0_VECTOR
88
__interrupt void ta0_isr(void)
89
{
90
  TACCR0 &= ~CCIFG;
91
  P1OUT ^= BIT6;
92
}
93
94
#pragma vector=ADC10_VECTOR
95
__interrupt void ADC10_ISR(void)
96
{
97
   __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR) wake up MSP
98
   ADC10CTL0 &= ~ADC10IFG;          // ADC10 interupt flag reset
99
   ADC10CTL0 &= ~ENC;            // rest ENC
100
   TACTL   &= ~(MC0 | MC1);        // Timer stoppt
101
 }

danke für eure Hilfe :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jonas Enderlin schrieb:
> Das ist der komplette  Code:

Nö. Das ist nicht der Code, in dem Du uns zeigst, wie Du versucht hast, 
Deine Messroutine in eine Funktion auszulagern, das ist nicht der Code, 
der "irgendwie" nicht funktioniert, sondern das ist der Code, der bei 
Dir (wohl) funktioniert.

Das Wort "messure" solltest Du noch mal durch Deinen spell-checker 
jagen.

von Jonas E. (joenten)


Lesenswert?

Ja das ist der Code, nachdem ich meine Änderung vorgenommen habe und die 
Funktion nicht aufgerufen wird.
1
#include <msp430g2452.h>
2
#include "init.h"
3
#include "lcdroutine.h"
4
#include <string.h>
5
#include <stdlib.h>
6
#include <stdio.h>
7
8
9
10
/************************************************************
11
* declarations
12
************************************************************/
13
14
void ADC10_start(void);        // ADC10 start
15
float f_measureAverage;
16
float f_measure;
17
long l_temperature;
18
char ch_outTemperature[];
19
char ch_repeat = 0;
20
float f_measureSum = 0;
21
float f_measure = 0;
22
23
void TA_start(void);
24
void ADC10_start(void);
25
void ADC10_measure(void);
26
27
/************************************************************
28
* main
29
************************************************************/
30
31
int main(void)
32
{
33
  INIT_msp();              // Initialisierung MSP  
34
  LCD_Init();                    // Initialisierung LCD
35
  LCD_CursorOn(0);          // LCD Cursor off   
36
  
37
  LCD_SetCursorPos(1,1);        // Cursor Postion setzen  
38
  LCD_OutString("Temperatur:");     // Ausgabe
39
  
40
  while(1)
41
    {
42
    void ADC10_measure(void);    
43
      
44
    l_temperature = ((((f_measureAverage/1024)*1.5)-0.986)/0.00355);
45
    ltoa (l_temperature, ch_outTemperature);
46
    LCD_SetCursorPos(2,8);        // Cursor Postion setzen  
47
    LCD_OutString(ch_outTemperature);   // Ausgabe
48
    LCD_OutString(" Grad   ");        // Ausgabe
49
    }
50
}
51
52
/************************************************************
53
* functions
54
************************************************************/
55
void TA_start(void)
56
{
57
  TACTL   |= TACLR        // Clear Timer
58
       + MC_1;        // UP-Mode/Timer startet
59
}
60
void ADC10_start(void)
61
{  
62
  TA_start();
63
  ADC10CTL0 |= ENC           // ADC10 Enable Conversion
64
        + ADC10SC;        // ADC10 Start Conversion
65
  __bis_SR_register(CPUOFF + GIE);    // LPM0, ADC10_ISR will force exit
66
}
67
68
void ADC10_measure(void)
69
{
70
  char ch_repeat = 0;
71
  float f_measureSum = 0;
72
  float f_measure = 0;
73
      
74
  for ( ch_repeat = 4;  ch_repeat > 0; ch_repeat--)
75
  {
76
    ADC10_start();
77
    f_measure = ADC10MEM;                  // Messergeniss von ADC10 speichern  
78
    f_measureSum += f_measure;
79
  }
80
  f_measureAverage = f_measureSum/4;  
81
}
82
83
/************************************************************
84
* Interrupt Service Routines
85
************************************************************/
86
87
#pragma vector=TIMER0_A0_VECTOR
88
__interrupt void ta0_isr(void)
89
{
90
  TACCR0 &= ~CCIFG;
91
  P1OUT ^= BIT6;
92
}
93
94
#pragma vector=ADC10_VECTOR
95
__interrupt void ADC10_ISR(void)
96
{
97
   __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR) wake up MSP
98
   ADC10CTL0 &= ~ADC10IFG;          // ADC10 interupt flag reset
99
   ADC10CTL0 &= ~ENC;            // rest ENC
100
   TACTL   &= ~(MC0 | MC1);        // Timer stoppt
101
 }

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jonas Enderlin schrieb:
> while(1)
>     {
>     void ADC10_measure(void);

Das ist kein Funktionsaufruf. Das ist ein Funktionsprototyp.

Wenn Du beide void entfernst, wird ein Funktionsaufruf daraus.


Wie wäre es mit einem C-Buch?

Nach wie vor zu empfehlen:
Brian Kernighan & Dennis Ritchie, "Programmieren in C", 2. Ausgabe, 
Hanser-Verlag.

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.