簡體   English   中英

在Arduino上編程atmega328p的UART

[英]Programming atmega328p's UART on arduino

我正在通過直接對其atmega328p的串行通信寄存器進行編程來嘗試在arduino中進行串行傳輸(我知道arduino中有一個現成的串行通信庫,但我想自己嘗試對atmega328p進行編程)。

我正在嘗試使用arduino的tx引腳將字符“ a”發送到串行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. 液晶顯示器上沒有輸出。
  2. tx引腳始終為高電平。
  3. while(1)不存在時,似乎在“ tx引腳”輸出,而LCD顯示屏上沒有輸出。

為串行傳輸編寫的代碼中是否有任何錯誤?

假設您在Arduino上使用328p,則應該假定引導加載程序已在到達代碼之前已寫入UART寄存器。 因此,應該完全分配UCSR0B和UCSR0C寄存器,而不僅僅是屏蔽設置的位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM