UART経由の予期しないAtmega16応答
問題の概要
私はコードではATmega16を点滅している必要があります私は端子を介してそれを送るどんなキャラクターはATmega16送信バックにつながります。返事はもらえますが、送ったキャラクターはめったにありません。ボーレートを変更すると正しい出力が表示されますが、正しいボーレートが機能する理由がわかりません。
もっと詳しく
私はかなり楽しんでいるので、自分の時間にファームウェアプログラミングについてもっと学びたいと思っています。これまでに私がuniで行ったファームウェアプログラミングでは、ペリフェラルインターフェースの多くを実行してセットアップするスケルトンコードファイルが提供されましたが、これを自分で学びたいと思います。私がここで何をしているのかについていくつか質問がありますが、最後に項目ごとに説明します。私の知識の誤解や潜在的なギャップを見つけたら、私はあなたが持っているかもしれないどんなインプットにも大いに感謝します。
コード
私のAtmega16にフラッシュしたコードは、このページにある「AVR-GCCでのUSARTの使用」チュートリアルからほぼ一行ずつ取得されています。追加したのは、F_CPUの#defineだけです。元のコードにはF_CPUの#defineがなかったため、コードがAtmelStudio 7でコンパイルされませんでした。作成者が元のファイルでF_CPUを定義しなかった理由を誰かが説明できますか?彼らはAtmel Studio 7以外のツールやコンパイラーを使用していたのではないかと思いますが、確かなことは言えません。
#include <avr/io.h>
#define F_CPU 7372800 //this was chosen because the tutorial states this is the frequency we want to operate at
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((( F_CPU / 16) + ( USART_BAUDRATE / 2)) / ( USART_BAUDRATE )) - 1)
int main ( void )
{
char ReceivedByte ;
UCSRB = (1 << RXEN ) | (1 << TXEN ); // Turn on the transmission and reception circuitry
UCSRC = (1 << URSEL ) | (1 << UCSZ0 ) | (1 << UCSZ1 ); // Use 8- bit character sizes
UBRRH = ( BAUD_PRESCALE >> 8); // Load upper 8- bits of the baud rate value into the high byte of the UBRR register
UBRRL = BAUD_PRESCALE ; // Load lower 8- bits of the baud rate value into the low byte of theUBRR register
for (;;) // Loop forever
{
while (( UCSRA & (1 << RXC )) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
while (( UCSRA & (1 << UDRE )) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
UDR = ReceivedByte ; // Echo back the received byte back to the computer
}
}
ハードウェアのセットアップ
- MCU:Atmega16;
- ツールチェーン:Atmel Studio 7、AVR dragonで点滅。
- 電源:大学提供の開発ボード(コンピュータUSBから取得)から取得した5Vレール。ブレッドボードの電力線のバイパスに使用される100nFセラミックディスクコンデンサ
- USBからシリアルへのコンバーター:これ。RXD Atmega(ピン15)に接続されたUSBシリアルコンバーターのTXD。AtmegaのRXD(ピン14)に接続されたコンバーターのRXD。
端末ソフトウェア:PuTTY(ボーレート9600)。
誤った応答の証拠
繰り返しますが、Atmega は送信されたものを返す必要があります。つまり、OUTPUTはINPUTとまったく同じである必要があります。
PuTTY出力
オシロスコープのキャプチャ
私のPicoscopeとシリアルデコードを使用して、Atmegaが正しい入力を受け取っていることを確認しました。たとえば、 'f'キーを押すと、正しく受信されます。出力はまだ「6」(または場合によってはアンパサンド「&」)です。
よくわからない修正を見つけました
ボーレートを2500in PuTTYに変更すると、すべてが正しく表示されます。私はこの値をランダムに選択しましたが、なぜ機能するのかわかりません(ボーレートでエラーが発生したと思われますが、チュートリアルをほぼ正確にコピーしたため、どこにあるのかわかりません...思想)。
ご質問
- 私は何をしましたか/ここで何が起こっていますか?
- 元のチュートリアルがF_CPUを#defineしないのはなぜですか?
- なぜボーレートを2500に設定すると問題が解決するのですか?(質問1が回答された場合、これは回答されると思います)