2014-06-14 3 views
0

저는 IR 센서 ('펄스 폭 변조'사용)의 데이터를 복조하려고하는 임베디드 시스템 프로젝트에서 작업하고 있습니다. 아래의 코드는 IR 센서가 펄싱을 시작할 때까지 대기 한 다음 각각의 고저 펄스의 폭 (지속 시간)을 측정합니다. 이 코드에서0에서 증가하는 정수가 음수가됩니다.

, 내가 정수 증가하고있어 루프가 있습니다

irPulseSet irReadPulse() 
{ 
irPulseSet outputPulseSet; 
int pulseCount = 0; 

int finished = 0; 

while(1) 
{ 
    int lowPulse = 0; 
    int highPulse = 0; 

    while(bit_is_clear(irSensorPin , irSensorPinNo)) 
    { 
     highPulse++; 
     _delay_us(20); 
    } 

    while(!bit_is_clear(irSensorPin , irSensorPinNo)) 
    { 
     if (lowPulse > 3250) 
     { 
      finished = 1; 
      break; 
     } 
     lowPulse++; 
     _delay_us(20); 
    } 

    if (finished) 
     break; 

    outputPulseSet.pulses[pulseCount][0] = highPulse * 20; 
    outputPulseSet.pulses[pulseCount][1] = lowPulse * 20; 

    pulseCount++; 
} 

// Assign pulse count to output pulse set 
outputPulseSet.pulseCount = pulseCount; 

return outputPulseSet; 
} 

이 임베디드 시스템 프로젝트, 내 자원이 한정되어 있기 때문에를, 나는 LCD 내 디버깅을하고 있어요 (회로가 컴퓨터에 접속 될 수 없기 때문에) 표시

인쇄

int irPrintPulses(irPulseSet pulseSet) 
{ 
    int counter; 
    for(counter = 0; counter <= pulseSet.pulseCount; counter++) 
    { 

     LCDClearScreen(); 
     char printStr[100]; 

     sprintf(printStr , "H%iL%i;%i " , pulseSet.pulses[counter][0] , pulseSet.pulses[counter][1] , counter ); 
     LCDSendString(printStr); 
     _delay_ms(1000); 
    } 

    _delay_ms(5000); 
    LCDClearScreen(); 
    LCDSendString("Finished pulse print!"); 
    _delay_ms(1000); 
    LCDClearScreen(); 

    return 0; 
} 

lowPulse INT 때로는 부정적인 것으로 보인다 각 펄스 (E g 값 : -1054). 나는 그것이 처음으로 0으로 정의 된대로 완전히 혼란 스럽습니다. 그리고 나는 그 모든 것을 늘리므로, 그것이 어떻게 부정적이 될 수 있습니까?

+0

로컬 변수로'highPulse'와'lowPulse'를 재 선언하면 어떤 차이가 있습니까? 그들의 유형은 무엇입니까? –

+0

@StephenC 그들은 int 형이고, 나는 지역 선언을 시도했지만 여전히 부정적이다. – user2166351

+0

lowPulse가 음수라는 것을 어떻게 알 수 있습니까? 전체 코드를 게시 할 수 있습니까? –

답변

0

이것은 임베디드되어 있으므로 사용자가 16 비트 intege로 작업하기 rs. 결과적으로 highPulse가 32,768 배 증가하면 오버플로되어 음수가됩니다. 값은 0x7fff (양수)에서 0x8000 (음수)으로 변환됩니다.

20usec의 지연 루프가 주어지면, 이것은 655.36msec 걸릴 것이다. 첫 번째 루프가 비트가 전환되기까지이 시간 동안 기다려야 할 때마다 음수를 얻습니다. 나는 이것이 가능하다고 생각했을 것이다.

32 비트 길이가 있습니까? 그렇다면 가장 간단한 해결책은이 카운터에 사용하는 것입니다. 그런 다음 오버플로하는 데 약 40,000 초가 소요됩니다.이 정도면 충분합니다.

3

당신은 숫자를 표현하기 위해 X 비트가 1 비트는 신호이며, X - 1 비트는

당신이 4 비트로 표현되는 숫자가 있다고 가정 할 수있는 값입니다 :

0000 = 1

= 0

0001 ...

0111 = 7

,745,151 여기서 1을 증가하면, 첫 번째 비트를 변경한다 5,

(신호 비트)

1,000 = -8

가 최대치로부터 1을 추가 한

#include <stdio.h> 
#include <limits.h> 
int main() 
{ 
    int i = INT_MAX; 

    printf("%d\n", i); 
    printf("%d\n", i + 1); 
    printf("%u\n", i + 1); 

    if(i > 0) 
     printf("greater\n"); 

    i++; 

    if(i < 0)   
     printf("what kind of witchcraft is that?"); 
} 

노호 코드 사용해 3 번째 printf는 부호가없는 값으로 출력됩니다. (신호가 아닌 값을 나타내는 첫 번째 비트를 사용하여) ...

+4

숫자가 컴퓨터에서 어떻게 나타 났을까요? "int"를 "unsigned int"로 변경하면 와트가 발생합니다. – nightshade

관련 문제