どのように私は私のAVRは、シリアルポートを介して話をできるようにするには、このコードを修正することができますか?

StackOverflow https://stackoverflow.com/questions/846206

  •  21-08-2019
  •  | 
  •  

質問

私はRS232の上に自分のコンピュータに話を私のSTK200上のATmega162を取得しようとしている最近の私の髪を引っ張ってきました。私がチェックし、STK200はMAX202CPEチップが含まれていることを確認しました。

私はその内部8MHzのクロックを使用するようにチップを設定し、8でそれを割ってきます。

私は、データシート(とコンパイラが訴えの変更を行った)のうち、しかし無駄にコードをコピーしようとしました。

私のコードは以下の通りです、誰かが私には私がいる問題を解決する助けてくださいだろうか?

私は自分のシリアルポートが他のデバイス上で動作し、故障していないことが確認されました。

ありがとうございます。

#include <avr/io.h>
#include <avr/iom162.h>

#define BAUDRATE 4800

void USART_Init(unsigned int baud)
{
    UBRR0H = (unsigned char)(baud >> 8);
    UBRR0L = (unsigned char)baud;

    UCSR0B = (1 << RXEN0) | (1 << TXEN0);

    UCSR0C = (1 << URSEL0) | (1 << USBS0) | (3 << UCSZ00);
}

void USART_Transmit(unsigned char data)
{
    while(!(UCSR0A & (1 << UDRE0)));

    UDR0 = data;
}

unsigned char USART_Receive()
{
    while(!(UCSR0A & (1 << RXC0)));

    return UDR0;
}

int main()
{

    USART_Init(BAUDRATE);

    unsigned char data;

    // all are 1, all as output
    DDRB = 0xFF;

    while(1)
    {
        data = USART_Receive();

        PORTB = data;

        USART_Transmit(data);


    }
}
役に立ちましたか?

解決 4

もう少し徹底的にデータシートを読んだ後、私は間違ってボーレートを設定しました。 ATmega162のデータシートには、クロック周波数のチャートは、ボーレートおよび対応するエラーに対してプロットしました。

4800ボーレートおよび1MHzのクロック周波数の場合、誤差は私のために許容できるものであった0.2%でした。トリックではなく4800の、USART_Init()関数に12を通過した。

これは他の誰かを役に立てば幸い!

他のヒント

私はグレッグの回答にコメントしましたが、もう一つを追加したいと思います。この種の問題のために、それをデバッグする金の標準的な方法は、最初のは、その後、オシロスコープを取得し、ライン上で何が起こっているか確認するために、の非同期シリアル通信を理解することです。文字が交換されており、それだけでボーレートの問題だ場合、これはあなたが見ているボーレートを計算し、それに応じて除数を調整することができますので、特に参考になります。

ここでは、超迅速なプライマー、あなたがはるかに包括的なWikipediaのか、他の場所で何かを見つけることができますは間違いありません。

のは、8ビット、パリティなし、1ストップビット(最も一般的なセットアップ)を想定してみましょう。 (「?」= ASCII)送信されている文字がある場合は、0x3fを言って、その行はこのようになります。

...--+   +---+---+---+---+---+---+       +---+--...
     | S | 1   1   1   1   1   1 | 0   0 | E
     +---+                       +---+---+

ハイ(1)レベルは、RS232レベルに変換した後、チップと-12Vで+ 5Vである。

ロー(0)レベルは、RS232レベルに変換した後、チップに0Vと+ 12Vである。

Sはスタートビットである。

その後、我々は8つのデータビットを持っているので、ここでは、最下位の最初00111111 = 0x3fを= '?' ます。

Eが停止(E終了の)ビットである。

ボーレートは、4800の場合

時間は、ちょうどオシロスコープのディスプレイのように、左から右に進んでいるし、各ビットのスパン(4800分の1)秒= 0.21ミリ秒(約)ます。

の行をサンプリングし、立ち下がりエッジを探すことによって、受信機の動作は、(静止ラインは、単に論理「1」のすべての時間)。それが収集するの後に連続して、次にサンプルライン8ビット時間を受信機がボーレート、スタートビット数(1)を知っているので、スタートビットの中央を見つけるために、立ち下がりエッジから半分のビット時間を測定しますデータビット。受信機は、次に、(ストップビットを介して途中まで)もう一つのビット時間を待機し(すなわち立ち下がりエッジ)が別のスタートビットを探し始めます。一方、読み込んだ文字は、システムの残りの部分に使用可能になります。送信機は、ストップビットが完了するまで次の立ち下がりエッジで開始しないことを保証します。トランスミッタは常に、(追加のストップビットで)長く待つが、それは、従来の問題である、余分なストップビットのみが非常に遅い、ハードウェアおよび/またはソフトウェアのセットアップを必要としたようにプログラムすることができます。

私は、参考資料が手元にないが、ボーレートレジスタUBRRは、通常、除数値ではなく、希望のボーレート自体が含まれています。 4800ボーの正しい除数値だから239であってもよいことを示しているの迅速なGoogle検索試してみてください。

divisor = 239;
UBRR0H = (unsigned char)(divisor >> 8);
UBRR0L = (unsigned char)divisor;
これがうまくいかない場合は、

、正しい除数の計算式のためのあなたの特定のチップのためのリファレンスドキュメントで確認します。

UART通信をデバッグするために、行うには2つの有用なものがある:

1)コネクタにループバックを行うと、あなたが書いたもの戻って読むことができることを確認してください。あなたが文字を送信し、それを正確に取り戻す場合は、ハードウェアが正しく配線されていることを知っており、それは、少なくともUARTのレジスタ構成の基本セットは正しいです。

2)繰り返し文字は0x55(「U」)を送る - バイナリビットパターン01010101を使用すると、すばやく速度設定が正しいことを確認できるようになるオシロスコープ、上のビット幅を見ることができるようになります。

scroll top