Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: странное поведение мега8 и USART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Метценгерштейн
выводит слово в терминалку не до конца, а в след. проход его дописывает. Например,
Код
        putchar ('A');
        putchar ('B');
        putchar ('C');

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

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


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

Второй вариант.
Если делаете без прерываний, то в putchar необходимо организовать цикл по проверке флага UDRE.
Метценгерштейн
Код
void putchar (char sym) {      
  while(!(UCSRA & (1<<UDRE)));
  UDR = sym;
}

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

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

Было сделано на прерываниях и FIFO буферах- тот же эффект, хотя раньше такого не наблюдалось- на др. проектах. Ушел от прерываний, т.к. в проге у себя из прерывания надо отправить данные.
smalcom
...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.