c - 有关 AVR 和串行端口的帮助

标签 c serial-port avr avr-gcc

我在串行通信方面遇到问题。我已将 AtMega644 连接到采用 9600 8N1 的串行 LCD。我只是得到垃圾。通过垃圾,我只是得到一些 U、P、T 和 @,而不是所需的“U”。我使用内部 8Mhz RC Osc 和下面列出的 fuse 。我怀疑是时间问题,但我不确定我错在哪里。我添加了一个闪烁的 LED,计时看起来很正确(眼球和数字秒表)。任何帮助表示赞赏。

avrdude-pm644-cavrisp2-Pusb-b2400-u -Uflash:w:ImpactTarget.hex:a -Ulfuse:w:0xe2:m -Uhfuse:w:0xd8:m -Uefuse:w:0xff:m

#define F_CPU 8000000
#define BAUDRATE 9600
#define UBRRVAL (F_CPU/(BAUDRATE*16UL)) -1


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>



/***************************************************** USART_Init()
*
*
**/
void USART_Init () {
    //Set baud rate
    UBRR0H = (unsigned char)(UBRRVAL>>8);   //high byte
    UBRR0L = (unsigned char) UBRRVAL;       //low byte

    //Asynchronous normal speed
    UCSR0A = (0<<U2X0);

    //Enable Transmitter and Receiver and Interrupt on receive complete
    UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);

    //page 186 Set asynchronous mode,no parity, 1 stop bit, 8 bit size
    UCSR0C= (0<<UMSEL00)| (0<<UMSEL01)|             //Async
            (0<<UPM00)  | (0<<UPM01)  |             //Parity None
            (0<<USBS0)  |                           //Stop bits 1
            (0<<UCSZ02) | (1<<UCSZ01) |(1<<UCSZ00); //8 Bits

    //enable interrupts
    sei();
}


/******************************************** send_btye
* sends one byte to serial port
**/
void send_byte (char data) {
    while ( ! (UCSR0A & (1<<UDRE0)) )
        /* NOOP */;
    UDR0 = data;
}


/**
 * _delay_ms has a short time so this is an extension
 */
void delay_ms (int time) {
    for (int i = 0; i < time; i++) {
        _delay_ms(1);
    }
}

/****************************** main *********/
int main () {
    USART_Init();
    DDRA = 0xff;

    for (;;) {
        send_byte('U');
        delay_ms(500);
        PORTA ^=_BV(PA0);
    }

    return 0;
}

最佳答案

您的 UBRRVAL 没有完全用括号括起来其表达式,因此当它在 UBRRVAL >> 8 之类的上下文中展开时,>> 8不按您期望的方式应用。

关于c - 有关 AVR 和串行端口的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6821219/

相关文章:

c++ - 在 32 位平台上编译 OpenSSL 1.1.1g。 MSYS2 - 失败

c++ - 尝试使用 CreateFileMapping 和自定义 DACL 创建只读共享内存区域在 OpenFileMapping 中失败

c++ - 是否可以在 C++ 中为嵌入式平台创建新的原始类型?

c++ - static_assert 始终计算为真(avr、g++)

c - 每次运行代码时都会生成不同的输出

c++ - C++ 中的 C99 样式可变长度数组函数签名

c open() 未定义错误 : 0 on os x

javascript - 使用 JavaScript 访问 DLL

C write() 在调用 close(fd) 之前不发送数据

eclipse - 使: *** No rule to make target `main.o'