Привет, я делаю проект, в котором мне нужно отправить некоторые данные через 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;