0
私はarduinoでシリアル通信レジスタを直接プログラミングしています(arduinoには準備済みのシリアル通信ライブラリがありますが、自分でatmega328pをプログラミングしたいと思っています)。arduinoでatmega328pのUARTをプログラミングする
私はアルドゥイーノのTXピンを使って、「」シリアルLCDに文字を送信しようとしています。 私はオンラインいくつかのリソースを参照しているし、次のコードに到着した:
#define BAUDRATE(BAUD) (((F_CPU/(BAUD*16UL)))-1)
class serials
{
serials()
{
UBRR0H = BAUDRATE(9600) >> 8;
UBRR0L = BAUDRATE(9600);
UCSR0A &= ~_BV(U2X0);
UCSR0B |= _BV(TXEN0) | _BV(RXEN0);
UCSR0C |= _BV(UCSZ00) | _BV(UCSZ01);
}
void transmit(unsigned char);
};
void serials::transmit(unsigned char data)
{
loop_until_bit_is_clear(UCSR0A,UDRE0);
UDR0 = data;
}
void loop()
{
serials lcdtransmit;
lcdtransmit.transmit(254);
lcdtransmit.transmit(1);
lcdtransmit.transmit(254);
lcdtransmit.transmit(128);
lcdtransmit.transmit('a');
while(1);
}
しかし、私はこのコードを実行すると、
- をLCDディスプレイには何も出力はありません。
- txピンは常にハイです。
while(1)
が存在しない場合は、「TXピン」ではなく、液晶ディスプレイに出力しないと出力にあるようです。
シリアル伝送のために書かれたコードに誤りがありますか?あなたのコードに到達する前に、あなたはすでにUARTに書かれているブートローダーを想定する必要がありArduinoの上328Pを使用していることを考えると
'(1)' 'ループに()'通常は良い考えではないです。 1つの理由は、チップにハードウェアウォッチドッグがある可能性があり、Arduinoライブラリは通常、それを 'loop()'の外にリセットします。 'loop()'から決して戻ってこない場合、ウォッチドッグは決してリセットされないので、チップがリブートします。このコードは、単にグローバルな 'bool'を使うだけで一度だけ実行するようにしてください。 –
@DarkFalconまた、 'setup()'を使ってプログラムの起動時に一度だけコードを実行させることもできます。 – MikeCAT
私はコードからwhileループを消去しましたが、それでも反応しません。 –