Страница 1 из 1

ATMega 16 USART

Добавлено: Вс мар 30, 2014 02:47:58
Aviator_93
Доброго времени суток. Необходимо через переходник USB-USART подключить МК к компьютеру. Сам переходник выполнен на схеме FT232RL, и находиться в исправном состояние. Для проверки переходника замыкал RDX и TDX и отправлял по нему данные через терминал, все работает, циферки отправляются и тут же приходят. Подключил выводы схемы к МК, данные от компьютера к МК передаются, но только искажаются. Отправляю циферку 7, а получаю циферку 54. Хотелось бы выяснить в чем причина такого поведения. Инициализирую USART вот таким образом:

Код: Выделить всё

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

unsigned char t = 0;

ISR(USART_RXC_vect)
{
	t = UDR;
	
	if(t == 1)
	{
		t = t + 1;
	}
}

int main(void)
{
	UBRRH = 0x00;
	UBRRL = 0x3D;
	
	UCSRB |= (1 << RXCIE)|(1 << RXEN)|(1 << TXEN);		
	UCSRC |= (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0);	
	
	sei();
	
    while(true)
    {
        
    }
}
Ах, да. Частота МК 9,6 МГц и скорость передачи данных 9600. Ну и на всякий случай настройки терминала Изображение

Re: ATMega 16 USART

Добавлено: Вс мар 30, 2014 07:20:45
ИС-пытатель
Данные искажаются потому что не совпадают настройки скоростей компа и контроллера. Ты контроллер на какую скорость настроил? ставь такую же на компе. + проверь стоп-биты, количество бит и проверку на четность. Проверь полярность.
Либо еще вариант. Отправляешь пока еще не закончилась предыдущая передача. Поэтому каша.

+ вниметельней читай даташит.
Для выбора регистра при чтении используется временная последовательность. При первом обращении возвращается значение регистра UBRRH (UBRRHn). При повторном обращении в следующем машинном цикле возвращается значение регистра UCSRC (UCSRnC). Хорошо, что у тебя UBRRH = 0. А если бы нет? Другие настройки получатся!

+ запрети прерывания во время настройки передатчика. И попробуй настраивать регистры так

UCSRB = (1 << RXCIE)|(1 << RXEN)|(1 << TXEN);
UCSRC = (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0);


Если все правильно настроено - ищи паразитные емкости.


Еще заметил у тебя косяк. ты 7 в шестнадцетеричном виде отправляешь? или в ASCII ? У тебя галка на второй вариант стоит. это 55 в десятичном (близкое к полученному тобой значение, не правда ли?) и 0x37 в 16-ричном виде.

Re: ATMega 16 USART

Добавлено: Вс мар 30, 2014 08:51:37
ARV
дополнительно порекомендую использовать модуль WinAVR, специально предназначенный для облегчения настроек util/setbaud.h

Re: ATMega 16 USART

Добавлено: Вс мар 30, 2014 21:13:04
Aviator_93
Спасибо, вроде заработало, все правильно приходит. Появилась еще одна проблема. Вот допустим, отправил на МК число 21, МК принял это число, следом я отправляю на МК число 43, почему то, он получает предыдущее число т. е. 21, отправляю 43 второй раз и вот, только на второй раз, число 43 нормально доходит. Получается, числа нужно передавать по два раза. В чем, собственно, может быть проблема?

Re: ATMega 16 USART

Добавлено: Вс мар 30, 2014 22:54:13
ИС-пытатель
не может такого быть. Ищи ошибку в программе