Hallo zusammen,
ich habe hier das ez430-RF2500 Set von TI. Es handelt sich dabei um 2
Platinen mit jeweils einem MSP430-2274 drauf, welche über das SimpliciTI
Protokoll miteinander kommunzieren. Es gibt von TI eine Demo, wo auf
beiden Seiten die Temperaturen gemessen und über den USB Debugger
(virtueller Comport) als String ausgegeben wird.
Der vollständige Sourcecode findet sich hier:
http://www.ti.com/litv/zip/slac139c
Problem besteht nun am AP/HUB mit der Temperaturerfassung. Die
Temperatur schwankt sehr stark, daher habe ich versucht einen Mittelwert
zu bilden über 64 Werte. Grundlegend funktioniert es auch, die
Temperatur ist recht "stabil". Allerdings stürzt das Programm meist so
nach ca. 3h ab. Es bleibt einfach stehen. Im Programm werden an mehreren
Stellen noch die LEDs geschaltet; beim Absturz ist der Zustand immer
unterschiedlich, was mich vermuten lässt, dass das Problem nicht immer
an der selben Stelle auftritt.
Das original Programm von TI läuft fehlerfrei durch.
Zunächst poste ich erstmal den relevanten Code aus der main_AP.c
1 | // if it is time to measure our own temperature...
|
2 | if(sSelfMeasureSem)
|
3 | {
|
4 | char msg [6];
|
5 | char addr[] = {"HUB0"};
|
6 | char rssi[] = {"000"};
|
7 | int degC, volt;
|
8 | volatile long temp;
|
9 | int results[2];
|
10 |
|
11 | ADC10CTL1 = INCH_10 + ADC10DIV_4; // Temp Sensor ADC10CLK/5
|
12 | ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR;
|
13 | for( degC = 240; degC > 0; degC-- ); // delay to allow reference to settle
|
14 | ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
|
15 | __bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled
|
16 | results[0] = ADC10MEM;
|
17 |
|
18 | ADC10CTL0 &= ~ENC;
|
19 | ...
|
Ich habe nun ganz pragmatisch einfach eine for-Schleife um den ADC Teil
gesetzt, aufsummiert und am Ende durch 64 geteilt (bzw 6 Bit nach rechts
geschoben)
1 | // if it is time to measure our own temperature...
|
2 | if(sSelfMeasureSem)
|
3 | {
|
4 | char msg [6];
|
5 | char addr[] = {"HUB0"};
|
6 | char rssi[] = {"000"};
|
7 | int degC, volt;
|
8 | volatile long temp;
|
9 | int results[2];
|
10 | uint16_t adcsum = 0;
|
11 | uint8_t i;
|
12 |
|
13 | ADC10CTL1 = INCH_10 + ADC10DIV_4; // Temp Sensor ADC10CLK/5
|
14 | ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR;
|
15 |
|
16 | for( i = 64; i > 0; i-- )
|
17 | {
|
18 | for( degC = 240; degC > 0; degC-- ); // delay to allow reference to settle
|
19 | ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
|
20 | __bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled
|
21 | // results[0] = ADC10MEM;
|
22 | adcsum += ADC10MEM;
|
23 |
|
24 | ADC10CTL0 &= ~ENC;
|
25 | }
|
26 | adcsum = adcsum>>6;
|
27 | results[0] = (int) adcsum;
|
28 | ...
|
Das sind die einzigen Änderungen.. was ist daran falsch, so dass der
Controller/das Programm nach ca. 3h (manchmal früher, manchmal später)
einfach stoppt?
Grüße,
devzero