Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: организовать задержку
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
romez777
Осваиваю avr, atmega162

Пытаюсь сделать задержку в 1 сек.
Использую 16-битный таймер, выставляю prescaler CLK/1024, частота чипа 8МГц, соотв. длительность одного тика должна быть

8Mhz/1024=7812.5hz, то есть 0.000128сек.

соответственно в TCNT пишем значение 65535-7812=57723

Правильно ли я понимаю, или это все не так происходит?

Спасибо за помощь!
lamerok
Ну в принципе если вы используете прерывание по переполнению или опрашивате флаг переполнения.
ИМХО, лучше использовать блок сравнения, тогда просто надо будет в регистр сравнения = TCNT+INTERVAL(7812). Так можно организовать служюу времени, без сбития счетчика, непосредственной записи в регистр TCNT.
-Tумблер-
Цитата(romez777 @ Nov 12 2004, 11:04 AM)
Пытаюсь сделать задержку в 1 сек.
Использую 16-битный таймер, выставляю prescaler CLK/1024,


Да все правильно - только я бы использовал
CLK/8. Это гораздо удобнее. И организовал
бы какие-нибудь постоянные системные тики.
например, 1 мс. Это как правило, все равно
всегда нужно.
IgorKossak
Использование регистра сравнения даёт абсолютно точный отсчёт временнЫх интервалов (как сказал lamerok) в отличие от перезаписи регистра счётчика (ошибка на время реакции на прерывание).
romez777
Цитата(-Tумблер- @ Nov 12 2004, 06:35 PM)
Цитата(romez777 @ Nov 12 2004, 11:04 AM)

Пытаюсь сделать задержку в 1 сек.
Использую 16-битный таймер, выставляю prescaler CLK/1024,


Да все правильно - только я бы использовал
CLK/8. Это гораздо удобнее. И организовал
бы какие-нибудь постоянные системные тики.
например, 1 мс. Это как правило, все равно
всегда нужно.

Приветствую.

А чем кстати удобнее предделитель меньшего размера?
И второе - с какой целью организовывать свои системные тики, почему недостаточно аппаратного генератора?
romez777
Цитата(IgorKossak @ Nov 12 2004, 08:25 PM)
Использование регистра сравнения даёт абсолютно точный отсчёт временнЫх интервалов (как сказал lamerok) в отличие от перезаписи регистра счётчика (ошибка на время реакции на прерывание).

А можно ли как-то средствами avr studio наблюдать длительность выполнения функций, т.е. как мне проверить что задержка действительно 1 сек?

Если в avr studio такого механизма нет, то кто умеет?
Monstrer
Цитата(-Tумблер- @ Nov 12 2004, 06:35 PM)
Цитата(romez777 @ Nov 12 2004, 11:04 AM)

Пытаюсь сделать задержку в 1 сек.
Использую 16-битный таймер, выставляю prescaler CLK/1024,


Да все правильно - только я бы использовал
CLK/8. Это гораздо удобнее. И организовал
бы какие-нибудь постоянные системные тики.
например, 1 мс. Это как правило, все равно
всегда нужно.

Доброе утро.
вообще то если поделить CLK/8 = 8Mhz/8 = 1Mhz, что эквивалентно 1 мкс, а не мс.
А в чем автор абсолютно прав, сначало нужно получть CLK для таймера, которое кратно целому числу требуемого времени.
Поэтому можно попробовать получить остальное деление обычным счетом числа до 1000000.
интревал будет выдержан с достаточной точностью.
IgorKossak
Цитата(romez777 @ Nov 13 2004, 02:52 PM)
А можно ли как-то средствами avr studio наблюдать длительность выполнения функций, т.е. как мне проверить что задержка действительно 1 сек?

Проще простого, (но только в симуляторе smile.gif )!

Устанавливаете нужную частоту генератора, точку останова в обработчике прерывания по таймеру, запускаете программу, по достижении точки останова обнуляете Stop Watch и запускаете снова. В Stop Watch как раз и будет искомый интервал.
romez777
Цитата(IgorKossak @ Nov 15 2004, 01:12 PM)
Цитата(romez777 @ Nov 13 2004, 02:52 PM)
А можно ли как-то средствами avr studio  наблюдать длительность выполнения функций, т.е. как мне проверить что задержка действительно 1 сек?

Проще простого, (но только в симуляторе smile.gif )!

Устанавливаете нужную частоту генератора, точку останова в обработчике прерывания по таймеру, запускаете программу, по достижении точки останова обнуляете Stop Watch и запускаете снова. В Stop Watch как раз и будет искомый интервал.

приветствую.

никак не найду в студии stop watch, куда правильно смотреть? :-)
у меня avr studio 4
IgorKossak
Цитата(romez777 @ Nov 17 2004, 06:35 AM)
никак не найду в студии stop watch, куда правильно смотреть? :-)
у меня avr studio 4

