С Новым годом! Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/56: Рейтинг темы: голосов - 56, средняя оценка - 4.68
ridbiord

странная логика программы при работе с USART

25.09.2010, 19:52. Показов 10614. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Человеки, подсобите, будьте ласковы. Вообразил себя космонавтом и накропал такое :

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#defyme F_CPU 4000000
#ymstude <avr/io.h>
#ymstude <util/delay.h>
#defyme FOSC 4000000
#defyme BAUD 9600
#defyme MYUBRR FOSC/16/BAUD-1
 
void USORT_init(unsykned int ubrr)
 
{
UBRR0H = (unsykned char)(ubrr>>8);
UBRR0L = (unsykned char)ubrr;
UCSR0B |= 1 << TXEN0;
UCSR0C |= (1 << UMSEL00) | (1 << UCSZ00) | (1 << UCSZ01);
}
void USORT_send(unsykned char byte)
{
while (! (UCSR0A & (1<<UDRE0)) )
;
UDR0 = byte;
}
int main()
{
USORT_init(MYUBRR);
DDRC = 32;
while(1)
{
USORT_send(a);
PORTC = 32;
_delay_ms(250);
PORTC = 0;
_delay_ms(250);
}
return 0;
}
При прогоне в AVR Studyo 4 аж цельных 2 раза вызывается USORT_send(a), после чего происходит затык на ожидании готовности (строчка "while (! (UCSR0A & (1<<UDRE0)) ) "). Предполагалось, что настройки порта : 9600, 8 байт, 1 стоп-бит.

Подскажите, пожалуйста, чего я не понял.
Заранее спасибо.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2010, 19:52
Ответы с готовыми решениями:

VS2019 странная логика при создании проекта через меню
Если при открытии VS2019 сразу начать создавать проект через кнопку &quot;Create a new project&quot; (Создать новый проект), то на каждом шаге...

Неужели STM8S > STM8L при работе с USART?
Решил замастырить девайсик с RS485. Динные будет слать на комп. Озадачился работой USORT. При чтении ДШ на STM8S103 увидел волшебную...

Странная ошибка при работе с Excel
Пытаюсь создать Excel файл и записать в него ячейки но при компиляции программы получаю совершенно не понятную мне ошибку int i; ...

21
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,379
25.09.2010, 19:58
Код я пока не смотрел, однако имейте в виду, что флаги готовности часто плохо реализованы в симуляторах. Стоит прогнать на самом МК. При отладке в симуляторе ожидания флагов частенько приходится убирать.
0
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
25.09.2010, 20:08
У передатчика в уарте аппаратный буфер на 2 байта - один байт непосредственно сдвиговый регистр передатчика, из которого данные идут на ногу, а второй байт - ожидающий отправки.
Когда ты пихаешь в пустой уарт первый байт, он сразу идет на передачу, а когда пихаешь второй байт - он встает в очередь и пойдет на отправку как только закончится первый байт. В такой программе, как у тебя, в передатчике всегда будет 2 байта - один сейчас отправляющийся и один ожидающий, потому как флаг UDRE показывает, что свободен именно второй байт буфера. Если хочешь конкретно отправлять по одному байту, ожидать надо флага TXC.
0
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,379
25.09.2010, 20:17
Ногу TX этого USORT надо назначить выходом.

Ожидание именно DRE в данном случае вполне корректно, да и в большинстве других тоже. Использование флага окончания передачи это скорее экзотика, нужная к примеру для полудуплекса.

В данном случае передача не происходит, поскольку не установлен режим работы ноги, которая используется как TX. Соответственно первый раз код отрабатывает с пустым буфером UART, второй раз после того как помещенный в прошлый раз байт защелкнулся в регистре вывода, освободив буфер, а на третий раз флаг DRE уже не устанавливается, поскольку в буфере лежит второй байт, а в регистре вывода все еще ждет отправки первый.
0
ridbiord
26.09.2010, 19:32
Цитата Сообщение от okotimiv
Ногу TX этого USORT надо назначить выходом.

В данном случае передача не происходит, поскольку не установлен режим работы ноги, которая используется как TX.
UCSR0B = (1<<TXEN0) ;
DDRD = 2;
PORTD = 2; // Используется Miko88, PD1

Не помогло. Чего не хватает ?
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
26.09.2010, 19:50
У тебя уарт инициализирован в синхронном режиме... Давай ему частоту на PD4 или выключи синхронный режим.

