Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Задержка 8-разрядного контроллера  (Прочитано 36263 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 19-04-2010 06:10 » 

Контроллер AT90S2313. Мне нужно сделать задержку в 1 мс. Нашел такой пример кода (задержка на 0,5 мс):
Код:
ldi    YH,low(497)
ldi    YH,high(497)
d05_1: sbiw    YL,1
            brne    d05_1
Все понятно, кроме: почему именно 497? Как именно просчитать это магическое число? Например, для 1 мс...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 19-04-2010 06:15 » 

поставь лучше 666 , прикольнее будет Улыбаюсь Имхо - от балды число
Записан

Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 19-04-2010 06:22 » 

На 666 времени нету. Улыбаюсь
Но формула-то должна бить Меня одолевают смутные сомнения . У меня программа-таймер, мне от балды число нельзя  Не-а...
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 19-04-2010 06:26 » 

считаешь число машинных циклов и умножаешь на время выполнения машинного цикла, которое зависит от частоты котнроллера.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 19-04-2010 06:30 » 

Тоесть, считаем нужное количество тактов, исходя из частоты контроллера (тоесть, знаем, сколько контроллер тратит на 1 такт)? Или я не так понял?

З.Ы. Временно оффлайн.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 19-04-2010 06:37 » 

а, сорри, команду неправильно понял. Наверное, всё же не просто так число подобрано
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 19-04-2010 06:45 » 

Считаем сколько машинных циклов занимает каждая команда в цикле  (я не знаю о каком контроллере идет речь, и не столь это важно)
Умножаем на количество машинных тактов для выполнения одной команды.
Делим на частоту - получаем нужное время.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 19-04-2010 07:16 » 

Немного понятнее (IMHO): считаем число таков, необходимых для выполнения всех команд в цикле и делим на полученное значение тактовую частоту чипа. Когда нужна повышенная точность, в формулу надо вводить смещение, вызванное исполнением команд инициализации, обслуживающих цикл (загрузка счетчика, возврат из подпрограммы и т.п.).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #8 : 19-04-2010 08:34 » 

а, сорри, команду неправильно понял. Наверное, всё же не просто так число подобрано
Жжешь
Немного понятнее (IMHO): считаем число таков, необходимых для выполнения всех команд в цикле и делим на полученное значение тактовую частоту чипа. Когда нужна повышенная точность, в формулу надо вводить смещение, вызванное исполнением команд инициализации, обслуживающих цикл (загрузка счетчика, возврат из подпрограммы и т.п.).
Это, примерно, я и хотел сказать  Улыбаюсь

Всем огромное спасибо! Понял и сделал.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 19-04-2010 10:01 » 

А таймера нет на этом контроллере ?  Жаль
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 19-04-2010 10:09 » 

resource, а не всегда таймер нужен,
время на инициализацию таймера,
потом в любом случае в таймер счетчик прописывать.
Преимущество таймера - это "многозадачность" (он считает, а ты что делаешь
А если у тебя линейный алгоритм?
Ждать когда таймер выдаст готовность? На малых промежутках проще все же циклом.

Но есть такая штука как прерывания. Если время критично, то на время цикла запрещаются прерывания,
но, не все прерывания нужно отключать - критические нужно оставлять.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 19-04-2010 10:12 » 

resource, таймеры слишком грубы и нуждаются в обработчике прерываний. Когда требуется малая, а тем более - точная задержка, цикл просто необходим. При длительных точных задержках можно комбинировать таймер и цикл.
Кстати, такой подход свойственен не только МК, но и большим ОС.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 19-04-2010 10:18 » 

Ну насчет многозадачности и того, что таймер нужен для длительных интервалов, согласен. Остальное всё весьма спорно.
Что тут грубого? И что с того, что надо обработать прерывание? Там одной командой флаг поставил, а второй вышел из обработчика.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 19-04-2010 10:28 » 

Не точность таймера:
1. Грубые кванты. Обычно дерется частота машинных циклов и еще дополнительно делится.
2. Обработка других прерываний может помешать своевременной обработке прерывания таймера.
3. Команда из нескольких машинных циклов не может быть прервана до завершения.
4. Обработчик прерывания таймера требует много больше ресурсов времени и памяти, чем простая загрузка счетчика. Это может быть критично.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 19-04-2010 10:30 » 

Обычно, таймер имеет самый высокий уровень прерывания (если по уму)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 19-04-2010 10:59 » 

resource, "высший приоритет"
Не всегда, если по уму.
Все зависит от задач.
Если нужно выдержать точную задержку - то да, а если это просто счетчик, +- лапоть и не критичный, то пусть работает как есть.
Критичные прерывания  - это аварийные сигналы.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 19-04-2010 11:06 » 

Слав, ну это должна быть реально серьезная "авария". Но с AT90S2313 что-то серьезное вообще не вяжется. А если говорить, о промышленных контроллерах (типа сименс), то всё что мы тут понаписали вообще неактуально становится.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 19-04-2010 11:13 » 

Слав, ну это должна быть реально серьезная "авария". Но с AT90S2313 что-то серьезное вообще не вяжется. А если говорить, о промышленных контроллерах (типа сименс), то всё что мы тут понаписали вообще неактуально становится.
А что там с Сименсами такое, что программные таймеры не актуальны для него?
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 19-04-2010 11:14 » 

Прерывания не актуальны (если о таймерах говорить). Всмысле вручную они там не обрабатываются.
И задержки там делаются исключительно таймерами. Делать на сименсе задержку, забирая драгоценные такты, это вообще немыслимо. Ну и ПО, залитое в контроллер, крутится совсем по другому.
« Последнее редактирование: 19-04-2010 11:20 от resource » Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 19-04-2010 11:17 » 

resource, а как прерывания обрабатываются если не вручную?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 19-04-2010 11:20 » 

resource, подход к программированию контроллеров должен быть одинаков.
И на простом, недорогом контроллере можно замутить систему предупреждения.

А что Сименс? Чи не пример, знали видели.
Огромный ящик, с огромным, нафик никому не нужным функционалом. Улыбаюсь

Мне тут недавно показали систему управления тепловозом от Сименса. Несколько больших черных ящиков.

И показали свою разработку.
компактность, энергопотребление.
Из недостатков - достаточно сложная настройка. Нужны средства для разработки системы мониторинга.
А в остальном, прекрасная маркиза...

Но это уже офтоп.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 19-04-2010 11:28 » 

Serg79,  а никак. Фактически в сам момент прерывания ты управления не получишь. Там организовано всё по другому. Софт изначально автоматом крутится в цикле. Проверяешь нужные флаги и всё. Там скорости хватает.

Sla, сименс - это промышленные контроллеры, и пользуют их там, где "карлики" не подойдут. Для них много какого оборудования родного имеется. Ну собственно они и с неродным могут работать, если оно по стандарту сделано. Мы например ставили на них частотники Danfoss. Сименсы очень удобно вяжутся в сети, с нормальными интерфейсами.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 19-04-2010 11:34 » 

Serg79,  а никак. Фактически в сам момент прерывания ты управления не получишь. Там организовано всё по другому. Софт изначально автоматом крутится в цикле. Проверяешь нужные флаги и всё. Там скорости хватает.
Ну ты даешь, ты путаешь программную реализацию с аппаратной. Кто тебе мешает на AVR-ах не обработчик прерывания устанавливать а в цикле проверять флаг срабатывания прерывания. Так же не кто не запрещает в Сименсах устанавливать обработчик прерывания вместо программного опроса флага прерывания.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 19-04-2010 11:42 » 

Цитата: Serg79
Кто тебе мешает на AVR-ах не обработчик прерывания устанавливать а в цикле проверять флаг срабатывания прерывания.
Согласен. Я ж практически о том и пытался сказать в посте №12 (мысль чутка в сторону ушла  Улыбаюсь )

Цитата: Serg79
не кто не запрещает в Сименсах устанавливать обработчик прерывания вместо программного опроса флага прерывания.
Та я и не спорю. Но зачем? Кто в трезвом виде будет такое делать?
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 19-04-2010 11:58 » 

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

И валить все под одну гребенку нельзя.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 19-04-2010 12:08 » 

Ну я так и сказал еще в посте №16
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #26 : 20-04-2010 06:39 » 

Быть такого не может Меня что-то число пугает: если частота микроконтроллера 4 МГц, то 1 мс - это 40000 тактов; так как у меня 1 цикл занимает 2,5 такта, то это 16000 циклов. Или я что-то не так подсчитал?

Кстати, в документации сказано, что на выполнение команды BRNE нужно 0,5 такта, поэтому, я получил 2,5 такта на цикл. Это правильно? Или нужно брать 3 такта?
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 20-04-2010 06:53 » 

YevhenUA, если у тебя частота тактирования 4 МГц тогда действительно имеет смысл использовать таймер как советовал resource. В этом случае погрешность должна быть маленькой и составлять порядка 4 - 6 тактов.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #28 : 20-04-2010 06:55 » 

YevhenUA, частота процессора и такты - срочно читать документацию.
Может там так и есть
0.5 такта?  хм...

Покажи эту часть документации, рыться в инете не хочу.
 
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #29 : 20-04-2010 07:00 » 

Вложил. Как одновременно отобразить его в посте - не знаю.

* 05cykla.bmp (86.8 Кб - загружено 1049 раз.)
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines