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

 
 
 
Reply to this topicStart new topic
> странное поведение мега8 и USART
Метценгерштейн
сообщение Sep 5 2013, 12:55
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



выводит слово в терминалку не до конца, а в след. проход его дописывает. Например,
Код
        putchar ('A');
        putchar ('B');
        putchar ('C');

выведет
AB
в след. цикл допишет недостающую С и снова выведет на новой строчке AB

Код
void putchar (char sym) {       //отправка символа
  while(!(UCSRA & (1<<UDRE)));
  UDR = sym;
}


а почему?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Sep 5 2013, 14:23
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Потому , что буфер USART может сохранить два символа ,которые и выведет без Вашего вмешательства , а в это время проц походит где-то по своим делам и тольког когда обратит внимание , что USART делать нечего , вернётся и добавит ему ещё один символ


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 5 2013, 15:05
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



а как лучше дописать, чтобы он все-же выводил все, что я туда напихал?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Sep 6 2013, 02:32
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Делается так.
В функции putchar проверяется доступность USART (пользовательский флаг). Если доступен, то туда пишется символ и разрешается прерывание по опустошению, если нет, то символ записывается во временный буфер (очередь).
Cоздается прерывание по опустошению USART. В нем проверяется очередь на наличие символов. Если очередь не пуста, то символ отправляется, если пуста - то флаг скидывается и прерывание запрещается.

Второй вариант.
Если делаете без прерываний, то в putchar необходимо организовать цикл по проверке флага UDRE.

Сообщение отредактировал alexeyv - Sep 6 2013, 02:36
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 6 2013, 07:13
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Код
void putchar (char sym) {      
  while(!(UCSRA & (1<<UDRE)));
  UDR = sym;
}

вот делаю без прерываний, проверяю UDRE.

но именно в этой ситуации и не дописывает символы. Может терраТерм подглючивает?

Было сделано на прерываниях и FIFO буферах- тот же эффект, хотя раньше такого не наблюдалось- на др. проектах. Ушел от прерываний, т.к. в проге у себя из прерывания надо отправить данные.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Sep 6 2013, 17:30
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 10:53
Рейтинг@Mail.ru


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