2

你好,我正在做一个项目,我需要通过 X10 从一个微控制器(特别是 ATmega32)向另一个微控制器(同样是 ATmega32)发送一些数据。两者的时钟频率为 3.8646 MHz,并在 STK500 上运行。

看起来我正确地发送了我的数据,但我的解码器似乎无法解码数据。

首先,当我通过 X10 接收到我的数据(1 个字节)时,我将每个曼彻斯特位保存在一个无符号字符数组中(1/0 作为起始位,其余是数据)。然后我将数据保存在另一个无符号字符数组(称为缓冲区)中。出于测试目的,我通过 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](由于某种原因,“1”不会保存为“1”,但“0”会保存作为'0'),这表明数据已正确发送。

但是,如果我随后尝试将缓冲区解码为单个 char 字节,我永远不会得到预期的结果。在下面的代码中,我再次将接收到的数据保存在缓冲区中,然后尝试在终端和 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 进行调试,变量字节总是会出现我选择的正确值。

我真的可以使用一些帮助,因为我无法弄清楚发生了什么。

writeAllLEDs()

PORTC = ~pattern; 

发送字符()

 // Wait for transmitter register empty (ready for new character)
  while ( (UCSRA & (1<<5)) == 0 )
  {}
  // Then send the character
  UDR = Tegn;
4

1 回答 1

0

您是否尝试过为 LED 使用另一个端口?可能是硬件有问题。

于 2015-12-16T15:23:09.510 回答