帮助AVR和串行端口

时间:2011-07-25 19:26:14

标签: c serial-port avr avr-gcc

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

avrdude -pm644 -cavrisp2 -Pusb -b2400 -u          -Uflash:W:ImpactTarget.hex:一          -Ulfuse:W:0xe2:米          -Uhfuse:W:0xd8:米          -Uefuse:W:0xff的:米

#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;
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:-1)

我认为你是对的 - 这可能是一个时间问题:内部RC振荡器通常太不精确,无法用于USART。

我会尝试连接一个外部晶体(并相应地设置保险丝),看看它是否有帮助。

答案 2 :(得分:-1)

这正是我花费3天的项目时间,只是尝试将Baudrate设置为(9600)并设置Baudrate的(X2)选项。它应该工作。