Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таймеры
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
SergeyM
Помогите люди добрые.
Существует наверное какая нибудь формула для расчета прерываний от таймера. Ну чтобы расчитать время через которое будет происходить срабатывание таймера.
rezident
Цитата(SergeyM @ Jun 13 2005, 18:40)
Помогите люди добрые.
Существует наверное какая нибудь формула для расчета прерываний от таймера. Ну чтобы расчитать время через которое будет происходить срабатывание таймера.
*

Гм. Странный вопрос. Длительность и время имеют одну размерность, а частота это обратно-пропорциональная времени величина. T=1/F.
так что формула рассчета будет примерно такова t=CCRx/F. Где t - это временной интервал между прерываниями (в секундах), CCRx - это код записанный в регистр сравнения плюс единица (для учета состояния таймера 0x0000), F - это частота тактирования таймера (уже после всех встроенных делителей), в Герцах. Естественно должны быть разрешены прерывания, возникающие при совпадении регистра сравнения CCRx и счетчика таймера. Если используете прерывания от переполнения, то вместо CCRx подставьте код максимальной разрядности таймера. Для 8-ми разрядного таймера - 256, для 16-ти разрядного - 65536
P.S. Сорри, CCRx это у MSP430. У AVR эти регистры OCRn называются.
Beavius
>>> t=CCRx/F. Где t - это временной интервал между прерываниями (в секундах), CCRx - это код записанный в регистр сравнения плюс единица (для учета состояния таймера 0x0000), F - это частота тактирования таймера (уже после всех встроенных делителей), в Герцах.

IMHO неправильно...
формула должна быть такая t=(255-CCRx)/F
CCRx (в tiny это TCNT0)

если я неправ поправьте...
vvs157
Цитата(SergeyM @ Jun 13 2005, 15:40)
Помогите люди добрые.
Существует наверное какая нибудь формула для расчета прерываний от таймера. Ну чтобы расчитать время через которое будет происходить срабатывание таймера.
*


Во-первых не ясно, а что на входе формулы? Частота кварца, тактовая частота МК или ище чего? А во-вторых это зависит от типа МК.
rezident
Цитата(Beavius @ Jun 13 2005, 22:07)
IMHO неправильно...
формула должна быть такая t=(255-CCRx)/F
CCRx (в tiny это TCNT0)
*

Я не работал с AVR, поэтому могу ошибаться с названиями регистров. Но ваша формула будет верна только для 8-ми битного таймера, и только для режима (если он такой есть?) обратного отсчета, когда таймер считает от максимального значения к нулю. К тому же вы видимо невнимательно читали мое сообщение.
Цитата(rezident)
код записанный в регистр сравнения плюс единица (для учета состояния таймера 0x0000),

Если уж так хотите точности, то уточню так: t=(CCRx+1)/F, где CCRx код записанный в регистр сравнения, а режим таймера - счет вверх от 0x000 до CCR0 или до переполнения. AVR не знаю, а MSP430 оба таких режима поддерживает. У MSP430 есть еще режим UP/DOWN в этом случае могут быть сгенерированы даже три прерывания: от CCR0, от CCRx и при переходе в состояние 0x0000. Так что в этом случае нужно бы еще уточнить, интервал какого именно прерывания интересует? Интервал от CCRx может отличаться, от интервала прерываний по CCR0 и переполнения (обнуления).
Извиняюсь, что возможно зря влез в тему, не зная AVR, но в заголовке не был указан МК про таймер которого спрашивали. Я подумал, что вопрос больше теоретический smile.gif
LeoLabs
Цитата(SergeyM @ Jun 13 2005, 19:40)
Помогите люди добрые.
Существует наверное какая нибудь формула для расчета прерываний от таймера. Ну чтобы расчитать время через которое будет происходить срабатывание таймера.
*

