2016-06-18 2 views
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); 
} 

しかし、私はこのコードを実行すると、

  1. をLCDディスプレイには何も出力はありません。
  2. txピンは常にハイです。
  3. while(1)が存在しない場合は、「TXピン」ではなく、液晶ディスプレイに出力しないと出力にあるようです。

シリアル伝送のために書かれたコードに誤りがありますか?あなたのコードに到達する前に、あなたはすでにUARTに書かれているブートローダーを想定する必要がありArduinoの上328Pを使用していることを考えると

+2

'(1)' 'ループに()'通常は良い考えではないです。 1つの理由は、チップにハードウェアウォッチドッグがある可能性があり、Arduinoライブラリは通常、それを 'loop()'の外にリセットします。 'loop()'から決して戻ってこない場合、ウォッチドッグは決してリセットされないので、チップがリブートします。このコードは、単にグローバルな 'bool'を使うだけで一度だけ実行するようにしてください。 –

+1

@DarkFalconまた、 'setup()'を使ってプログラムの起動時に一度だけコードを実行させることもできます。 – MikeCAT

+0

私はコードからwhileループを消去しましたが、それでも反応しません。 –

答えて

1

を登録します。したがって、UCSR0BおよびUCSR0Cレジスタは、設定されたビットでマスクするのではなく、完全に割り当てる必要があります。

関連する問題