2014-06-14 69 views
0

我正在研究一個嵌入式系統項目,我嘗試解調來自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; 
} 

因爲這是一個嵌入式系統項目,我的資源是有限的,我做我調試了一臺液晶顯示器(作爲電路不能連接到計算機)

打印每個脈衝

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似乎有時是否定的(例如g值爲-1054)。我完全感到困惑,因爲它首先被定義爲0,我所做的所有事情都是增加它,那它怎麼會變成負值?

+0

如果您將'highPulse'和'lowPulse'重新聲明爲局部變量,它有什麼區別嗎?他們的類型是什麼? –

+0

@StephenC它們是'int'類型的,我剛剛嘗試過在本地聲明,它仍然變爲負數。 – user2166351

+0

你怎麼知道lowPulse是一個負值?你能發佈整個代碼嗎? –

回答

0

因爲這是嵌入式,我會假設你是使用16位整數RS。結果,如果你增加高脈衝32,768次,它會溢出並變爲負值。該值從0x7fff(正數)轉換爲0x8000(負數)。

給定20個usec的延遲循環,這將花費655.36毫秒。任何時候,第一個循環必須等待這麼長時間才能轉換,您將得到負數。我原以爲這很有可能。

你有32位長嗎?如果是這樣,最簡單的解決方案可能是將它們用於這些計數器。然後它將需要約40,000秒的溢出,這應該足夠了。

3

你有X位來表示一個數字:1位是信號和X - 1位是價值

可以說你有一個與4位表示一個數字:

0000 = 0

0001 = 1

...

0111 = 7

如果您在此處增加1,您將改變第一位(信號位)

1000 = -8

嘗試波紋管

#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?"); 
} 

代碼一旦你最大值之後加一個它會翻轉到最大的負值,第三個printf打印爲一個無符號值(使用第一位而不是信號,但值)...

+4

您如何看待計算機中的數字? 將「int」更改爲「unsigned int」並查看發生了什麼 – nightshade