Я хочу настроить UART на ATmega88-PA. Сначала я пытался установить прерывание в регистре UDRE, но это не сработало, поэтому для передачи я использую обычный опрос. Поскольку код не работал, я снова начал с 0 с базовой программы.
#define F_CPU 1000000UL
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 8UL))) - 1)
char ReceivedByte = '#';
int main (void)
{
UCSR0A = (1 << U2X0);
/* Turn on the transmission and reception circuitry. */
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
/* Use 8-bit character sizes. */
//UCSR0C = (1 << UCSZ00) | (1 << UCSZ01);
/* BAUD prescale */
UBRR0 = 12;
/* Load upper 8-bits of the baud rate value into the high byte of the UBRR register. */
//UBRR0H = (BAUD_PRESCALE >> 8);
/* Load lower 8-bits of the baud rate value into the low byte of the UBRR register. */
//UBRR0L = BAUD_PRESCALE;
UCSR0B |= (1 << RXCIE0);
sei();
DDRB |= 0x04;
PORTB &= ~0x04;
for (;;)
{
/* Do nothing until data have been received and is ready to be read from UDR. */
//while ((UCSR0A & (1 << RXC0)) == 0) {};
/* Fetch the received byte value into the variable "ByteReceived". */
//ReceivedByte = UDR0;
if(ReceivedByte == '1')
PORTB |=0x04;
else
PORTB &=~0x04;
/* Do nothing until UDR is ready for more data to be written to it. */
while ((UCSR0A & (1 << UDRE0)) == 0) {};
/* Echo back the received byte back to the computer. */
UDR0 = ReceivedByte;
}
}
ISR(USART_RX_vect)
{
ReceivedByte = UDR0;
}
И код работает, но когда я открываю последовательный монитор Arduino и подключаю к нему свой модуль, я получаю свой бедный #, но alog с каким-то мусором. Не всегда, но в основном мусор занимает 1 или 2 байта. Кто-нибудь может мне помочь?
РЕДАКТИРОВАТЬ: кажется, что когда я отправляю данные с моего Bluetooth на Samsung Galaxy S3, данные идеальны ... Я понятия не имею, почему на последовательном мониторе, а также при отправке данных с использованием того же Bluetooth на ноутбук я получил много мусора вместе с данными. Если это поможет вам ответить на мой вопрос, будет здорово.
РЕДАКТИРОВАТЬ: извините, забудьте последнее редактирование, он отправляет только char, я меняю char, а также мусор. Когда я отправляю строку, она не читается.
РЕДАКТИРОВАТЬ: Как я писал ниже в сообщении embedded_guy, я решаю проблему, вставляя _delay_ms(1) после отправки каждого байта. и это работает прямо сейчас. я верю заявлению
while ((UCSR0A & (1 << UDRE0)) == 0) {};
не выполняет свою работу. Надеюсь, это поможет другим.
ReceivedByte
volatile
. - person Travis Griggs   schedule 10.06.2014