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

Просто отправить байт с atmega169P

Добавлено: Ср ноя 12, 2014 16:24:48
krokodandi
Здравствуйте.
Прошу помочь достичь понимания механизма передачи байта по UART. Именно по UART, ибо только это и надо.
Вроде, понимание есть, но не работает механизьм.
Как должно быть?
1 инициализируем
2 проверяем, готов ли буфер
3 если готов, кладем байт
4 если флаг заполнения упал, значит буфер не пуст.
5 Включаем прерывание
6 байт ушел
и когда флаг UDRE0 поднялся, буфер пуст и можно сывать следующий байт...
Чего хочу добиться?
Нормального срабатывания по флагу UDRE0. Чтобы отправка массива символов шла, пока еще есть в массиве символы.
Кончился массив,...
UCSR0B &=~(1<<UDRIE0); ...хорош!
Что делает мкашка? Ну она мигает светодиодом вывода 3 и зажигает светодиод на выводе 4. И все. Но данных нет.
Код написан тут... Подправлен 13.11.14 http://codepad.org/R1wuoesk
Зачем так? Чтобы не ждать и не делать лишних телодвижений. (Хочу так)
Код данные не отправляет. Прошу рассудить...
Переделал. Американские друзья помогли, все ровно также, не шлется массив.
Вот последний вариант http://codepad.org/UnBTdTYE

Re: Просто отправить байт с atmega169P

Добавлено: Чт ноя 13, 2014 22:26:26
krokodandi
Странно, что народ просто проходит мимо. А вот западные спецы помогли разобраться всего за один день
Это же фрики =)

Re: Просто отправить байт с atmega169P

Добавлено: Чт ноя 13, 2014 23:05:11
Gurvinok

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

void USART_Transmit(unsigned char data )
{
    /*
    Wait for empty transmit buffer
    */
    while
    ( !( UCSRA & (1<<UDRE)) );
    /*
    Put data into buffer, sends the data
    */
    UDR = data;
}
А что тут думать. Я просто открыл документацию на мегу32 и на странице 147 откопипастел фнкцию передачи. Вот и все, в чем сложность?
А чтоб совсем все было кашерно, запили на STM32 там DMA есть, он все за тебя сделает, лишь укажы чего , откуда и сколько. :))

Re: Просто отправить байт с atmega169P

Добавлено: Чт ноя 13, 2014 23:40:10
krokodandi
Gurvinok писал(а):

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

А что тут думать.   :))[/quote]
Да есть чего. Например, вот ты копировал. Ты знаешь, что код работает. Я тоже знаю. Но ведь с мк ничего не отправляется! Объясни мне, почему?
Я, думаешь, просто так к профи полез? Нееет =) Потому что  не пашет и точка.  Есть три контроллера, я проверял каждый. Не пашет. Проверял адаптеры rs232 - их два - пашут
Вот попутно посмотрел осциллом, что там происходит на плечах моего кварца....  Разве так должно быть?

Re: Просто отправить байт с atmega169P

Добавлено: Чт ноя 13, 2014 23:45:28
krokodandi
Вот

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 07:19:48
ARV
100% работающее готовое решение: http://www.simple-devices.ru/articles/7 ... console-io

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 13:13:27
Gurvinok
Если не пашет функция из документации, значит:
1 Работает ли кварц.
2 Правильно ли прошиты фьюз биты (под текущий кварц)
3 Правильно ли настроен USART
4 Не перепутаны ли аппаратно Rx с Tx

У меня была ситуация когда UART слал постоянно мусор, я тоже все перепробовал, в итоге оказалась микросхема. Поменял МК на новый и все пошло как по маслу.

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 13:37:18
krokodandi
фьюзы даны ниже
уарт настроен как в последнем примере тут
rx tx перепутаны, может быть, но я менял их местами. Осцлл показывает, что из tx идут сигналы, постоянно транслируется 00

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 13:52:55
Gurvinok
А что показывает осцил на Tx?
Рекомендую Логический Анализатор

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 14:39:10
krokodandi
Gurvinok писал(а):А что показывает осцил на Tx?
Рекомендую Логический Анализатор
есть, но немножко не такой...
импульсы идут. Длительность в 0.962 мс

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 14:43:48
Gurvinok
Ну тогда тут поможет только это.
Изображение

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 15:00:26
krokodandi
Gurvinok писал(а):Ну тогда тут поможет только это.
Изображение
скорость повыше помогла. Мне помогли и посоветовали 19200.
Работает все как надо =) я счастлив

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 15:09:40
krokodandi
Было ощущение что дело в этом еще вчера.
Смотри...
Я заливаю программу, там 9600.
Врубаю терминалку. Меняю скорость начиная с градации в 600 бод на терминалке
1200 - FF
2400 - FF
4800 - FF
9600 - 00
и дальше, и дальше - 00
нужная скорость между 4800 и 9600. Такое моё ощучивание
терминалка Advanced Serial Port Terminal

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 15:14:37
ARV
начинать надо с безусловно работающего кода. например, по моей ссылке. даже если он делает не то, что вам надо - так вы сможете определить, в схеме или программе у вас проблема. если готовый код работает - либо сравнивайте его со своим, чтобы найти причину, либо модифицируйте его под свои нужды - если главное результат.
если 100% правильный код не работает - ищите причину в аппаратуре: то ли схема у вас не правильная, то ли кварц не тот, то ли фьюзы, то ли контакт в разъеме барахлит...

как-то так. а в бубен постучите на радостях, когда решите проблему - в иные моменты не помогает :)))

P.S. в самом начале используйте терминалку попроще, например, стандартную для винды Terminal или Hyper Terminal и обмен текстом, а не байтами. а еще лучше сначал наладить обмен в протеусе с его терминалом.
может у вас терминалка ваша крутая как-то не настроена и кажет бред собачий, а вы голову ломаете...

Re: Просто отправить байт с atmega169P

Добавлено: Пт ноя 14, 2014 15:32:04
krokodandi
Конечно же. Сначала я написал код. Потом я дал его проверить и в паузах проверял фьюзы и настройки. Были сомнения насчет крутой терминалки, но дело не в крутости. Другие, более простые терминалки показывали тоже самое. И только на этой терминалке я менял скорости. Более того, эта терминалка давала мне возможность понять разницу между сессией и открытым портом. Все решилось, потому как я сидел и искал причину. Догадался бы сам рано или поздно(хотел скорость поменять после еще одной проверки). Хорошо, что помогли обнаружить проблему хорошие люди. Хорошо что вы есть =) А посему Спасибо за помощь
Вот мой окончательный код. Он работает замечательно
http://codepad.org/ezEshi5I