![]() |
Модераторы: PILOT, ManiaK, Mazzi |
![]() ![]() ![]() |
|
max_k |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 14.11.2006 Репутация: нет Всего: нет |
Приветствую Уважаемые,
есть такая задачка: Atmega8535 управляет шаговыми моторами всего их 6 штук. Данные о том куда и каким мотором крутить передаются от компа на Atmega через UART Ввиду того что обмен занимает некоторое время, то если моторы встают на время приема новой порции команд, я решил разбить буфер обмена пополам и пока проц обрабатывает первую половину команд, принимать в это время вторую половину, но не тут то было ![]() вот кусок кода (для примера я его сократил до основного минимуиа)
Так вот пока мы читаем первые 125 байт все ок, далее когда Atmega начинает обрабатывать эти байта а управляющая программа начинает слать вторую половину, то у Atmegи возникает ошибка UART: Overrun. Data register (UDR) must be read before this point Ошибка возникает естественно на задержке, но если задержку убрать, то и в любом другом месте. Пробывал делать задержку использую таймер0, результат тот-же. Как быть? В чем ошибка? ![]() |
|||
|
||||
Mazzi |
|
|||
![]() Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Простое решение 1:
1) сделай буфер кольцевым 2) после приёма последнего байта посылки выставляй флажёк 3) в основном цикле при получении флажка извлекай из буфера данные и обрабатывай Простое решение 2: 1) сделай буфер кольцевым 2) после приёма очередного байта выставляй флажёк 3) в основном цикле при получении флажка извлекай из буфера этот байт и обрабатывай Удачи Добавлено через 24 секунды Задержки выкинь вообще -------------------- Мне нужны помощники. |
|||
|
||||
max_k |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 14.11.2006 Репутация: нет Всего: нет |
Большое спасибо!
Действительно проблема в том что, вызывается прерывание по приему байта, и я именно из него вызывал процедуру обработки буфера и тем самым прерывание не заканчивалось пока вся строка не обработается и тут приходил очередной байт и вызывал прерывание повторно, вот и возникала ошибка. А задержки выкинуть нельзя т.к. программа управляет шаговыми моторами, а они не могут крутиться с такими скоростями. Еще раз спасибо. Проблема решена. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |