【问题标题】:Programming atmega328p's UART on arduino在 arduino 上编程 atmega328p 的 UART
【发布时间】:2016-06-18 16:36:09
【问题描述】:

我正在尝试通过直接对其 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 引脚”似乎有输出,但液晶显示屏上没有输出。

为串口传输编写的代码有错误吗?

【问题讨论】:

  • while(1) in loop() 通常不是一个好主意。一个原因是芯片可能有一个硬件看门狗,而 Arduino 库通常会在loop() 之外重置它。如果您从未从loop() 返回,则看门狗永远不会重置,因此将导致芯片重新启动。您应该通过简单地使用全局 bool 来确保此代码只运行一次。
  • @DarkFalcon 或者使用setup() 让一些代码在程序启动时只执行一次。
  • 我什至从代码中删除了 while 循环,但即便如此它也没有响应。

标签: c++ arduino avr


【解决方案1】:

鉴于您在 Arduino 上使用 328p,您应该假设引导加载程序在您访问代码之前已经写入 UART 寄存器。因此,UCSR0B 和 UCSR0C 寄存器应该被完全分配,而不是仅仅在你的设置位中屏蔽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2021-05-19
    • 2013-01-20
    • 2020-07-20
    • 1970-01-01
    • 2015-04-09
    相关资源
    最近更新 更多