И еще в довесок всем предыдущим формулам ошибка, которая может быть вызвана другими прерываниями, когда флаг переполнения счетчика таймера устанавливается во время работы другого прерывания. поэтому результирующая формула:
t = (OCRx * K)/F + delta
, где OCRx - код в регистре сравнения, К - коэффициент деления (тактирования таймера), F - частота в герцах, delta - время погрешности от 0 до максимальной продолжительности какого-либо прерывания.
rmo
Очень удобно AVRCalc.
Можно задавать в ms,гц как угодно
yung
Прикольно, я сейчас как рекламный агент от ImageCraft, уже во второй теме подряд их компилятор советую. В ApplicationBuilder там все легко настраивается, получаешь готовый код - кстати, очень похоже на AVRCalc , но намного удобнее. Я смотрю, в основном все пользуются иаром, неужели в нем нет настроек для UART, таймеров, портов и т.п.?
LeoLabs
Цитата(yung @ Jun 14 2005, 11:46)
Прикольно, я сейчас как рекламный агент от ImageCraft, уже во второй теме подряд их компилятор советую. В ApplicationBuilder там все легко настраивается, получаешь готовый код - кстати, очень похоже на AVRCalc , но намного удобнее. Я смотрю, в основном все пользуются иаром, неужели в нем нет настроек для UART, таймеров, портов и т.п.?
*

есть, но отдельной прогой - это пожалуй недостаток, один из немногих.
А по поводу что лучше ICC или IAR - этому можно посвятить отдельную тему.
а про точность ApplicationBuilder - моя реплика несколько раньше есть. не стоит полностью на софт полагаться.
ksinet
[quote=LeoLabs,Jun 14 2005, 09:22]
[/quote]
есть, но отдельной прогой - это пожалуй недостаток, один из немногих.
*

[/quote]

Кстати, ИАР начал бесплатно раздавть MakeApp для Атмел АВР. Скоре всего даже буржуи не захотели покупать его за 200 баксов. А вообще хорошая программка, только она не поддреживает оччень много новых чипов. Забросили они это дело.
SergeyM
Вопрос возник из за того что в книгах пишут:
"при коэффициенте деления (х) и началных значениях таймера (у) прерывания будут выполняться каждые (z) секунд", но ниразу не написали как выбрать коэффициент деления и задать начальные значения таймера. Поэтому я и решил задать вопрос в форум
boban
Цитата(rezident @ Jun 13 2005, 22:13)
Если уж так хотите точности, то уточню так: t=(CCRx+1)/F, где CCRx код записанный в регистр сравнения, а режим таймера - счет вверх от 0x000 до CCR0 или до переполнения.


Сейчас я натолкнулся на эти грабельки blink.gif
Первый раз работаю с AVR, до этого было только семейство МК51.

У меня АTMega48 (88/128)... и вроде все делаю правильно и логично:

// инициализация т/с0
TCCR0A = 2; // WGM01..WGM00=10
// Mode2: CTC (Clear Timer on Compare Match)

TCCR0B = 5; // WGM02=0 (для CTC) и таймер запущен
// CS02..CS00=101 CLK/1024 (From prescaler)

OCR0A = 108; // значение в регистр совпадения, соотв. 10мс
// 11,0592МГц/1024=10800 отсчетов в секунду

TIMSK0 = 2; // устан. прерывания по совпадению A

И пусть даже я не учёл эту "+1" (было бы число 107 в OCR0A), но прерывания генерятся не через 10мс как мне нуна, а через 115мс Не могу пока врубиться, в чём здесь лыжи... cranky.gif
vet
Цитата(boban @ Jun 16 2005, 12:59)
И пусть даже я не учёл эту "+1" (было бы число 107 в OCR0A), но прерывания генерятся не через 10мс как мне нуна, а через 115мс  Не могу пока врубиться, в чём здесь лыжи... cranky.gif
*

fuse-биты прошиты на работу от кварца? CKDIV прошит единичкой?
boban
vet, в первый раз я пишу для АТМеги. Не изменял я вроде fuse-биты и CKDIV... т.к. не знаю, что это sad.gif Там видимо то значение, которое записывается по умолчанию.

А что, не от моего внешнего кварца 11,0592МГц всё это дело тактируется сейчас?
vet
Цитата(boban @ Jun 16 2005, 13:23)
vet, в первый раз я пишу для АТМеги. Не изменял я вроде fuse-биты и CKDIV... т.к. не знаю, что это sad.gif Там видимо то значение, которое записывается по умолчанию.

А что, не от моего внешнего кварца 11,0592МГц всё это дело тактируется сейчас?
*


