こんにちは、あるマイクロコントローラー (具体的には ATmega32) から別のマイクロコントローラー (ATmega32) に X10 経由でデータを送信する必要があるプロジェクトを行っています。どちらも 3.8646 MHz でクロックされ、STK500 で動作します。
データを正しく送信しているように見えますが、デコーダーでデータのデコードに問題があるようです。
まず、X10 経由でデータ (1 バイト) を受信すると、すべてのマンチェスター ビットを符号なしの char 配列に保存します (1/0 を startbit として保存し、残りはデータです)。次に、データを別の 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;
たとえば、送信機が 10 進数の 150 を送信した場合、端末は [120 0 0 120 0 120 120 0] を表示します (何らかの理由で「1」は「1」として保存されませんが、「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;
SendChar()
// Wait for transmitter register empty (ready for new character)
while ( (UCSRA & (1<<5)) == 0 )
{}
// Then send the character
UDR = Tegn;