Доброго времени суток.
Битый день промучался с UART, пытаясь заставить его нормально работать. Методом тыка выяснил, что работает при скорости 14400 бод (пробовал также 9600 и 19200). Но имеется несколько проблем, которые так побороть и не удалось:
1) Отправляемые с ПК символы принимаются не все (с потерями).
2) Отправляемые с МК символы приходят на ПК в виде "ааа" (любые).
3) В каком виде приходят на МК символы неизвестно, но похоже тоже не те, что нужно.
В чем может быть причина? Код:
CODE
#define F_CPU 8000000L
#define LED1 0
#define LED2 1
#define LED_PORT PORTB
#define LED_DDR DDRB
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
ISR(USART_RX_vect)
{
switch(UDR)
{
case '1': LED_PORT |= 1<<LED2; break;
case '0': LED_PORT &= ~(1<<LED2); break;
default: break;
}
}
int main(void)
{
#define baudrate 14400L
#define bauddivider (F_CPU/(16*baudrate)-1)
#define HI(x) ((x)>>8)
#define LO(x) ((x) & 0xFF)
UBRRL = HI(bauddivider);
UBRRH = LO(bauddivider);
UCSRA = 0;
UCSRB = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE;
UCSRC = 0<<UMSEL|1<<UCSZ0|1<<UCSZ1;
LED_DDR = 1<<LED1|1<<LED2;
LED_PORT = 0xFF;
sei();
while(1)
{
LED_PORT ^= 1<<LED1;
_delay_ms(1000);
}
return 0;
}
P.S. В качестве USB-UART использую программатор USBASP с прошивкой AVR-Doper, в качестве терминала - avrdebug.
Сообщение отредактировал IgorKossak - Sep 13 2012, 20:27
Причина редактирования: [codebox] для длинного кода!!!