По умолчанию - от внутренней RC-цепочки ~8МГц (CKSEL=0010), и включен делитель на 8 (CKDIV=0), в итоге около 1 МГц.
yung
Очень похоже на фьюзы. Во-первых, 11Мгц/1МГц=11 и твои интервалы тоже грубо в 11 раз отличаются (1 МГц - частота внутреннего RC-генератора, новый кристалл от него тактируется). Настраиваются эти биты не в программе, а в программаторе - поищи, я не знаю, чем пользуешься. И поответственней с ними, внимательно прочти datasheet.
boban
Цитата(vet @ Jun 16 2005, 12:33)
По умолчанию - от внутренней RC-цепочки ~8МГц (CKSEL=0010), и включен делитель на 8 (CKDIV=0), в итоге около 1 МГц.

Цитата(yung @ Jun 16 2005, 12:37)
Настраиваются эти биты не в программе, а в программаторе - поищи, я не знаю, чем пользуешься. И поответственней с ними, внимательно прочти datasheet.


Похоже... только жаль, что поздно до меня (нас) дошли енти особенности... sad.gif Чегой-то мы уже напортачили... sad.gif

Во-первых, программатора АТМеги48 у нас нет, программируем какой-то хренькой для программирования АТМеги8 через LPT-порт компьютера.
Во-вторых, вроде сначала программировалось, только с таймером были баги... а потом нашли злоклятую кнопочку "Advanced", где и выбирается всякая хрень. И покляцали не разобравшись... и Ext Clock и др... Сейчас вообще АТМега перестала реагировать sad.gif sad.gif sad.gif Пишет ошибки всякие при попытке запрограммировать. Уже и лечить пробовали подачей внешнего меандра от генератора (из-за того, что выбирали Ext Clock)... чего-то не получается

Могли ли мы бесповоротно испортить всё?
vet
Вы, видимо, запрограммировали кристалл на тактирование от внешнего генератора, распространённая ошибка. Перепрограммировать можно AVReal-ом, как - описано в документации к нему.
yung
Совсем недавно тема была, глубоко "утонуть" не должна. Там про эту проблему написано. И о своем. Знаю я про эти биты, но умудрился на 32 меге разрешить jtag (а эмулятора у меня нет), а потом три ночи искал, почему LCD не могу запустить - использовал для связи тот самый порт С, на котором jtag сидит.
ReAl
Цитата(boban @ Jun 16 2005, 15:38)
Во-первых, программатора АТМеги48 у нас нет, программируем какой-то хренькой для программирования АТМеги8 через LPT-порт компьютера.
Во-вторых, вроде сначала программировалось, только с таймером были баги... а потом нашли злоклятую кнопочку "Advanced", где и выбирается всякая хрень. И покляцали не разобравшись... и Ext Clock и др... Сейчас вообще АТМега перестала реагировать  sad.gif  sad.gif  sad.gif  Пишет ошибки всякие при попытке запрограммировать. Уже и лечить пробовали подачей внешнего меандра от генератора (из-за того, что выбирали Ext Clock)... чего-то не получается

Могли ли мы бесповоротно испортить всё?
*

Вообще говоря, это (клацать по фьюзам не того кристалла) категорически не рекомендуется. На одном и том же месте у разных кристаллов могут оказаться совсем разные по "небезопасности" фьюзы.
Но в данном случае (мега8 - мега48) единственная доступная по SPI опасная вещь - это RSTDISBL, но она у этих кристаллов на одном месте, так что отбить reset 48-ой, трогая другие фьюзв меги8-ой невозможно. Если это не трогали, то тогда шансы поднять кристалл велики.
У 48-ой, правда, есть некая reserved позиция в CKSEL... Кто такая и с чем едят - не знаю. А так - самое противное, что могло быть - это External clock либо внутренний 128-килогерцовій RC вкупе с активным CKDIV - больно сильно надо опускать тактировку программатора (-o16 для avreal, см. описание AVReAl )
Balaganov
Народ, че вы паритесь с этими фузами? Уже говорил и еще раз скажу параллельный программатор есть спасение от 99% неправильного обращения с этими фузами. Прошил чегото не того, завалил проц, а у нас "реаниматор" в виде ПП.
По стоимости менее $5, по времени максимум 2 вечера. Короче рекомендую очень полезная вещь в хозяйстве.
boban
Спасибо всем отозвавшимся! cheers.gif

А на данный момент решение такое: выпаять нах эту 48-ю АТмегу и поставить классическую АТмега8... все равно код занимает более 4к.

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