我尝试使用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)
答案 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似乎可以更好地工作。