Здравствуйте, я делаю проект, в котором мне нужно отправить некоторые данные через 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’), что означает, что данные отправлены правильно.
Однако если я попытаюсь декодировать буфер в отдельный байт, я никогда не получу то, что предполагалось. В приведенном ниже коде я снова сохраняю полученные данные в буфере, а затем пытаюсь показать их на терминале и некоторых индикаторах на 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, переменная байт всегда выходит с правильными значениями, которые я выбрал.
Я мог бы действительно использовать некоторую помощь, потому что я не могу понять, что происходит.
PORTC = ~pattern;
// Wait for transmitter register empty (ready for new character)
while ( (UCSRA & (1<<5)) == 0 )
{}
// Then send the character
UDR = Tegn;
Вы пытались использовать другой порт для светодиодов? Возможно, аппаратное обеспечение неисправно.
Других решений пока нет …