При открытом проекте и запущенном симуляторе в поле рабочего пространства (Workspace), которое если не видно включить View/Workspace, перейти на вкладку I/O (там их три: Project, I/O, Info), раскрыть группу Processor.
В строке Stop watch, для того, чтобы сбросить value, дважды кликнуть на величине.
Всё.
PS Для того, чтобы поменять частоту МК, выбрать или ввести новое значение в соотв. поле меню Debug/AVR Simulator Options
romez777
[quote=IgorKossak,Nov 17 2004, 10:18 AM] [QUOTE=romez777,Nov 17 2004, 06:35 AM] никак не найду При открытом проекте и запущенном симуляторе в поле рабочего пространства (Workspace), которое если не видно включить View/Workspace, перейти на вкладку I/O (там их три: Project, I/O, Info), раскрыть группу Processor.
В строке Stop watch, для того, чтобы сбросить value, дважды кликнуть на величине.
Всё.
PS Для того, чтобы поменять частоту МК, выбрать или ввести новое значение в соотв. поле меню Debug/AVR Simulator Options [/quote]
огромное спасибо smile.gif
romez777
Цитата(IgorKossak @ Nov 12 2004, 07:25 PM)
Использование регистра сравнения даёт абсолютно точный отсчёт временнЫх интервалов (как сказал lamerok) в отличие от перезаписи регистра счётчика (ошибка на время реакции на прерывание).

Приветствую.

То есть правильно ли я понял, что основное отличие compare режима от счетчика в высокой точности?
lamerok
romez

Я думаю, что не правильно wink.gif Основное отличие - это что, что блок compare он для того и нужен, чтобы задавать нужные интервалы, формировать задержки и т.д. А счетчик он просто считает себе и считает, и трогать его не рекомендуется.
romez777
Цитата(lamerok @ Nov 18 2004, 12:39 PM)
romez

Я думаю, что не правильно wink.gif Основное отличие - это что, что блок compare он для того и нужен, чтобы задавать нужные интервалы, формировать задержки и т.д. А счетчик он просто считает себе и считает, и трогать его не рекомендуется.

Тогда разбираемся дальше smile.gif

По вашему совету немного переделал функцию задержки, дабы она работала через compare регистр. Что имеем:

1) В SREG установил флаг глобальных прерываний
2) в TCCR0 поместил коэф. деления
3) TIMSK определил работу по прерыванию (OCIE0)
4) TCNT0 = VAL;
5) OCR0 = VAL+period;

Если я правильно понял даташит, то как только операция сравнения TCNT0 c OCR0 завершится удачно (т.е. TCNT0=OCR0), то сгенерируется прерывание.

Отлаживаю в avr studio и никакого перехода на свою функцию обработки этого прерывания не происходит, и даже не выставляется бит OCF0.

Где я напортачил?
lamerok
romez777
В принципе все правильно, за исключением того, что наверное писать в таймер не надо, можно просто прочитать из него и прибавть к этому значению, period.
Насчет авр студио, тут я вам не помошника, так как работаю под ИРОм, возможно авр студио не может в прерывания ходить в симуляторе, но я не знаю. Проверьте еще у вас вообще меняется значение TCNT??? Может оно не менятся. Проверьте тот ли захват вы используете, там их несколько.
romez777
Цитата(lamerok @ Nov 18 2004, 03:19 PM)
romez777
В принципе все правильно, за исключением того, что наверное писать в таймер не надо, можно просто прочитать из него и прибавть к этому значению, period.
Насчет авр студио, тут я вам не помошника, так как работаю под ИРОм, возможно авр студио не может в прерывания ходить в симуляторе, но я не знаю. Проверьте еще у вас вообще меняется значение TCNT??? Может оно не менятся. Проверьте тот ли захват вы используете, там их несколько.

Но начальное значение в таймер поместить надо?
ПРи отладке TCNT0 увеличивается, тут все в порядке smile.gif Я использую WinAVR, там сигнал прерывания по сравнению определен как SIG_OUTPUT_COMPARE0.
romez777
Цитата(IgorKossak @ Nov 15 2004, 01:12 PM)
Проще простого, (но только в симуляторе smile.gif )!

Устанавливаете нужную частоту генератора, точку останова в обработчике прерывания по таймеру, запускаете программу, по достижении точки останова обнуляете Stop Watch и запускаете снова. В Stop Watch как раз и будет искомый интервал.

Приветствую.

Попробовал это проделать в режиме пошаговой отладки - могу менять значение stop watch. Если же запустить (f5), то симулятор не позволяет этого:
IO-view cannot set values while target is running

Опять тапки? wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.