Получение и декодирование манчестерского кода через X10

Привет, я делаю проект, в котором мне нужно отправить некоторые данные через X10 с одного микроконтроллера (в частности, ATmega32) на другой микроконтроллер (снова ATmega32). Оба работают на частоте 3,8646 МГц и работают на STK500.

Казалось бы, я отправляю свои данные правильно, но у моего декодера возникают проблемы с декодированием данных.

Во-первых, когда я получаю свои данные (1 байт) через X10, я сохраняю каждый манчестерский бит в массиве символов без знака (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.

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;

person Mikkel Poulsen    schedule 16.12.2015    source источник
comment
Хей Миккель. Возможно, вам также следует задать вопрос на electronics.stackexchange.com...   -  person JoSSte    schedule 16.12.2015


Ответы (1)


Вы пробовали использовать другой порт для светодиодов? Возможно аппаратная часть неисправна.

person Kasper    schedule 16.12.2015