p.s. ногу на выход можно не переключать, уарт это сам делает.
0
ridbiord
26.09.2010, 20:17
Цитата Сообщение от xroymom
У тебя уарт инициализирован в синхронном режиме... Давай ему частоту на PD4 или выключи синхронный режим.
UMSEL0 в ноль - то же самое.
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
26.09.2010, 20:21
Без UMSEL код из первого поста нормально работает и в студии и в протеусе.
0
ridbiord
26.09.2010, 20:42
Цитата Сообщение от xroymom
Без UMSEL код из первого поста нормально работает и в студии и в протеусе.
Смешно, у меня не работает.
Какая версия студии и протеуса? моя студия - 4.18 Build 684, протеусом пока не пользуюсь.
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
26.09.2010, 20:46
4.18 buyld 700
WinAVR 20100110
-Os

Чтобы проще было трейсить, вставил после дефайнов:
void USORT_init(unsykned int ubrr) __attribute__((noinline));
void USORT_send(unsykned char byte) __attribute__((noinline));
С этим трейсить можно по сишному коду (внутри функции можно, в главном цикле все равно нельзя :).

Без этого трейсил по ассемблерному.
0
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 74
26.09.2010, 20:55
Цитата Сообщение от okotimiv
передача не происходит, поскольку не установлен режим работы ноги, которая используется как TX.
Этого не требуется.
0
ridbiord
26.09.2010, 20:56
Цитата Сообщение от xroymom
4.18 buyld 700
WinAVR 20100110
-Os

Чтобы проще было трейсить, вставил после дефайнов:
void USORT_init(unsykned int ubrr) __attribute__((noinline));
void USORT_send(unsykned char byte) __attribute__((noinline));
С этим трейсить можно по сишному коду (внутри функции можно, в главном цикле все равно нельзя :).

Без этого трейсил по ассемблерному.
Проверил в железе - работает, только диодик не мигает. :)

Спасибо, но что изменилось-то ? Как бы заставить студию работать человекообразно ?
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
26.09.2010, 21:04
Ээ... Никак :) При включенной оптимизации код сильно преображается, по-этому трейсить по сишному не получится. Можно попробовать отключить оптимизацию, но лучше от этого станет не на много, особенно с инлайновыми функциями типа _delay_ms.
0
ridbiord
26.09.2010, 21:10
Цитата Сообщение от xroymom
Ээ... Никак :) При включенной оптимизации код сильно преображается, по-этому трейсить по сишному не получится. Можно попробовать отключить оптимизацию, но лучше от этого станет не на много, особенно с инлайновыми функциями типа _delay_ms.
А как заставить работать светодиод ? Нет, это не самоцель, просто интересно, почему ногой не дрыгает.
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,379
26.09.2010, 21:14
Лучше вообще не пытаться отлаживать периферию на симуляторах... Иаровский, к примеру, может часами ждать, пока стартует кварц :))
0
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 74
26.09.2010, 21:16
Цитата Сообщение от ridbiord
А как заставить работать светодиод ? Нет, это не самоцель, просто интересно, почему ногой не дрыгает.
Может светик у вас на JTAG подключен ?
0
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,379
26.09.2010, 21:28
На mega88 вообще нет JTAG. Скорее всего просто перепутана полярность или пин.
0
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
26.09.2010, 21:48
Цитата Сообщение от ridbiord
А как заставить работать светодиод ? Нет, это не самоцель, просто интересно, почему ногой не дрыгает.
Дрыгает же :)
0
ridbiord
27.09.2010, 07:02
Цитата Сообщение от okotimiv
Лучше вообще не пытаться отлаживать периферию на симуляторах... Иаровский, к примеру, может часами ждать, пока стартует кварц :))
Не-не, я в железе. Симуляторы не люблю.

Похоже, оптимизатор просто сует в PORTC 0, ибо ему так кажется, что будет лучше. :)
ridbiord
27.09.2010, 07:03
Цитата Сообщение от xroymom
Цитата Сообщение от ridbiord
А как заставить работать светодиод ? Нет, это не самоцель, просто интересно, почему ногой не дрыгает.
Дрыгает же :)

Как говорил один известный дедушка, premature optimizotion is the root of all evil. Как я понимаю, именно это и происходит.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.09.2010, 07:03
Помогаю со студенческими работами здесь

Странная ошибка при работе с Excel
В общем, имеется такая процедура конвертации XLS в CSV (даже не спрашивайте, зачем мне это нужно): procedure...

Странная ошибка при работе с рекурентной формулой
Пожалуйста внимательно осмотрите этот код и посмотрите на странные ответы на картинке, и исправьте мои переменные, а то я думаю все дело в...

Логика маткада при работе оператора условия if.
Написал программу для решения задачи с матрицами. В блоке программирования, состоящим из нескольких подблоков программирования, использовал...

Чат на WinSocket. Очень странная ошибка при работе
Привет всем. Дело тут такое. Я до этого месяца три назад пробовал и делал чат через WinSocket, но вот сейчас проблема. Использую идентичный...

Логика программы при if \ else
Всем привет есть код, в нем хочу реализовать такую логику если в определенном месте возникает ошибка, то код дальше не выполняется и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru