您好我正在做一个项目,我需要通过X10将一些数据从一个微控制器(特别是ATmega32)发送到另一个微控制器(同样是ATmega32)。两者都的时钟频率为3.8646 MHz,运行在STK500上。
我似乎正确地发送了数据,但我的解码器似乎无法解码数据。
首先,当我通过X10接收数据(1个字节)时,我将每个曼彻斯特位保存在unsigned char数组中(1/0为startbit,rest为数据)。然后我将数据保存在另一个unsigned char数组(称为缓冲区)中。出于测试目的,我通过UART在终端上显示数据。相关代码可以在这里找到。
unsigned char buffer[9];
index = 2;
for (int i = 0; i < BYTE; i++)
{
// If bit 1 is received save that
if (reciever[index] != 0 && reciever[index+1] == 0)
{
buffer[i] = 1;
index += 2;
}
// If bit 0 is received save that
else if (reciever[index] == 0 && reciever[index+1] != 0)
{
buffer[i] = 0;
index += 2;
}
else
break;
}
for (int i = 0; i < BYTE; i++)
{
SendChar(buffer[i]);
}
mode = MODE_IDLE;
这似乎有效,如果发送器发送小数150,则终端显示[120 0 0 120 0 120 120 0](由于某种原因&#39; 1&#39;赢得了保存为&#39; 1&#39;,但&#39; 0&#39;将保存为&#39; 0&#39;),这表示数据IS正确发送。
然而,如果我然后尝试将缓冲区解码为单个字节字节,我永远不会得到预期的内容。在下面的代码中,我再次将接收到的数据保存在缓冲区中,然后尝试在终端上显示它们,并在STK500上显示一些LED。
unsigned char buffer[9];
index = 2;
for (int i = 0; i < BYTE+1; i++)
{
// If bit 1 is received save that
if (reciever[index] != 0 && reciever[index+1] == 0)
{
buffer[i] = 1;
index += 2;
}
// If bit 0 is received save that
else if (reciever[index] == 0 && reciever[index+1] != 0)
{
buffer[i] = 0;
index += 2;
}
else
break;
}
unsigned char shifter = 0;
unsigned char byte = 0;
for (int i = 0; i < BYTE+1; i++)
{
if (buffer[i] != 0)
{
shifter = (1 << (BYTE - (i+1)));
byte += shifter;
}
else if (buffer[i] = 0)
{
shifter = 0;
byte += shifter;
}
}
mode = MODE_IDLE;
SendChar(byte);
writeAllLEDs(byte);
在终端上我得到128和120而在STK500上只有led7和led1亮起,这表明我的解码已关闭。但是,如果尝试通过Atmel Studio进行调试,变量 byte 总会出现我选择的正确值。
我真的可以使用一些帮助,因为我无法弄清楚发生了什么。
PORTC = ~pattern;
// Wait for transmitter register empty (ready for new character)
while ( (UCSRA & (1<<5)) == 0 )
{}
// Then send the character
UDR = Tegn;
答案 0 :(得分:0)
您是否尝试过使用其他端口作为LED?也许硬件有问题。