在arduino上编程atmega328p的UART

Programming atmega328p's UART on arduino

本文关键字:UART atmega328p 编程 arduino      更新时间:2023-10-16

我直接对其Atmega328p的串行通信寄存器进行编程(我知道Arduino中有一个现成的串行通信库,但我想尝试对Atmega328p进行编程)。

我试图通过使用Arduino的TX PIN将字符" 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. LCD显示器上没有输出。
  2. TX引脚总是很高。
  3. 当不存在while(1)时,似乎在" TX PIN"处输出,但在LCD显示屏上没有输出。

为串行传输编写的代码中是否存在任何错误?

鉴于您在Arduino上使用了328p,您应该假设启动加载程序在达到代码之前已经写入UART寄存器。因此,UCSR0B和UCSR0C寄存器应完全分配,而不仅仅是在设定的位中掩盖。