Перейти к содержанию
    

организовать задержку

Осваиваю avr, atmega162

 

Пытаюсь сделать задержку в 1 сек.

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

 

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

 

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

 

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

 

Спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну в принципе если вы используете прерывание по переполнению или опрашивате флаг переполнения.

ИМХО, лучше использовать блок сравнения, тогда просто надо будет в регистр сравнения = TCNT+INTERVAL(7812). Так можно организовать служюу времени, без сбития счетчика, непосредственной записи в регистр TCNT.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытаюсь сделать задержку в 1 сек.

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

 

Да все правильно - только я бы использовал

CLK/8. Это гораздо удобнее. И организовал

бы какие-нибудь постоянные системные тики.

например, 1 мс. Это как правило, все равно

всегда нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использование регистра сравнения даёт абсолютно точный отсчёт временнЫх интервалов (как сказал lamerok) в отличие от перезаписи регистра счётчика (ошибка на время реакции на прерывание).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытаюсь сделать задержку в 1 сек.

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

 

Да все правильно - только я бы использовал

CLK/8. Это гораздо удобнее. И организовал

бы какие-нибудь постоянные системные тики.

например, 1 мс. Это как правило, все равно

всегда нужно.

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

 

А чем кстати удобнее предделитель меньшего размера?

И второе - с какой целью организовывать свои системные тики, почему недостаточно аппаратного генератора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использование регистра сравнения даёт абсолютно точный отсчёт временнЫх интервалов (как сказал lamerok) в отличие от перезаписи регистра счётчика (ошибка на время реакции на прерывание).

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

 

Если в avr studio такого механизма нет, то кто умеет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытаюсь сделать задержку в 1 сек.

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

 

Да все правильно - только я бы использовал

CLK/8. Это гораздо удобнее. И организовал

бы какие-нибудь постоянные системные тики.

например, 1 мс. Это как правило, все равно

всегда нужно.

Доброе утро.

вообще то если поделить CLK/8 = 8Mhz/8 = 1Mhz, что эквивалентно 1 мкс, а не мс.

А в чем автор абсолютно прав, сначало нужно получть CLK для таймера, которое кратно целому числу требуемого времени.

Поэтому можно попробовать получить остальное деление обычным счетом числа до 1000000.

интревал будет выдержан с достаточной точностью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

никак не найду в студии stop watch, куда правильно смотреть? :-)

у меня avr studio 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

никак не найду в студии stop watch, куда правильно смотреть? :-)

у меня avr studio 4

При открытом проекте и запущенном симуляторе в поле рабочего пространства (Workspace), которое если не видно включить View/Workspace, перейти на вкладку I/O (там их три: Project, I/O, Info), раскрыть группу Processor.

В строке Stop watch, для того, чтобы сбросить value, дважды кликнуть на величине.

Всё.

PS Для того, чтобы поменять частоту МК, выбрать или ввести новое значение в соотв. поле меню Debug/AVR Simulator Options

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

никак не найду При открытом проекте и запущенном симуляторе в поле рабочего пространства (Workspace), которое если не видно включить View/Workspace, перейти на вкладку I/O (там их три: Project, I/O, Info), раскрыть группу Processor.

В строке Stop watch, для того, чтобы сбросить value, дважды кликнуть на величине.

Всё.

PS Для того, чтобы поменять частоту МК, выбрать или ввести новое значение в соотв. поле меню Debug/AVR Simulator Options

огромное спасибо :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использование регистра сравнения даёт абсолютно точный отсчёт временнЫх интервалов (как сказал lamerok) в отличие от перезаписи регистра счётчика (ошибка на время реакции на прерывание).

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

romez

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

romez

 

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

Тогда разбираемся дальше :)

 

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

 

1) В SREG установил флаг глобальных прерываний

2) в TCCR0 поместил коэф. деления

3) TIMSK определил работу по прерыванию (OCIE0)

4) TCNT0 = VAL;

5) OCR0 = VAL+period;

 

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

 

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

 

Где я напортачил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

romez777

В принципе все правильно, за исключением того, что наверное писать в таймер не надо, можно просто прочитать из него и прибавть к этому значению, period.

Насчет авр студио, тут я вам не помошника, так как работаю под ИРОм, возможно авр студио не может в прерывания ходить в симуляторе, но я не знаю. Проверьте еще у вас вообще меняется значение TCNT??? Может оно не менятся. Проверьте тот ли захват вы используете, там их несколько.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...