2009-02-26 3 views
3

압력 측정 장치를 개발 중입니다. 필자는 MSP430F133 칩을 사용하고 IAR 임베디드 워크 벤치를 사용했습니다. 그것은 3 개의 다른 단위에있는 압력을 보여준다.MSP 430 잘못된 값이 표시됨

저는 32 개의 샘플을 가져 와서 평균을 내고 있습니다. 단위 선택 출력 값에 따라 P5의 단위 선택이 계산되어 LCD에 표시됩니다.

이제 "IN WC"단위는 분석을 위해 바이너리 평균 입력 값을 표시합니다.

문제 : 한 잘못된 값이 수 있듯이 기본 단위 (MM WC) 값은 제대로하지만 테스트 상황에서 표시되는 압력은 내려 간다 해제 될 때와 LCD는

+31.8 
+31.7 
+31.6 
+31.5 
+31.4 
+31.3 
+31.2 
+31.2 
+31.1 
+31.5 (wrong reading randomly between *.4 to *.7) 
+30.9 

다음과 같이 그 이유를 알 수 없습니다.

+0

문제를 격리해야합니다. 먼저 디스플레이에 원시 ADC 값을 보내고 Excel과 같은 것을 사용하여 변환 및 확인 값을 수행합니다. 디스플레이에 공간이 있으면 adc와 caculated 값을 출력합니다. 출력하는 모든 상수 또는 변수도 출력됩니다. –

+0

소스를 더 이상 사용할 수 없습니다. – eaanon01

답변

1

이것은 비린내로 보입니다. 아마 & &해야한다 :

 for (i=0; i<= 3||res[i]!='\0'; i++) 

그러나이 문제를 일으키는 어떻게 표시되지 않습니다.

또한 코드를 정리하고 단순화해야합니다. 읽는 것은 매우 어렵습니다.

4

아래의 코드에서 ptiveValue = value와 d1 = value이므로 d2는 항상 0입니다. 그러면 루프에= 3 || res [i]! = '\ 0'에 대한 이 있습니다. 나는 (I = 0 해야하는 ) ++; 내가 < = 3 & & 고해상도 [I] = '\ 0';! 내가 ++) 그래서 항상 당신이

을 원하지 무엇을 버퍼에 남아 있었는지 출력한다

나쁜 코드 :

if (cntd <= 4) 
{ 
    d2 = (unsigned int) abs((ptiveValue - d1) * 10000); // get 4 digits of real part 
    itoa1(d2, res, &cntreal); 
    for (i=0; i<= 3||res[i]!='\0'; i++) 
    { 
     wr_lcd_dr(res[i]); 

    } 
} 

고정 코드

if (cntd <= 4) 
{ 
    // get 4 digits of real part 
    d2 = (unsigned int) ((ptiveValue - (unsigned int)(d1)) * 10000); 
    itoa1(d2, res, &cntreal); 
    for (i=0; (i<= 3) && (res[i]!='\0'); i++) 
    { 
     wr_lcd_dr(res[i]);  
    } 
} 

또한 버퍼를 덮어 쓰고 이상한 행동을 유발할 수 있습니다.

unsigned short Adcinb[32]; 
for (i = 0; i <= 63; i++) 
Adcinb[i] = 3180; 

내가 그것을 실제 값이 감지되고 반영하지 않는 한 그 값을 받고있을만한 특별한 이유가 표시되지 않는 코드를 찾고

unsigned short Adcinb[32]; 
for (i = 0; i < 32; i++) 
Adcinb[i] = 3180; 
+0

그는 다른 메모리를 덮어 쓰고 있습니다.이 결과를 줄 수도 있고주지 않을 수도 있지만, 프로그램 시작시 한 번만 발생합니다. 해결해야 할 것이지만 문제의 원인이 아닐 수도 있습니다 ... –

+0

MSP430에는 변수를 알고있는 메모리에 스택이나 힙이 없으므로 clobbering합니다. 그러나 아마 문제의 원인이 아닌 것에 동의합니다. –

+0

MSP430의 일부 변형에는 버퍼/스택이 있습니다. – Sharique

0

이어야한다.

프로그램을 실행하고 문제가있는 번호, 그 전에 번호 및 그 이후의 번호를 평균화하기 전에 32 개의 값을 출력 할 수 있습니까?

또는 샘플을 가져올 때마다 새 샘플을 작성하고 해당 데이터를 제공하십시오.

-Adam

2

더 이상 소스 코드를 작품에 두 개의 링크의 불행하게도 없음. 그러나 내가 볼 수있는 것은이 곳에서 예상되는 '올바른'마지막 자리가 0이라는 사실입니다. 제 생각에 계산 또는 시각화 코드 어딘가에이 제로가 잘못 입력되어 정지 조건으로 받아 들여지고 임의의 숫자가 그 자리에 표시됩니다. (단지 '31'을 출력에 제공되고 있지만, 3 자리 숫자는 디스플레이로 전송되는)

'||'/ '& &'문제는 상기 코드가 매우 직진이 아닌 경우 인 것을 알 나머지도 마찬가지입니다. 여기에 잘못된 정지 조건이 있고 고정 길이 루프가있을 수 있습니다.

'야생의 추측'(TM)이지만 실제 코드를 알지 못해도 내가 제공 할 수있는 최선입니다.

1

나는 여러분이 시도 할 수있는 ADC 101 솔루션을 제안 할 것입니다. 사용하는 센서 유형에 따라 샘플 판독 값을 정리하기 위해 자체 수신 거부를 수행해야 할 수 있습니다. 나는이 기사를 과거에 언급했으며,이 기술을 배우는 데 매우 도움이된다는 것을 발견했다 : A Guide to De-bouncing by Jack G. Ganssle!

하드웨어가 디 바운싱을 필요로한다고 가정하고 있지만 앞에서 언급 한 것처럼 가이드가이를 확인하는 데 도움이됩니다. 비록 당신이 그것을 요구하지 않더라도 당신은 관계없이 그것을 발견 할지도 모른다!

추가 : 압력이 풀려 났을 때 이상한 독서가 발생했다는 의견을 말씀하신 이유를 알고 계실 것입니다. De-bouncing 에러는 기계적 기반의 스위치와 센서의 작동 중 샘플링에서 분명합니다.

+1

2009 년 한 달 동안 질문에 대답하기 위해 잠시 ... – Fz3