我正在进行嵌入式系统项目,我试图从红外传感器(使用'脉冲宽度调制')解调数据。下面的代码只是等待IR传感器开始脉冲,然后测量每个高低脉冲的宽度(持续时间)。
在这段代码中,我有一个循环,我在这里增加一个整数:
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似乎有时是负数(例如-1054
的值)。我完全感到困惑,因为它首先被定义为0
而且我所做的一切都是增加它,所以它怎么会变成负面的呢?
答案 0 :(得分: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打印为无符号值(使用第一位不是信号而是值)...
答案 1 :(得分:0)
由于这是嵌入式的,我将假设您正在使用16位整数。结果,如果你将highPulse增加32,768次,它将溢出并变为负数。值从0x7fff(正)转换为0x8000(负)。
如果延迟循环为20 usec,则需要655.36毫秒。任何时候第一个循环必须等待这个位转换的长时间,你将得到负数。我原以为这很有可能。
你有32位长吗?如果是这样,最简单的解决方案可能是将它们用于这些计数器。然后溢出需要大约40,000秒,这应该足够了。