Технический форум по робототехнике.
realsystem » 17 фев 2009, 22:56
Всё, разобрался, в коде проблемка была. Теперь все прекрасно разгоняется и тормозится
W0LFX » 19 фев 2009, 08:15
Название Часики реального времени
Язык Си
Компилятор CVAVR
CPU ATmega16
Хочу сделать часы реального времени по примерам из cvavr (апноут123). Чтобы на терминал в proteus выводились. И чет не получается! Посмотрите исходник, мужики, кто знает подскажите, как правильно.
- Вложения
-
- test.rar
- (2.35 КиБ) Скачиваний: 17
realsystem » 19 фев 2009, 15:07
Выкладывать надо весь проект для компилятора и весь проект для протеуса.
realsystem » 20 фев 2009, 17:38
Концептуальный вопрос: где лучше всего обрабатывать прием команд из USART'а? Я делаю пока в основном бесконечном цикле(в main'е), как правильно?
blindman » 20 фев 2009, 17:49
Лучше для кого? Или для чего?
Я делаю по прерываниям, с буферизацией. И 2 функции - uart_available() и uart_receive(). Первая возвращает количество байт в буфере приемника, вторая - очередной байт из буфера. В принципе и разбор команд можно делать в прерывании (только не все сразу, а после получения каждого байта, например конечным автоматом), а основная программа будет получать уже разобранную команду.
realsystem » 20 фев 2009, 18:09
blindman писал(а):Лучше для кого? Или для чего?
Лучше "вообще"
blindman писал(а):Я делаю по прерываниям, с буферизацией.
У меня обработка опросом:
//usart polling, get command and analyse
int usart_polling(void)
{
if (getchar()== COMMAND)
{
....
Эта функция вытаскивает по символу и обрабатывает. Сама она вызывается в main'е в бесконечном цикле. Вот хочу знать насколько это критично. Можно ли так оставить?
А вы говорите в прерывании, а в каком? По концу приема которое?
blindman » 20 фев 2009, 18:18
Да, по концу приема. Лучше "вообще" - именно по прерываниям. Лучше в твоем случае - не скажу, зависит от задачи, от того чем занят процессор и т.п. Вполне возможно, что для тебя будет лучше то, что проще реализовать.
realsystem » 20 фев 2009, 18:33
Ну пока проц занят только приемом команд от компа и в зависимости от команды - меняет ШИМ на моторе и направление вращения. Будет занят стандартными вещами: ШИМ на мотор, управление сервой и анализ ИК датчиков.
Последний раз редактировалось
realsystem 20 фев 2009, 18:35, всего редактировалось 1 раз.
RoboTok » 20 фев 2009, 18:34
А у меня стоит RTOS и одна из задач ожидает прихода символа по UART.
И когда символ приходит вызывает прерывание, а уже в прерывании символ записывается в буфер и посылается событие задачи.
Задача выходит из ожидания и собирает символы в команду.
При такой работе обработчика команд не возникает пауз во время приёма или передачи и остальные задачи работают без рывков...
Самый яркий пример эффективности такого способа - это вывод списка команд на экран размеров в 2кБ.
Раньше весь МК занимался передачей. Если буферизировать вывод, то всё равно не будеш же делать буфер в 2кБ.
А с RTOS список выводится в фоне работы других задач и МК 90% свободен
realsystem » 20 фев 2009, 18:37
А какая РТОС? На каком проце?
RoboTok » 20 фев 2009, 18:38
RTOS от Keil-а.
А процессор LPC2131.
Но у АВР-ок тоже есть ОС-ки свои...
realsystem » 20 фев 2009, 18:46
Понятно, я кстати загнался по поводу того что сказал выше. Прием с компа я делаю в буферы по прерыванию (из курса взял), а вот опросом (функцией выше которая) вытаскиваю команды из буфера.
blindman » 20 фев 2009, 21:42
RoboTok писал(а):А с RTOS список выводится в фоне работы других задач и МК 90% свободен
RTOS для этого не нужна.
realsystem » 20 фев 2009, 22:49
Ну да, в принципе просто ОС нужна мультизадачная
RoboTok » 20 фев 2009, 22:59
blindman
И как можно вывести в UART строку текста длинной больше буфера отправки символов в UART без задержки других задач ?