2

こんにちは、あるマイクロコントローラー (具体的には 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;
4

1 に答える 1

0

LED 用に別のポートを使用してみましたか? ハードウェアが故障している可能性があります。

于 2015-12-16T15:23:09.510 に答える