带有中断的Atmega168 USART发送器

时间:2019-01-01 17:09:25

标签: avr atmega usart

我尝试使用USART将数据从Atmega168A-PU传输到计算机。 为此,我编写了以下代码:

#include <avr/io.h>
#include <stdlib.h>

#define F_CPU 8000000UL
#define USART_BAUD 9600
#define UBRR_VALUE (F_CPU/16/USART_BAUD - 1)

void
usart_init(void)
{
    UBRR0H = (unsigned char)(UBRR_VALUE >> 8);
    UBRR0L = (unsigned char)UBRR_VALUE;
    UCSR0B = _BV(TXEN0) | _BV(UDRIE0);
    UCSR0C = _BV(USBS0) | _BV(UCSZ00) | _BV(UCSZ01);
    //UCSR0C = _BV(UCSZ00) | _BV(UCSZ01);
}


ISR(USART0_UDRE_vect)
{
    UDR0 = '0';
    UCSR0A |= _BV(TXC0);
}

int main(void)
{
    usart_init();
    while(!(UCSR0A & _BV(UDRE0)));
    UDR0 = '0';
    while(1);
    return 0;
}

我已经连接了Arduino USB2SERIAL转换器来读取计算机上的值,但是该转换器说他不接收数据,我的计算机也不接收数据。

注意:我的lfuse是0xe2(禁用了CLKDIV8),所以我有8MHz的F_CPU。
注意:我也尝试过不使用UCSR0A |= _BV(TXC0);
注意:我在AVcc和AGnd之间有一个电容器。
注意:保险丝:(E:F9,H:DF,L:E2)

1 个答案:

答案 0 :(得分:0)

这个问题很容易。我忘了@KIIV指出的#include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> #define F_CPU 8000000UL #define USART_BAUD 9600 #define UBRR_VALUE (F_CPU/16/USART_BAUD - 1) void usart_init(void) { UBRR0H = (unsigned char)(UBRR_VALUE >> 8); UBRR0L = (unsigned char)UBRR_VALUE; UCSR0B = _BV(TXEN0) | _BV(TXCIE0); UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); //UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); sei(); } ISR(USART_TX_vect) { UDR0 = '0'; UCSR0A |= _BV(TXC0); } int main(void) { usart_init(); while(!(UCSR0A & _BV(UDRE0))); UDR0 = '0'; while(1); return 0; } (也u / odokemono指出了这一点)。谢谢。

另外,最好使用USART_TX_vect而不是USART0_UDRE_vect,因为我的接收器已被禁用。这是更正的代码:

{{1}}

顺便说一句:正如u / odokemono指出的那样,我禁用了第二个停止位,因为没有第二个停止位,我的USB2SERIAL似乎可以更好地工作。