Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таймеры.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ps1x
Как расчитать значения таймеров? Есть программка, но она не подходит для Tiny26 ибо нету у него 16 битного таймера. Не могли бы вы написать пример для расчета частоты 1 Гц?
CSB
Если Вы имели ввиду период срабатываний таймеров, то поступаем следующим образом:

Код
#define F_XTAL 7372800L
// Расчет инициализации таймера. Порядок следования имеет значение, для того чтобы препроцессор производил округление (компилятор CV AVR 1.24.4 Standart)
// 0x100 - предельное значение счетчика
// 600L / 1000000L - период срабатываний в секундах
// 64L - коэффициент деления тактового сигнала
#define INIT_TIMER0 TCNT0 = 0x100 - 600L * F_XTAL / 64L / 1000000L

......
......
......

void main()
{
................
    // Период работы 600 мкс
    // Fclk = 7.3728 MHz    
    TCCR0 = 0x03;    // Fclk/64 - задаем делитель
    INIT_TIMER0;      // инициализируем счетный регистр

    TIMSK = 0x01;
    #asm("sei");
...................


В обработчике прерывания при переполнении таймера следует выполнить INIT_TIMER0; для новой инициализации счетного регистра.

Цитата
Не могли бы вы написать пример для расчета частоты 1 Гц

Нужна тактовая частота МК. Пример с 7.3728 МГц показан выше. Просто в формулу подтавляете частоту, коэффициент деления и собственно период срабатывания в секундах.
CSB
Забыл добавить как получить делитель:
берем требуемое время срабатывания(600 мкс), умножаем на входную частоту(7.3728 МГц) и делим на максимальное значение счетчика(2^8 или 256; для 16-разрядного счетчика будет 2^16 или 0xFFFF).
n = t * Fclk / 2^8.
Так получили n = 17.28. Из таблицы делителей (см. datasheet) берем ближайшее значение делителя. В данном случае n = 64. Считаем
t = 256 * n / Fclk. Полученное время долно быть больше требуемого, иначе придется делать програмные счетчики в обработке прерывания для получения требуемого периода.
ps1x
Цитата(CSB @ May 8 2006, 00:55) *
Забыл добавить как получить делитель:
берем требуемое время срабатывания(600 мкс), умножаем на входную частоту(7.3728 МГц) и делим на максимальное значение счетчика(2^8 или 256; для 16-разрядного счетчика будет 2^16 или 0xFFFF).
n = t * Fclk / 2^8.
Так получили n = 17.28. Из таблицы делителей (см. datasheet) берем ближайшее значение делителя. В данном случае n = 64. Считаем
t = 256 * n / Fclk. Полученное время долно быть больше требуемого, иначе придется делать програмные счетчики в обработке прерывания для получения требуемого периода.

Тактовая частота, по умолчанию с завода 1 Мгц вроде glare.gif .

Хмм... А как целиком выглядит формула ну вроде: TCNT1=x/y+z

И еще, чтобы поменять частоту внутреннего генератора надо править фузы, но я боюсь потому что уже привел таким образом в нерабочее состояние один камешек. В CVAVR там галочки соответствуют 0?
Если знаете, скажите как выставить 4 и 8 Мгц...
Заранее спасибо smile.gif
vet
>>В CVAVR там галочки соответствуют 0?
Да.
Про частоты есть в даташите.
ps1x
Цитата(vet @ May 8 2006, 01:35) *
>>В CVAVR там галочки соответствуют 0?
Да.
Про частоты есть в даташите.

Кроме группы CKSEL больше изменять ничего не надо?

Все еще интересно насчет таймера...

Кстати, точно секунду получить не получится? Еще гдето валялся кварц от китайских часов, может его приспособить?
ps1x
Цитата([banned] @ May 8 2006, 02:12) *
Цитата(ps1x @ May 8 2006, 00:09) *

Как расчитать значения таймеров?


использовать мастер компилятора как в задачах 1 3 и 3new


-> http://electronix.ru/redirect.php?http://[banned]/avrpic06.htm


Непомогло. smile3046.gif
Мигает с любой частотой, но только не ровно секунда...
Кстати CVAVR в визарде показывает огромною кучу частот для таймера 2 начиная от 0,061 Кгц и каждая следующая в два раза выше, но отсчитать ровно секунду не выходит.

0,061 кГц = 6,1 Гц ну никак не 6 Гц ровно wacko.gif
haker_fox
Цитата(ps1x @ May 8 2006, 05:09) *
Как расчитать значения таймеров? Есть программка, но она не подходит для Tiny26 ибо нету у него 16 битного таймера. Не могли бы вы написать пример для расчета частоты 1 Гц?


Я делал так.
1. Тактовая частота МК X гц.
2. Используем Y-разрядный тамер.
3. Нужно получить период срабатываения Z гц.

Для примера:
X = 16 000 000;
Y = 8 (8 разрядный таймер);
Z = 1000.

(X/Z)/2^Y

(16 000 000/1000)/256=62.5

После этого в обработчике по переполнению таймера мы в регистр счеткика (например TCNT0) записываем 256 - 63 (округленное 62.5). Перед разрешением перрываний от таймера, также инициализируем TCNTx значением 193. При этом счетчик будет переполняться каждые 0,001 с или с частотой 100 Гц.




Цитата(ps1x @ May 8 2006, 08:09) *
Цитата([banned] @ May 8 2006, 02:12) *

Цитата(ps1x @ May 8 2006, 00:09) *

Как расчитать значения таймеров?


использовать мастер компилятора как в задачах 1 3 и 3new


-> http://electronix.ru/redirect.php?http://[banned]/avrpic06.htm


Непомогло. smile3046.gif
Мигает с любой частотой, но только не ровно секунда...
Кстати CVAVR в визарде показывает огромною кучу частот для таймера 2 начиная от 0,061 Кгц и каждая следующая в два раза выше, но отсчитать ровно секунду не выходит.

0,061 кГц = 6,1 Гц ну никак не 6 Гц ровно wacko.gif


Чтобы получить период ровно в 1 секунду, нужно просто подобрать соответствующую частоту тактирования МК.

Wizard'ом пользоваться не рекомендую, это не способствует пониманию происходящего, особенно на начальном этапе освоения программирования.
ps1x
Цитата(haker_fox @ May 8 2006, 12:17) *
Цитата(ps1x @ May 8 2006, 05:09) *

Как расчитать значения таймеров? Есть программка, но она не подходит для Tiny26 ибо нету у него 16 битного таймера. Не могли бы вы написать пример для расчета частоты 1 Гц?


Я делал так.
1. Тактовая частота МК X гц.
2. Используем Y-разрядный тамер.
3. Нужно получить период срабатываения Z гц.

Для примера:
X = 16 000 000;
Y = 8 (8 разрядный таймер);
Z = 1000.

(X/Z)/2^Y

(16 000 000/1000)/256=62.5

После этого в обработчике по переполнению таймера мы в регистр счеткика (например TCNT0) записываем 256 - 63 (округленное 62.5). Перед разрешением перрываний от таймера, также инициализируем TCNTx значением 193. При этом счетчик будет переполняться каждые 0,001 с или с частотой 100 Гц.




Цитата(ps1x @ May 8 2006, 08:09) *
Цитата([banned] @ May 8 2006, 02:12) *

Цитата(ps1x @ May 8 2006, 00:09) *

Как расчитать значения таймеров?


использовать мастер компилятора как в задачах 1 3 и 3new


-> http://electronix.ru/redirect.php?http://[banned]/avrpic06.htm


Непомогло. smile3046.gif
Мигает с любой частотой, но только не ровно секунда...
Кстати CVAVR в визарде показывает огромною кучу частот для таймера 2 начиная от 0,061 Кгц и каждая следующая в два раза выше, но отсчитать ровно секунду не выходит.

0,061 кГц = 6,1 Гц ну никак не 6 Гц ровно wacko.gif


Чтобы получить период ровно в 1 секунду, нужно просто подобрать соответствующую частоту тактирования МК.

Wizard'ом пользоваться не рекомендую, это не способствует пониманию происходящего, особенно на начальном этапе освоения программирования.



Таким образом, в моем случае имеем:

Частота 1/2/4/8 Мгц
В Тини26 есть только 8 битный таймер
Требуется 1 Гц или 100 гц (чтобы отсчитывать каждую секунду)

т.е.
(1 000 000/1)/256=3906,25 blink.gif
(8 000 000/1)/256=31250 blink.gif blink.gif blink.gif
либо
(1 000 000/100)/256=39,0625 (более реально)
(8 000 000/100)/256=312,5 (я так понял не подходит ибо не влезает в 0хFF)

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