реклама на сайте
подробности

 
 
> Некорректная работа UART, Mega162
_lukash_
сообщение Jan 4 2008, 17:08
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-09-07
Из: Винница
Пользователь №: 30 222



Всем привет!

Пытаюсь заставить работать UART0 на Mega162, но не получаетсяsad.gif
Если смотреть виндовым терминалом, то при настройке COM на нужную скорость, он ничего не принимает - если на меньшей, то всякие крякозябры. Если смотреть COM Port Toolkit, то на нужной скорости принимаются одни 0. Сам UART вроде правильно настроил, уже много вариантов перепробовал - все равно не корректно работаетsad.gif

UBRR0L = ((int)((float)XTAL_FREQ/16/9600+0.5)-1); //set baud rate lo
UBRR0H = ((int)((float)XTAL_FREQ/16/9600+0.5)-1) >> 8; //set baud rate hi

UCSR0B = (1<<RXCIE0) + (1<<RXEN0) + (1<<TXEN0);
UCSR0C = (1<<URSEL0) + (1<<UCSZ01)+(1<<UCSZ00);

Кварц 14745600.
В UBRR0L записывается 95 - как раз как в даташите рекомендуют для этого кварца при скорости 9600.

Вот сама отправка :

while ( !(UCSR0A & (1<<UDRE0)) ) ;
UDR0 = data;
while ( !(UCSR0A & (1<<TXC0)) ) ;

Мож кто чет подскажет - раньше отлаживал просто - смотрел приходят какие-то данные или нет, а ща уже конкретней нужно смотреть что именно приходит..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Jan 4 2008, 17:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Вот так у меня
Код
  UCSR0A    = 2;                                        // Удвоение    частоты
  UCSR0B    = 0x90;                                        // Разрешить ввод, прерывание    при    вводе
  UCSR0C    = 0x6;                                        // 8-N-1
  UBRR0 = (FCLK/9600/8)-1;                                // 4800
//  TCCR0A    = 0;                                        // Запустить таймер    1 в    режиме normal
  TCCR2B    = 0x7;                                        // FCLK/1024

где
#define FCLK 14745600 // Частота контроллера

Может у вас fuse выставлены от внутреннего генератора или установлен CKDIV8 (по умолчанию - enabled). Это найболее частые ошибки.

Проверить легко. Инициализируйте на вывод и выводите непрерывно 0x55. Станьте осциллом и замерьте.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016